2017年03月12日

ESP32 & BLYNK

IMG_1291.JPG

時間がたつのは早いものです。
ESP-WROOM2のTELECマークがついたものが販売され試してみたのは一昨年の夏ごろでした。
http://blog.toshnet.com/article/160910167.html
このモジュールの特徴の一つは、外付けでマイコンを使用することなく内蔵マイコンにプログラムすることで単体でIoT機能を実現できることです。
この開発もArduinoIDKでできることも、当局のような素人プログラマーには魅力的な機能の一つだと思います。
トラ技3月号はIoT特集でほとんどの記事にこのモジュール(ESP-WROOM2)が使用されていました。

さて本題ですが、今回は最近日本でも技適認証されたものが販売開始された新モデルのESP-WROOM-32です。
ESP-WROOM2との大きな違いは、ブルーツース機能も搭載されていることと、外部I/Oが増えていることです。
ArduinoIDKも対応しています。
2月初めに秋月で販売が開始され、当局も興味本位で購入していました。
サイト検索では、この1.27mmピッチのモジュールに直接はんだ付けして試した記事が散見されるようになっています。
2月末からはaitendoで変換基板が販売開始されました。秋月でもそのうち販売されるのでしょうが、aitendoは今のところ変換基板のみですし、ちょっと変則的です。
当局は先週この変換基板を購入し、早速試してみました。
購入時点での変換基板のバージョンはCまで進んでいました。面白いのは、A、B、Cともに売っているのです。
aitendoらしいな?!と思いました。
で、購入したのは3.3Vのパターンが太く設計されているBバージョンです。バージョンによる違いはこれ以外知りません。

最初はブレッドボードで始めたのですが、結局蛇の目基板に組みました。
その理由は、プログラムの書き込み時は、書き込みモードに設定する必要があり、またプログラム終了し、動作を開始させるのに再度リセットボタンを押さなければならず、頻繁にスイッチを押すためブレッドボードだとスイッチが安定しないだろうと思ったからです。
(評価用のボードにはこの辺りを自動的にってくれる回路が搭載されているようです?)

書き込みモードに入るには、IO_0ピンをGNDにしたままリセットをかけます。
(0ピンをGNDに落とし、リセットをして、リセットを解除して、0ピンをGNDから離す:H)
この状態で書き込まれるのを待ちます。
プログラム書き込み終了後動作を開始させるには、再度リセットします。
(0ピンがHの状態で、リセットをかける)

プログラムの動作確認用に8桁2行のI2CLCDも搭載しました。
センサーとしては、2年前に購入して使わずじまいになっていたBME280をI2Cモードで使用しました。
このセンサーは温湿度だけでなく大気圧も測れるもので興味本位で購入していたものです。

プログラムは、ArduinoIDKの最新版(1.8.*)を使用しました。
まず、センサーの値をLCDに表示させるところから始め、次にWifi機能を取り込みました。
(今回はブルーツースは実験していません)
Wifiに接続した後の相手機器としてスマホを使用し、今回もアプリにBLYNKを使用しました。
このアプリは優れもので、スマホアプリの作り方を全く知らなくても感覚的にセンサーデータをグラフィカルに表示できます。
新しいモジュールが動くのかどうか心配だったのですが、最新版のアプリですでにこのモジュールに対応しておりESP32という形で選択できました。

IMG_0029.JPG

無事動作が確認でき、スマホで表示できている状況が下の写真です。
右下のボタンは、基板側につけたLチカ用のLEDをON/OFFするものです。
このボタンの操作でLEDがON/OFFすれば、回線がつながって動いていることが確認できます。

image.JPG

プログラムは、動作を確認する最小限のものを作りました。
データ更新の頻度や、ディープスリープの活用による電池駆動など実用的プログラムとしては組み込まなければならない機能は多くありますが、目標とする最終形があるわけでもなく、動作確認が主目的ですので、とりあえずここで終わりです。
トラ技あたりでこのモジュールを取り上げてくれれば、実用的なものを作る参考になると思うのですが。
今後に期待したいと思います。

プログラムは、ライブラリの組み合わせですが、前回同様、ご参考になればということでソースを掲載しておきます。

/***************************************************************************
温度 湿度 気圧 測定表示転送
***************************************************************************/
#include <WiFi.h>
#include <WiFiClient.h>
#include <BlynkSimpleEsp32.h>

// You should get Auth Token in the Blynk App.
// Go to the Project Settings (nut icon).

char auth[] = "dc447e***************11d26cfd04";

// Your WiFi credentials.
// Set password to "" for open networks.

char ssid[] = "H**********-bg";
char pass[] = "x**********2";


#include <Wire.h>
#include "cactus_io_BME280_I2C.h"
#include <ST7032.h>

#define SCL_PIN 22
#define SDA_PIN 21

// Create the BME280 object
BME280_I2C bme; // I2C using default 0x77
//BME280_I2C bme(0x76); // I2C using address 0x76

ST7032 lcd;

void setup() {

Blynk.begin(auth, ssid, pass);

if (!bme.begin()) {
//Serial.println("Could not find a valid BME280 sensor, check wiring!");
lcd.print("BMEerror");
while (1);
}

bme.setTempCal(-3.5); //温度補正

// set up the LCD's number of columns and rows:
lcd.begin(8, 2);
lcd.setContrast(30);

}

void loop() {

Blynk.run();

bme.readSensor();

int Temp = bme.getTemperature_C();
int Humid = bme.getHumidity();
int Press = bme.getPressure_MB();
Blynk.virtualWrite(V0, Temp);
Blynk.virtualWrite(V1, Humid);
Blynk.virtualWrite(V2, Press);

lcd.setCursor(0,0);
lcd.print("Tem.");lcd.print(Temp);lcd.print(" C");

lcd.setCursor(0,1);
lcd.print("Hum.");lcd.print(Humid);lcd.print(" % ");

}


※#include 文の<は掲載上全角としています。


posted by ja6irk at 11:11| Comment(4) | TrackBack(0) | AVR&Arduino

2015年08月09日

ESP-WROOM-02 & Blynk

技適を取得したWiFiモジュールは先日紹介しましたが、これが結構人気のようで、aitendoだけでなく秋月でも販売が開始されたようです。
最初に販売されたショップよりも安く販売され(aitendo¥580、秋月¥550)今日の時点では、秋月のショップでは既に売り切れでした。一方、aitendoでは秋月対抗なのか、レジのところで¥500で売っていました。こちらは在庫が沢山あったようです。
秋月での型名(正式型名)は、ESP-WROOM-02(以前同じ型名で技適未取得のものが他で売られていたので要注意)です。
問題は、モジュールのピッチ変換でaitendoでは基板だけ売られています。AタイプとBタイプがあり、ブレッドボードではAタイプが使い安いのですが、今日の時点で売り切れでした。Bタイプは以前からあるESP8266と同じ配列なんでしょう、ブレッドボードでは使いにくく在庫がありました。

DSC01367.jpg

 さて本題です。温湿度センサーからのデータ取り込みWEBでの表示については参考にさせていただいたサイトオーナーashiyuさんからの支援で何とか使えるようになりました。
 自宅内ではこれでもいいのですが、最近はIoTという言葉とともにデータを外部のクラウドサーバにおいて、iPhoneやAndroid等の端末でどこからでもデータを見れたり逆に制御をしたりすることがはやっているようです。
実験用に無料で提供しているところもいくつか見られます。また、端末側のグラフィカルな表示やボタンなども簡単にできるアプリも提供されています。
今回は、その中で「Blynk」というものを使ってみました。

http://www.blynk.cc/
https://itunes.apple.com/us/app/blynk-control-arduino-raspberry/id808760481?ls=1&mt=8

参考になるサイトも紹介されており、端末側のアプリもマニュアル無しでもとりあえず作れました。

DSC01366.jpg

写真のような情報を外出先から見ることができます。On/Offボタンなども作れるので、外からエアコンなどのOn/Offとか、植物の水遣りとか色々応用が考えられているようです。

以下、このWiFiモジュールに書き込んだプログラムです。
GPIO13に温湿度センサー、GPIO12にWifi接続確認用のLEDを接続しています。
殆どがサイトで紹介されているプログラムでオリジナルは殆どありませんが、実験されるかの参考になればと思って掲載しました。
※実験用でごみプログラムもありますが、それらは全てコメント処理しています。

/**************************************************************
* Blynk is a platform with iOS and Android apps to control
* Arduino, Raspberry Pi and the likes over the Internet.
* You can easily build graphic interfaces for all your
* projects by simply dragging and dropping widgets.
*
* Downloads, docs, tutorials: http://www.blynk.cc
* Blynk community: http://community.blynk.cc
* Social networks: http://www.fb.com/blynkapp
* http://twitter.com/blynk_app
*
* Blynk library is licensed under MIT license
* This example code is in public domain.
*
**************************************************************
* This example runs directly on ESP8266 chip.
*
* You need to install this for ESP8266 development:
* https://github.com/esp8266/Arduino
*
* Change WiFi ssid, pass, and Blynk auth token to run :)
*
**************************************************************/
#define BLYNK_PRINT Serial // Comment this out to disable prints and save space
#include
#include
#include
#define DHTTYPE DHT22
#define DHTPIN 13

DHT dht(DHTPIN, DHTTYPE,11);
float humidity, temp_f; // Values read from sensor

// You should get Auth Token in the Blynk App.
// Go to the Project Settings (nut icon).
char auth[] = "1f5088a7bda5*******1e5ca97d9e8";

void setup()
{
Serial.begin(115200);
Blynk.begin(auth, "****", "****");
dht.begin(); // initialize temperature sensor
pinMode(12, OUTPUT);
// digitalWrite(12, HIGH );

}

BLYNK_READ(1)
{
temp_f = dht.readTemperature(false);// Read temperature as Celsius
int value=temp_f*10;
String str;
char result[5];
result[0]=(value/100)+'0';
result[1]=((value/10)%10)+'0';
result[2]='.';
result[3]=(value%10)+'0';
result[4]='\0';
str +=result;
str +="℃";
//char buf[str.length()+1];
char buf[8];
str.toCharArray(buf,sizeof(buf));
Blynk.virtualWrite(1,buf);
}
BLYNK_READ(2)
{
humidity = dht.readHumidity(); // Read humidity (percent)
int value=humidity*10;
String str;
char result[5];
result[0]=(value/100)+'0';
result[1]=((value/10)%10)+'0';
result[2]='.';
result[3]=(value%10)+'0';
result[4]='\0';
str +=result;
str +="%";
//char buf[str.length()+1];
char buf[8];
str.toCharArray(buf,sizeof(buf));
Blynk.virtualWrite(2,buf);
}

void loop()
{
Blynk.run();

if (WiFi.status() != WL_CONNECTED) {
// コネクション確立済み以外のステータスなので
// 無線LAN接続NG LED消灯
digitalWrite(12, LOW);
} else {
//コネクションOKなので、点灯
digitalWrite(12, HIGH );
}
// delay(1000);

// delay(1000000);
/*
//1:μ秒での復帰までのタイマー時間設定 2:復帰するきっかけの設定(モード設定)
ESP.deepSleep(30 * 1000 * 1000 , WAKE_RF_DEFAULT);

//deepsleepモード移行までのダミー命令
delay(1000);
*/

}


posted by ja6irk at 19:17| Comment(2) | TrackBack(0) | AVR&Arduino

2015年07月12日

Arduino用Wifi

DSC01256.jpg

またしても、Arduinoネタです。
Arduino用のWifi基板(シールド)は非常に高くWifiを実験するにはコスト的に敷居の高いものとなっていました。一方で海外ではESP8266というICを使用した基板が非常に廉価で販売されており、使用例も沢山見つけることができています。
しかし、これらは技適を取得していないため国内での使用は問題がありました。
今年に入って技適の審査中である情報が散見されるようになっていましたが、ついに発売になり、当局も早速入手し実験してみました。
この基板はCEREVOというところが販売開始したもので、販売開始は7月7日で初日に注文し入手しました。
基板そのものはまだ在庫があるようですが、変換基板付きはすでに品切れのようです。
検索するとアマゾンでも、いくつか販売しているところが見つかり価格も殆ど同じくらいです。

入手して色々検索で調べていて、驚きました。
なんと、このESP8266はArduinoIDEで直接プログラム開発ができつまり、いわゆるArduino基板(UNOやNANOなど)は必要ありません。
Prominiやaitendoのあちゃんでいいのと同じように書込みにUSBシリアル変換が必要なのと、一般的に使用しないRTSの信号が必要になるのが課題ではありますが。

DSC01257.jpg

DSC01259.jpg

入手した基板の半田付けも終わったので、書き込み用のUSBシリアル変換基板の改造を行いました。
Prominiやあちゃんでいいのは、先日入手していた変換基板で問題はなかったのですが、RTS信号が必要なためICの端子から直接取り出し、もともと端子として出力されていたCTS端子のパターンをカットし接続しました。
書込みだけだとこれでいいのですが、デバッグするのにシリアルを使用する場合は、このRTS信号とDTR信号を切り離す必要があり、実際にやってみると確かにこの2つの線をはずさないとシリアル通信ができません。
いちいちつけたりはずしたりも不便なのでスイッチ基板を追加しました。

DSC01263.jpg

参考にしたのは、以下のサイトです。
http://tech-blog.cerevo.com/archives/859/
まずこちらで、自宅のWifiと接続できることを確認しました。

http://ashiyu.cocolog-nifty.com/blog/2015/07/esp8266exarduio.html
次にこちらで、ArduinoIDEのスケッチサンプルでWEBサーバー機能を確認しました。
ちゃんと自宅のWifiネットワーク二接続され、WEBサーバーとして動いています。

DSC01262.jpg

最終的には、電池駆動で温湿度データをWifiで送れるようにしたいと思って始めたのですが、温湿度データをシリアルで出力しデータとしてはセンサーとして動作していることは確認できたのですが、WEBサーバーのデータとして送り込むことができていません。この部分が自分で作成しているところなので難儀しています。
今日は時間切れになりました。
しばらく掛かりそうですが、ここがうまく行けばいろんなアプリケーションが作れそうです。
気長にやって行きたいと思っています。



posted by ja6irk at 19:17| Comment(7) | TrackBack(0) | AVR&Arduino

2015年07月05日

あちゃんでいいの

DSC01243.jpg

昨日、秋葉原での懇親会がありその前にaitendoに寄ってきました。
以前より売り切れになっていたArduino簡易版「あちゃんでいいの」が大量に入荷していたので購入してきました。
最初に売っていたのはどうも試作版のようで、色々変更になっています。
まずリセットボタンが追加になったのと、どうもDTRからリセット端子に行く信号をコンデンサでカットされていなかったようで、コンデンサが追加になっているようです。
これで、USBシリアル変換との接続で安心して使えるようになったのだと思います(推測ですが)
この基板で残念なのはプログラムの書き込みに使用するUSBシリアル変換のPinの並びと、「あちゃんでいいの」のPinの並びが違うことです。
aitendoの写真でもUSB-シリアル変換 [USB2RS-340G]が使われているようですが、DTRの信号が反対側になります。
このUSB-シリアル変換 [USB2RS-340G]は現在在庫切れのようで新製品としてUSB-TTL変換 [U2TL340-6P]が販売されていますが、これもUSB-シリアル変換 [USB2RS-340G]と同じPin配列ですので接続は注意しなければいけません。
前のモデルは500円で、新製品はリセットボタンと5V-3.3V切り替えスイッチが省かれているのに590円と値上げになっています。(この話題と関係ありませんが)
これらの変換基板と「あちゃんでいいの」との接続は下記の写真のようになります。

DSC01252.jpg

先週、当局が自作した「あちゃんでいいのもどき、XBYバージョン」はPin接続はDTRを反対側に入れ替えなくてもいいようにパターン設計しています。
俗に売られている、Arduino Pro、ProminiのPin配置も上記USBシリアル変換のPin配列と同じなので、何で同じにしなかったのかな?と疑問に思っています。
下記は「あちゃんでいいの」と「あちゃんでいいのもどき、XBYバージョン」を比較した写真です。

DSC01250.jpg

それから、あちゃんでいいのの製作で接続するLEDは基板上13番端子がLOWの時点灯する設計なっており、UNOなどとは論理が逆となっているため、パターンカットと接続を行い論理を反転し13番端子がHIGHの時点灯するように改造してあります。

いずれにせよ「あちゃんでいいの」¥166とUNOブートローダ書込み済マイコン¥350とUSBシリアル変換¥590の合計¥790で ArduinoUNOとほぼ同じ様なことが楽しめるようになり、コスト的な壁はものすごく低くなったのではないかと思います。(UNO用のシールドはそのまま接続できなくて配線しなければならないのは面倒ですが)
5月の連休から突然はじめたArduinoですが、これまでのBASCOM-AVRで当局が作れなかったものも作れるライブラリが世の中に沢山存在し、不得意なC言語をベースにしたツールではありますが、このツールの使いやすさが不得意部分を補佐してくれるので、非常に便利なAVR用プログラム開発ツールであると実感しました。
下記は、これまでに入手した、また自作したArduino基板群です。

DSC01254.jpg

左から、Arduino UNO、NANO、Promini、あちゃんでいいの、あちゃんでいいのもどきXBYバージョン旧、新 です。
posted by ja6irk at 12:22| Comment(2) | TrackBack(0) | AVR&Arduino

2015年06月14日

ISPでArduinoを楽しむY

DSC01236.jpg

先週は、aitendoで売り切れの「あちゃんでいいの」基板のもどき互換基板を作ったが、よく考えたらAVRマイコン幅で作れることに気づき作り直してみました。
また、先週の基板はUSB-232C変換基板との接続端子を「あちゃんでいいの」とおなじに順序にしたのですが、これに使用するUSB-232C変換基板の出力と同じ順序にすれば、書き込み用接続線を入れ子にする必要もなくストレートに接続できるためここのパターンも変更しました。
ICソケットに使用したのはリードの長いラッピング用の丸ピンソケットです。実は、これが意外と高く、また、最近はラッピングする人もいないのか入手困難でしたが、なんとか見つけて使ってみました。価格的には、ATmega328の値段より高くなっています(¥300)。

DSC01239.jpg

でもスマートにできたからOKとしました。ブレッドボードでの開発用ですから。
お決まりのLEDチカチカを書き込んで動作が確認できました。

DSC01240.jpg

ソフトの方は、ATmega168や328だけでなく、ATtiny2313や古いATmega8、ATmega48、88、8PinのATtiny45,13などを使えるように色々テストしていました。
サイト検索で実施例が沢山見つかるのですが、殆どが古いArduinoIDEのバージョン用(1.0.*)で最新の1.6.*やARMも対応した1.7.*ではなかなかうまく動いてくれません。
1.6.*でAttiny45を動かしているサイトを見つけ、そのファイルを参考にATtiny2313、4313やATmega48、8等はなんとか書き込みとLEDチカチカの動作まで確認ができました。
しかし、それぞれのAVRがもっている機能がどこまでプログラムできるのかは???の状態です。
実際に使ってみて確認するしかないかと思っています。

posted by ja6irk at 19:19| Comment(0) | TrackBack(0) | AVR&Arduino

2015年06月07日

ISPでArduinoを楽しむ X

写真 4.JPG

引き続きArduinoの使いこなしに挑戦しています。
これまでのBASCOM-AVRと違って多くのライブラリがサイト検索で見つけられるので、これまでやれなかったことを中心に試しています。
今回はISPではなく、中華製Arduino互換基板を使って、ブレッドボードで比較的実用的なものを実験してみました。
それが、上記写真の温湿度計です。これは単に温湿度を測ってLCDに表示するだけでなく、データをSDカードに保存し、更にWEBサーバーとしてWiFiで家庭内LAN上で他のPCやスマホから見れるようにしたものです。
これらが、ソフト作りで悩むことなく作れてしまう環境に感動しています。
当局の場合BASCOM-AVRだったら、WiFiやWEBサーバー等の仕組みを理解して自分でソフト作りが必要になって(探せば事例はあるのでしょうが)、いつまでたっても実現できなかったでしょう!
それぞれの機能ライブラリを簡単に組み合わせて高機能を実現できるのが、C,C++をベースにした構造化プログラミングのメリットなんだな!と今更ながら喜んでいます。
今回は、CPUに中華製Arduino Nano、温湿度センサーに秋月で入手していたDHT22、LCDも同じく秋月で入手していたAQM0802(8*2 I2C制御)、SDとWifiは東芝製FlashAirを使用しました。この東芝製FlashAirは、デジカメの写真データWifi伝送で有名ですが、WEBサーバー機能を搭載しており簡単に書き込んだデータのホームページ化が可能です。
本当は、家庭内消費電力の測定と表示が目的なのですが、まずは温湿度測定からはじめました。
とりあえずうまくいって良かったです。

その後、なんとなくaitendoのサイトを見ていたら、びんぼうでいいのに続き、あちゃんでいいの というArduinoシンプル基板が売られているのを見つけました。CPU別で166円です。

http://www.aitendo.com/product/11541

しかし、残念ながら在庫切れです。同じようなものを考えたりもしていたのですが、中華製の基板をそれなりに購入していたのであえて作るまでも無いと思っていました。
しかし、同コンセプトの基板を見つけ、在庫切れとなると何故か欲しくなり、片面基板しか作れませんが作ってみました。流石に小さく作るとなると汎用部品では無理があり、CR部品はチップ部品を使って作りました。
リセットボタンは付いていませんが、aitendoよりちょっとだけ小さく作れたのではないかと思っています。

写真 2.JPG

写真 1.JPG

Arduino Unoのブートローダーを書き込んだAVRを先日作っていましたので早速使ってみて、ちゃんとLEDチカチカのソフトの書き込みと動作が確認できました。

写真 3.JPG

ISP方式と比較して、USB I/F(今回は外付けUSB-232変換ボード対応)ブートローダー方式のメリットは、ArduinoIDEのシリアル機能を使って、デバッグが簡単に行えることです。
これでまた、Arduino近づいた気がします。
posted by ja6irk at 22:22| Comment(4) | TrackBack(0) | AVR&Arduino

2015年05月17日

ISPでArduinoを楽しむ W

OLED&ENC.JPG

 WeekDayは、なかなか時間もとれず、注文していた中華製Arduinoの基板もやっと受け取れました。
送ってきた基板は、写真のように1個ずつ静電袋に入れられておりしっかりした梱包でした。注文先はみな違ったのですが、どこも同じような感じです。

写真.JPG

 それぞれの中身の写真も撮ってみました。

UNO.jpg.JPG
UNO
nano.jpg.JPG
nano
mini.jpg.JPG
Pro mini
min2.jpg.JPG
Pro miniは書き込みにUSB-232C変換ボードが必要

 Arduinoでのプログラムは、以前にBASCOM−AVRで作っていたロ−タリーエンコーダーの4倍カウントを移植してみました。書式は、C方式に書き換えましたが、プログラムそのものはそのままで難なく動きました。
 ロータリーエンコーダーも中華製の400パルスのものに変更しましたが、さすがに4倍速(1600パルス)だと1mSのタイマー割り込みでは取りこぼしが多く、100uS割り込みに変更し、うまく動いています。



 表示デバイスも20*2のOLEDのI2C制御を試してみました。こちらも難なくうまく動いています。
 今回の実験で、多くの方々が作られたArduinoのソフトウェア資産を活用させていただければ、新しい周辺デバイスへの対応が簡単に行えることがわかりました。開発ソフトウェアは無料ですし、IPS対応のライターを持っていれば、Arduino専用ボードを買う必要もないし、なかなか良さそうです。
 ちなみに、今回仕入れた中華製Arduino専用ボードの価格を、中華製、aitendo、秋月、千石、マルツで比較してみました。中華製は注文して10日間ほど掛かるのと、リスクがゼロではありませんが結果は、ローカルのOMさんの言われるとおり、中華製の圧倒的パフォーマンスです。当局の場合、これまでそこそこの種類のものを購入しましたが、届かないとか、故障していたことはありませんでした。

Arduino価格比較.jpg

 なお、この比較は、国内販売されている店舗さんを否定しているわけではありませんし、中華製を買いなさいと言っているわけではありませんので念のため!
 当局も、いずれのお店も頻繁に利用させていただいております。
posted by ja6irk at 17:27| Comment(2) | TrackBack(0) | AVR&Arduino

2015年05月06日

ISPでArduinoを楽しむ!V

DSC01125.jpg

普通なら、Arduinoの専用ボードを入手して色々遊んでから、ISP書き込みになるのでしょうが、今回はISP書き込みができることを知って、それを確かめることからはじめました。
今回確認できたことは、Arduinoの沢山あるライブラリを活用するのに専用ボードは必要ないということです。
つまり、普通に売っているATMELのAVRマイコンである、ATmega168やATmega328をそのまま組み込みマイコンとして使用して、基板に乗せたままISPプログラムできるということです。
これまで、BASCOM-AVRで使用してきたプログラムライターである、USBaspやAVRISP、AVRISPmkU等があれば、今までのBASCOM-AVRと同じようにプログラムを書き込むことができるのです。
勿論、ソフトウェアはBASICではなくCをベースにしたものになりますが、ArduinoIDEという開発ソフトは素人にもとっつきやすくできています。そして、驚きは、大概の制御ライブラリはネット上にあふれダウンロードして使うことができます。
当局は、Cが苦手でこれまで実用ソフトを作ったことがありませんでしたが、実質1日でロータリーエンコーダーで回転パルスを入力し、DDSの周波数を可変して、その周波数をLCDに表示するというところまでを作ることができました。
これは、DDS制御や、LCDの制御のライブラリがあったからです。DDSの制御は殆ど4行くらいのプログラムで、必要な周波数の10進数(たとえば7000000Hz)を代入するだけで出力が出てきます。これまでのBASICよりはるかに楽です。LCDも同様です。
更にすばらしいのは、最近流行のI2C制御のLCDの制御や、TFT液晶の制御ライブラリもあります。
DDSの次のオシレータとしてはやりつつある、シリコンラボ社のSi570やSi5351の制御ライブラリもあります。
Si5351は8KHzから150MHzまで3つの独立した周波数の出力を出すことができるICです。しかし、レジスタは100以上もあり、その設定や、周波数の計算は複雑なのですが、ライブラリを使えばいとも簡単に出力を出すことができました。このICは機能が多く使いこなすにはそれなりに勉強が必要ですが、とりあえずVFOとしてDDSの代わりに使う程度なら出来上がってしまいました。

DSC01112.jpg
Si5351ボード
DSC01111.jpg
先日のDDSの変わりにSi5351ボードを駆動したブレッドボード

後先が、逆になってしまったのですが、専用ボードも欲しくなり先週のQRP懇親会で秋葉原に行った時、aitendoのびんぼうでいいのという500円の基板と250円の部品セットと380円の書き込み済マイコンを買ってきました。

DSC01120.jpg

ついでに、999円のカラーTFT液晶も買ってきました。
それを組み立て、サンプルソフトを動かしたのが最初の写真です。一部、表示を書き換えてあります。どこをどう書き換えればどのように表示されるのかは、実際にやってみれば簡単にわかりました。



ポート数は食いますが、自作のTRXでカラーのドットマトリクス表示ができそうです。
自作の楽しみもまた増えるのではないかと期待しています。
ということで、何も目的を決めていなかったのですが突然思いつきで始めた今年のGWの実験は終わりになりました。また、あすから本業に戻ります。

posted by ja6irk at 22:18| Comment(2) | TrackBack(0) | AVR&Arduino

2015年05月02日

ISPでArduinoを楽しむ! U

連休で時間があると一気に進みます。
とりあえず、LCD表示、タイマー割り込みによるロータリーエンコーダーのカウント取り込み、中華製DDS(AD9850)の制御による出力周波数可変まで出来上がりました。

DSC01108.jpg

プログラムの書式など、今までのBASICとは勝手が違い、書式エラーを沢山出しながらでしたが、なんとなく雰囲気がつかめて来ました。
LCD表示、タイマー割り込み、DDS(AD9850)については、サイト検索でライブラリーが見つかり、簡単に実現することができました。特に、DDSのライブラリは中華製DDSの基準クロック125MHzをベースに作ってあり、周波数データとして必要な周波数を10進数で記述するだけで(ex.7000000で7MHzとなる)簡単に出力することができます。途中の計算プログラムを考える必要がありません。

DSC01110.jpg

ローカルのOMさんが言われていた、ライブラリのコピペで簡単にできますよ!が、確かにそうだな〜と言った印象です。
ただ、ロータリーエンコーダーの取り込みのプログラムは自分で作りました。ライブラリは沢山見つかるのですが、殆どが外部割込みによるライブラリです。
当局の経験的には、外部割込みでエンコーダーを使用すると殆どの仕事が割り込み処理になってしまいほかの仕事に影響が出るのと、チャタリングの処理で結構苦労します。(ライブラリにはチャタの処理つきが多いですが)
これまでは、タイマー割り込みでうまく動いていたので今回もそれで作ってみました。割り込みは1mSとしていますが、1回転20パルス程度でしたらもっと遅くても問題は出ないと思います。ただ、今までは4倍速でカウントしていたのですが、今回は4倍速は実現できていません。もう少しソフトのコマンドを勉強しないとダメです。



ライブラリは別になりますが、今回のプログラムを参考のために記載しておきます。
(goto文を多用するなどCライクではありませんがあしからず)
これだけの記述で機能が実現できているよ!という参考程度にお願いします。

/*

The circuit:
* LCD RS pin to digital B0
* LCD Enable pin to digital B1
* LCD D4 pin to digital B2
* LCD D5 pin to digital B3
* LCD D6 pin to digital B4
* LCD D7 pin to digital B5
* LCD R/W pin to ground

*/

// include the library code:
#include
#include
#include

#define enc0 A4
#define enc1 A5

#define led0 A0
#define led1 A1

int enccnt = 0;
int encold = 0;
long fcnt = 7000000;
int intcnt = 0;


// initialize the library with the numbers of the interface pins
LiquidCrystal lcd(8, 9, 10, 11, 12, 13);
EF_AD9850 AD9850(7, 6, 4, 5);// (CLK,F-UP,RST,Data)

void setup() {
// set up the LCD's number of columns and rows:
lcd.begin(16, 2);

pinMode(enc0,INPUT_PULLUP);
pinMode(enc1,INPUT_PULLUP);

pinMode(led0, OUTPUT);
pinMode(led1, OUTPUT);

MsTimer2::set(1, timer2int); // 1ms period
MsTimer2::start();

AD9850.init();
AD9850.reset();
AD9850.wr_serial(0x00, 1000000); //1000000Hz
// initialize serial communications at 115200 bps:
Serial.begin(115200);

}


void loop() {
// set the cursor to column 0, line 1
// (note: line 1 is the second row, since counting begins with 0):
lcd.setCursor(0, 0);
lcd.print("JN3XBY/1");

lcd.setCursor(9, 0);
// print the number of seconds since reset:
//lcd.print(millis() / 500);
lcd.print("Arduino");

lcd.setCursor(0, 1);
lcd.print("FREQ=");

AD9850.wr_serial(0x00,fcnt);

// lcd.setCursor(0,1);
lcd. print(fcnt);
lcd. print("Hz");

}

//*** Timer2 INT Routine***************************
void timer2int() {

//*** Encoder Count Routine ***
if (digitalRead(enc0) == LOW) {goto ret;}
if (encold == 1) {goto ret1;}
encold = 1;
if (digitalRead(enc1) == HIGH) {fcnt = fcnt + 10;}
if (digitalRead(enc1) == LOW) {fcnt = fcnt -10;}
goto ret1;
ret:
encold = 0;
ret1:
//*******************************

//*** 100mS LED ON/OFF **********
intcnt = intcnt + 1;
if (intcnt < 100){goto ret2;}
static boolean output = HIGH;
digitalWrite(led1, output);
output = !output;
intcnt = 0;
ret2:
//*******************************
;
}
//************************************************
posted by ja6irk at 11:43| Comment(4) | TrackBack(0) | AVR&Arduino

2015年05月01日

ISPでArduinoを楽しむ!

今年も早いものでもう5月です。例年だと玄関先の鈴蘭が綺麗に咲いていたのですが、昨年から東京に移り住んでいるため鈴蘭がどうなっているのか知る由もありません。
この連休はとても穏やかで、むしろ暑いくらいです。
特にやることを決めていたわけでもなかったのですが、何気なくサイトで見つけていた専用ボードを使わなくてもArduinoを使う方法を試してみることにしました。

DSC01105.jpg

もともとArduinoは当局が愛用するAVRを使用しており気にはなっていたのですが、専用ボードとなっておりTRXとか組み込み用として使うにはボードのサイズとか使いにくいな〜とか思っていました。
また使用する言語もCライクな言語で当局にはなかなかなじめないものがありました。
これまではAVRとBASCOM-BASICでなんら不自由を感じていなかったこともあります。
しかし、最近ローカルのOMさんが使い始めておられ、色々を参考アプリが沢山あって便利で簡単だよ!と強力に勧められていました。
確かにWifiアプリやカメラアプリなど自分だけではこなせない難題アプリもあるので、一層気になっていたのも事実です。
そういう状況で見つけたのが、タイトルのように専用ボードではなく、AVRの単体チップにISPで直接書き込んでArduinoを動かそうというものです。
実際は、何も難しいことはなくて、手持ちのAVR(ATmega168や328)と手持ちのライターUSBaspに、ダウンロードしたArduinoIDEに、USBasp用のドライバを組み合わのせるだけで、従来のBASCOM-AVRでやっていた時と全く同じようにAVRチップを組み込み状態(ISP)でプログラムを書き込めるようになりました。

DSC01106.jpg
ALEXPRESSで買っていた200円程度のUSBaspライターとその改造版(どちらも使えた)

これで、何千円もする専用ボードを購入する必要もありませんし、コンパクトに機器を自作することができます。
ここに至る簡単な手順を備忘録として以下に記載しました。

1.ArduinoIDEのダウンロード
 下記サイトから、自分のPCのOSにあったものをダウンロードします。
 ページが開き、すでに100万以上ダウンロードされ更に開発を加速するために寄付をお願いされます。
 試用であれば、JUST DOWNLOADで問題ないでしょう!

 http://www.arduino.cc/en/main/Software

 そしてインストールします。

2.USBasp(ISPライター)のドライバのインストール
 下記サイトからドライバをダウンロードします。

 http://sourceforge.jp/projects/sfnet_libusb-win32/

 zipファイルですので展開して、そのフォルダの中にあるbinの中の inf-wizardを起動します。
 
 inf-wizard1.jpg
 NEXTを押します。
 inf-wizard2.jpg
 USBaspを選択して、NEXTを押します。
 inf-wizard3.jpg
 NEXTを押します。
 inf-wizard4.jpg
 保存を押します。
 inf-wizard5.jpg
 Install NOWを押して完了です。

3.ArduinoIDEを立ち上げます。
 以下、LCDTESTプログラムを書いた状態から、書き込みまでの手順です。

 Arduino IDE.jpg 

 Arduino IDE1.jpg
 ツール>ボード>Arduino Nano を選択します。
 Arduino IDE2.jpg
 ツール>プロセッサ>ATmega168 を選択します。(ATmega168を使用したため)
 Arduino IDE3.jpg 
 ツール>書込装置>USBasp を選択します。
 Arduino IDE4.jpg
 ファイル>書込装置を使って書き込む を選択すると書込みが始まります。

 とりあえず、ISPでの書き込み方とLCDの表示やポートの制御はわかったのですが、タイマー割り込みとか、実用プログラムの作り方はこれからです。休み後半は用があるので、今日辺りで何処までかけるようになるかです。とりあえず頑張ってみます。

※Arduinoは、ハードの壁を低くして色々な機能を実現するというような思想で始められたと理解しております。従って、ISPで組み込みでソフトを含め物作りするというのは、この考え方に反するものなのかもしれませんが、当局は、この考え方に反論しているわけではありませんのご理解ください。
むしろ、ハードの敷居を低くして自作派が増えていることに喜ばしく思っております。
当局的には、Arduinoの成果を借りて自分としてのソフトの敷居が低くなって今までできなかったものができれば良いかな〜と思っております。


posted by ja6irk at 13:10| Comment(4) | TrackBack(0) | AVR&Arduino