エコです。
インタープリタはいってます。
単体でWebサーバー使えます。
DHCPサーバーできます。
ふつうにLANに加わることもできます。
GPIO、2本付き。
安い! 個人輸入なら 3ドル。(安心の(?)国内Amazonでは、 1,380円)
シンプルな動作なら、他にマイコンは不要です。
少し複雑な機能は、シリアルでArduinoなどとつなげて実現します。
書込みは、シリアルコンバータ経由でUSBからが便利です。
NodeMCU環境で使うのが使いやすそうです。ロシア発のIDEが進化中です。
MQTTプロトコルを使うと最強なデバイスになりそうです。
次項のテストでわかるとおり、シンプルな制御ならこの ESP-8266 1つで単独に行うことができ、コマンドを受けたり、ステータスを返したりがWi-Fi経由で可能です。
LEDをON-OFFする程度なら1.7k byte ほどのプログラムです。64k byte のユーザーエリアが使えますので、かなり余裕があります。
PC、スマホから操作した時の反応は、タイムラグを感じません(LAN内)。
Wi-Fi接続の確立が確実にできるということがわかったので、 インターネットを介しての接続はどうなるか、試して行きたいと考えています。(2015/05/20)
ローカルでMQTT Brokerを設置し、MQTTプロトコルで操作できるようになりました。
(2015/05/23)
ESP-8266 -01 5個 で USD14.71 JPY1,751 (paypal=1,816円 ebay 2015/02/09 注文)
ただし、この機種は、技適マークを取得していないので実際に電波を発出すると場合によっては電波法上、面倒が生じるかもしれません。
同一チップを使用した型番違いのマーク付きの機種(ESP-WROOM-02)が(Amazon、aitendoで2015年6月~、秋月でも8月~)発売されましたので、こちらがオススメです。GPIOなどがより多く引き出せるようになっていて使いやすくなっています。
もっとも、現在の日本の電波法は、技術の進展、資材の流動の盛んな昨今の時勢にあって時代遅れの感が否めません。実際、当局もそれを理解しているようで、たとえば技適マーク未取得のまま個人的に海外から持ち込まれるスマホやタブレットは増加していると思われますがこれに関して今まで大規模な取締りは行われていません(正式な例外的扱いもあります)。一方、改造して(?)出力を増強したWi-Fi機器を販売していたところよほど悪質だったか検挙に至ったという事案も過去にはありましたので、注意は必要です。
最もシンプルなテスト
試すこと:
ESP-8266 のGPIO につないだLEDの制御を、PCから行います。
制御の流れ:
書き込み時にはUSBをつなぎますが、動作時には、USBを外し、
- PCまたはスマホのブラウザ →(LAN/Wi-Fi)→ ルーター →(Wi-Fi)→ ESP-8266
という接続です。
STATIONモードです。
ルーターに対し、他のPCやタブレット、スマホと同等に接続でき、ESP-8266 内にWebサーバーを記述できるので、他機(LAN内 or インターネット経由)からアクセスできるようになります。
他に、AP(アクセスポイントモード)があり、ESP-8266 自身がDHCPサーバーになりIPを分配するモードに切り替えることもできます。
接続:
電源
USB-シリアルコンバータ(↓のセットの一部)
を準備して、
このように
つなぎます。
プログラムと動作:
こちら http://esp8266.ru/esplorer/ から、
ESPlorer をダウンロードして、実行します。
シリアルコンバーターは、PCのUSBポートに挿してポート番号を確認します。
[Open] して、モニタ欄のステータスに異常がないか確認します。
ESP-8266 のmcuのサンプルプログラムは、
https://github.com/nodemcu/nodemcu-firmware にあり、ESPlorer のコード欄にコピペして使用します。
SSIDなどを環境に合わせて修正しファイルを保存します [File] - [Save] ([好きな名前].mcu)。
PC → ESP-8266 プログラムを転送します [Save to ESP] 。
[FS info] で転送されたファイルがメモリ(ストリージエリア?)を占有しているのを確認します。
(上のキャプチャでは、1757 bytes)
ESP-8266 に転送したファイルをリネームします。[Reload]、[Reload]ボタンの下にできる[xxx.muc]ボタンの上で右クリック、[Rename File] (init.mcu)← 電源OFFからの起動時に動作するファイル名です 。
単発コマンド送信欄から、-wifi.sta.getip() を送信ます。
SSIDを指定したルーターからDHCPでIPが割り当てられているのを確認します。
そのIPアドレスにLAN内の他機のプラウザからアクセスします。
ON、OFF の操作により、LEDが点灯、消灯することを確認します。
シリアルの線を外し、ESP-8266 の電源を OFF-ON します。
他機のブラウザで上のページをリロードして、LEDの動作がUSBなしで動作すること、電源をいったんOFFしてもプログラムが保持されていることを確認します。
ローカルにMosquitto サーバーを立てる
Mosquitto は、MQTTプロトコルを扱うためのサーバーです。
Raspberry Pi に置けるほど軽量です。
ESP-8266をクラウドに接続する前段階として、ローカルで接続を試すために設置します。
Forget Me Not Design Challenge より
インストール
仮想マシンのCentOS6.6 にインストールします。
$ su -
# cd /etc/yum.repos.d
# wget http://download.opensuse.org/repositories/home:/oojah:/mqtt/CentOS_CentOS-6/home:oojah:mqtt.repo
# yum update
# yum install mosquitto
# yum install mosquitto-clients
iptables を無効にするか、ポート1883番を開きます。
疎通チェック
インストールしたマシンにSSH接続します。次の①~③の全部で3つ同時に接続画面を開きます。
① Mosquitto Broker を起動して待ち受け(サーバー)
$ sudo /usr/sbin/mosquitto
② Mosquitto Subscriber(聞き役のクライアント)
$ mosquitto_sub -d -t hello/world
「hello/world」トピック を待ちます。
③ Mosquitto Publisher (発信するクライアント)
$ mosquitto_pub -d -t hello/world -m "Hello World"
「hello/world」トピック としてメッセージが「Hello World」という電文を送信します。
→ ① に送受信があったことが表示されます
→ ② にメッセージ「Hello World」が伝わります。
左上:① Mosquitto Broker
右上:② Mosquitto Subscriber
右下:③ Mosquitto Publisher
MQTT プロトコルで動作させる
プログラムを書き込む
ESPlorerから次のソースを転送します。(以下のリストで全角スペースは、コピペの場合はTABに置換します)
-- Engeneerd by rutierut, inspired by MikeV
broker = "192.168.0.20" -- IP or hostname of MQTT broker
mqttport = 1883 -- MQTT port (default 1883)
userID = "" -- username for authentication if required
userPWD = "" -- user password if needed for security
clientID = "ESP1" -- Device ID
GPIO2 = 4 -- IO Index of GPIO2 which is connected to a device
gpio.mode(GPIO2, gpio.OUTPUT)
-- Wifi credentials
wifi.setmode(wifi.STATION)
wifi.sta.config("YOURSSID","YOURPW") ← ルーターの設定に合わせて編集する
function wifi_connect()
ip = wifi.sta.getip()
if ip ~= nil then
print('Connected, ip is:' .. ip)
tmr.stop(1)
ready = 1
else
ready = 0
end
end
function mqtt_do()
if ready == 1 then
m = mqtt.Client(clientID, 120, userID, userPWD)
m:connect( broker , mqttport, 0,
function(conn)
print("Connected to MQTT:" .. broker .. ":" .. mqttport .." as " .. clientID )
tmr.stop(0)
connected = 1;
sub_mqtt()
m:on('message', function(conn, topic, input)
print(input)
if input == "ON" then
gpio.write(GPIO2, gpio.HIGH)
elseif input == "OFF" then
gpio.write(GPIO2, gpio.LOW)
else
print('error')
end
end)
end)
end
end
function sub_mqtt()
m:subscribe('testtopic', 0, function(conn)
print('Subscribed')
end)
end
tmr.alarm(0, 1000, 1, function()
mqtt_do()
tmr.delay(1000)
end)
tmr.alarm(1, 1111, 1, function()
wifi_connect()
end)
自分(ESP1)宛てに 「testtopic」トピックで「ON」というメッセージを受け取ったら、
LEDがつながったGPIO2をHに、「OFF」を受け取ったら、GPIO2をLにするプログラムです。
http://www.esp8266.com/viewtopic.php?f=19&t=2029 より
MQTTプロトコルでコマンドを送信する
前項で立てたサーバー(①の Mosquitto Broker)を起動しておきます。
③ Mosquitto Publisher から、MQTTの電文を送ります。(このプログラムではESP-8266は、「testtopic」トピック に反応します)
$ mosquitto_pub -d -t testtopic -m "ON"
→ LEDが点灯します
$ mosquitto_pub -d -t testtopic -m "OFF"
→ LEDが消灯します
LAN内のターミナルからコマンドでMQTTプロトコルによる操作ができることがわかったので、
次のステップは、こんな方向です。
・ブラウザから操作できるようにする
・クラウド経由で(インターネット越しに)操作できるようにする
・スイッチやセンサーなど、GPIOからの入力をESP-8266から送信する
・LEDの転送モードを増やす(点滅、PWMで調光、RGBマイコン付きLEDに対応できるのか)
・SPIデバイスをコントロールすることはできるのか
Arduino と連携する (1)ESPduino
実現したいこと
ESP-8266-01 単体ではGPIOが2本しかない(内部的には存在するが、ピンが設定されていない)ので、より多様な使い方ができるよう、Arduino Nano と組み合わせてArduinoにイーサネットシールドやWi-Fiシールド を取り付けた場合と同様に使用できるようにします。
ソースコードは、未整理ですが一応動作していますので、GitHubにシェアします。
ESP8266 + Arduino により次のことを実現します。
・GPIOの拡張
・Arduino に接続したデバイスをMQTTを経由してwebから制御する
・Arduino に接続したデバイスからの入力をMQTTを経由してwebへ反映する
・Arduinoの互換品を使用して ESP8266 と合わせても数百円で済ませる
(⇔ 純正ボードとシールドの組み合わせだと数千円かかる )
ESPduino
ESP8266 を Arduino と組み合わせて使用する方法はいくつか発表されていますが、ここでは、有志 Tuan PM 氏によるESPduinoというプログラムを元にします。
ESPduino による場合は、
・ESP8266のファームの書き換えが必要
・ESP8266用のNodeMCUのコードは不要
です。
配線
・接続:PCのUSB - BTE13-009(USB-シリアル変換)- ESP8266
・ESP8266 は、3.3V で動作するので、電源と信号線のレベル変換が必要
(信号線は5Vで動作する場合もあるが、電源に5Vを接続すると壊れる)
・ESP8266 のファーム書き込み時には、IO0 ピンをGNDに落とす
・ファーム書込み時
(https://github.com/tuanpmt/espduino より)
・稼働時
レベル変換基板を使用せず、ESP8266から見て入力は抵抗の分圧で、出力はトランジスタでレベル変換をしています。
接続基板作成
ブレッドボードで配線が混み合ってきたので、ESP8266のまわりを次のことも入れてユニバーサル基板に移しました。
・レベル変換回路と3.3Vのレギュレータを含む
・①ファーム書き換え時のIO0をGNDに一時的に落とす配線と ②CH_PDをHレベルに固定にするかマイコンから制御とするかの切り替えの配線用にジャンパを追加する
・部品面から見て、右上のジャンパがIO0をGNDに落とす用、中央のジャンパがCH_PDの制御切り替え用
・IOピンは、左から5V、GND、3.3V、TX(5V)、CH_PD(5V)、RX(5V)の6本
8266のファーム変更
以下のリンクを参考にして行いました。
GitHub :
https://github.com/tuanpmt/espduino
ファームの書込み方法:
https://www.youtube.com/watch?v=mfh8WkaANC0
Brokerに登録
Bluemix IoT Foundation の場合
① APIキーの取得
Generate API Key: (キーとトークンのセットが発行される(入力なし))
API Key: (メモする)
Authentication Token: (メモする)
②デバイスの登録
Add Device(デバイスの登録)で、
Device TypeとDevice IDを入力
(Device ID として MACアドレスを設定、Device Type: MQTTDevice(タイプ名は何でもいい))
Organization ID (Bluemix IoT Foundation 使用開始時に割り当てられる)
Device Type (メモする)
Device ID (メモする)
Authentication Method token
Authentication Token: (メモする)
これらの情報は、プログラムに反映します。
Web側
Arduino + ESP8266で作成したクライアントデバイスを Webから操作したり、クラウドにデータを取り込む仕掛けを別途作ります。
HiveMQ
http://www.hivemq.com/
こちらのデモのうち「MQTT Web Browser Client」を元に作成しました。
html + Javascript でできていて、インターネット上のWebサーバーにデプロイ(設置)しました。
Brokerに接続アプリとして登録して、接続情報を反映します。
テスト
ArduinoからESP8266を経てMQTTプロトコルでBrokerに接続してPub/Subできるか確認します。
ソースコード:
https://github.com/chiba-todo/Arduino/blob/master/mqtt-min/mqtt-min.ino
・5秒毎にA0(アナログピン)を読んでbrokerにPub(送信)しながら、Subを待ち受ける
・届いたSub のメッセージが ”ON”または”OFF”なら、NanoのオンボードのLED(D13)をON-OFFする
・5秒間隔の管理は、タイマー割り込み(MsTimer2)を使用
・個別URLやユーザー名パスワードなどは、config.hとして別ファイルに(Brokerに登録した時に与えられた値は、config.h に記述していて、このファイルは公開用GitHubにアップロードしていません。)
I2Cでセンサーとキャラクタディスプレイを接続する
~ 温湿度、照度計(表示器付き)の試作 ~
上記のテストでArduinoからBrokerを経てWebへデータが届くことが確認できたので、入出力デバイスを加えて実用的な装置を製作します。Brokerへの登録などはテスト時のまま使用ます。
入出力デバイスはI2Cに揃えました。
入出力デバイスは、個別にアナログポートやデジタルポートで接続する方法も考えられますが、今回はさほど速度を要求せず、データ量が比較的少ない仕様なので、インターフェースをI2Cに揃えて配線数とプログラミングをシンプルすることを狙いました。ただ、デバイスのコストが多少高くなるのとsデバイスの選定の際に選択肢が狭くなるという懸念はあります。
次の3点をI2C接続します。
・温湿度計
・照度計
・OLED(有機発光ダイオード)キャラクタディスプレイ(16文字x2行)
I2Cの信号線は2本で、電源と合わせても4本です。1つのI2Cバスに複数のデバイスを接続して、プログラムからはアドレスを指定してアクセスします。
I2Cデバイスにも5V仕様のデバイスと3.3V仕様のデバイスがありますが、今回は、3.3Vにそろえています。Arduinoは5V仕様のため、レベル変換基板を使用しました。
接続図(構想時)
試作実機
・Fritzingの図 と試作実機でパーツの配置が異なりますが、回路的にはほぼ同じです。
・デバイスが増えたので外部電源を追加しました。
ソースコード:
https://github.com/chiba-todo/Arduino/blob/master/mqtt-oled-nosub-temp-lux-2015-09-07/mqtt-oled-nosub-temp-lux-2015-09-07.ino
5秒ごとに温度、湿度、照度を測定して、OLEDディスプレイに表示、MQTTプロトコルでBrokerへデータをPubするプログラムです。
コンパイル実行時に、「Low memory available, stability problems may occur.」という、
メモリ不足のワーニングが出ます。
実際、トピックをSubする部分が機能しないのでコメントアウトしました。
根本的には、コードや読み込むライブラリを工夫する必要があります。
Web(クラウド)側
この装置がPub(発出)したトピック(データ)は、IBM Bluemix のNode-REDで一旦受けて加工後グラフを描画するhtmlへ渡します。htmlは、WebSocketでNode-REDに接続します。
データベースに情報を蓄積する場合は、Node-REDで書き込み処理を作ります。
ブロックマップでは2台のクライアントデバイス分の処理が見えていますが、今回は上側の1台分が機能しています。
右ペインのdebug欄で定期的にデータが届くのが確認できます。
この画面では、届いたデータと加工後送り出すデータがそれぞれ確認できます。
WebSocketのおかげで、グラフが自動更新されます。(今回は5秒ごとです)
上から、気温、湿度、照度 です。
ディスプレイを取り外してバッテリーで動作中。屋外からワイヤレスでクラウドへデータを送出しています。
-
購入金額
363円
-
購入日
2015年02月09日
-
購入場所
eBay
yosyos888さん
2015/05/21
値上がりしたのでしょうか?
まぁそれでも十分安いのですがw
ちばとどさん
2015/05/21
こちらならお安いですよ。
http://www.ebay.com/itm/351223210956
わりと誠実に対応してくれる出店者が多いです。
jakeさん
2015/05/24
ちばとどさん
2015/05/24
あるある。ふふふ。
時雨堂でしたっけ。日本のサイトで練習してからBluemixに行ったほうがよかったと、ちと後悔中です。