Image

ESP8266でリモートLチカ

2015/08/23 21:56:00
越谷レイクタウンにてコワーキングスペースHaLakeを運営して半年以上が経ちまして、月額会員の方に無償でプログラミングを教えるということをやっているのですが、そんな中、ESP8266という大変興味深いモジュールを知りました。
(電子工作は小学3年生に始めたのがきっかけで、近からず遠からずの距離で携わってきた経緯があり、時代はまさにIoTだろうということで、1000円を切るWifiモジュールというのは感慨深いものがあります。)

Macでの利用を対象としています。

大まかに以下の手順で進めます。
  1. ESP8266の配線
  2. ファームウェアの変更
  3. Luaスクリプトの転送
  4. リモートLチカ!

準備するもの

  • ESP8266(今回はスイッチサイエンスさんのESP-WROOM-02ピッチ変換済みモジュール<シンプル版>を使用しました)
  • ブレッドボード、ジャンパワイヤー、ピンヘッダ、半田、半田ごて、LED、数百Ωの抵抗
  • TTL-USB変換ケーブル(TTL-232R-3V3のこちらを使用しました)
  • Arduino(3.3Vの電源供給用です。電源供給できれば不要ですが、手元にある前提で簡単なのでこちらを使っています。)
  • Arduino IDE

ESP8266の配線

まずはESP8266をピンヘッダを半田づけします。(両端が長いピンヘッダしかなかったのですが、普通は片方が短いピンヘッダです。)


以下の配線でブレッドボードとESP8266を繋いでいきます。

  • GND: ArduinoのGND
  • IO0: Ardunoの3.3V
  • EN: 10kΩでプルアップ抵抗(抵抗を挟んでArduinoの3.3Vへ)
  • RST: 10kΩでプルアップ抵抗(抵抗を挟んでArduinoの3.3Vへ)
  • 3V3: Arduinoの3.3V



TTL-USB変換ケーブルとESP8266を、ケーブルに色を頼りに繋ぎます。

・変換ケーブル黒:GND <-> GND
・変換ケーブル橙:TxD <-> RxD
・変換ケーブル黄:RxD <-> TxD

Arduinoに電源を入れ、MacとTTL-USB変換ケーブルをUSBで繋ぎます。

Arduino IDEを立ち上げ、メニューの"ツール" > "ポート"の一覧から/dev/tty.usbserial-XXXXというようなTTL-USB変換ケーブルを選び、続けてメニューの"ツール" > "シリアルモニタ"を選びます。

速度に115200を選択して、ATと打てば"OK"が返ってくることを確認できればESP8266が動作していることが確認できます。

また、AT+GMRと打つとファームウェアのバージョンが分かります。
AT version:0.23.0.0(Apr 24 2015 21:11:01)
SDK version:1.0.1
compile time:May  5 2015 14:03:58

ファームウェアの変更

Luaというプログラミング言語がありますが、そのLuaを動かすことができるファームウェア、NodeMCUに変更します。
僕自身、LuaはESP8266を扱うにあたって最近始めた言語ですが、言語仕様が小さいながら割とパワフルな事ができる面白い言語です。

NodeMCU: https://github.com/nodemcu/nodemcu-firmware

変更の前に、ESP8266が今の時点では、IO0が、3.3Vのつながっていると思いますが、これをGNDに挿しなおしておいてください。

次にソフトウェアの方ですが、ファームウェアの更新あたって、Pythonと、PythonのライブラリであるpySerialを使用します。MacであればPythonは入っていますので、Pythonのパッケージ管理pipを使って、pySerialライブラリをインストールしましょう。
# sudo pip install pyserial
ファームウェアのbinファイルは、こちらからダウンロードできます。(2015/8/23時点では、nodemcu_float_0.9.6-dev_20150704.binが最新でした。)

ファームウェアを書き込むために、esptoolを使います。下記のGithubのサイトから"Download zip"を押して、esptoolのzipファイルを取得、解答して任意のディレクトリに置いて下さい。

https://github.com/themadinventor/esptool

ターミナルを立ち上げて、解答されたディレクトリ(esptool-master)に移動し、以下のようにesptool.pyコマンドを実行します。
この時、<ポート>を、Arduino IDEのメニュー"ツール" > "ポート"にあった、"/dev/tty.usbserial-XXXX"に置換え、<ファームウェアのパス>の部分に、上記のファームウェアのbinファイルのパスを指定します。
./esptool.py --port <ポート> write_flash 0x000000 <ファームウェアのパス>
例)
./esptool.py --port /dev/tty.usbserial-FTHK458I write_flash 0x000000 ../nodemcu_float_0.9.6-dev_20150704.bin

※このコマンドを実行した時、Resouce busyと出ることがありますが、Arduino IDEのシリアルモニタなどでポートを開いているのが原因ですので、シリアルモニタなどを閉じて再度実行して下さい。

しばらくすると書き込みの進捗が100%になって、以下のようにターミナルに出れば無事書き込みが成功しています。

Connecting...Erasing flash...Writing at 0x00070c00... (100 %)
Leaving...

書き込みが終わっていると、再度Arduino IDEのシリアルモニタで繋ぎ、速度を9600bpsにすると、LuaがREPLとして起動していますのので、いろんなコマンドを打って遊ぶことができます。

下記の例ではWifiに接続しています。wifi.sta.configの第1引数、第2引数にはWifiのSSIDとパスワードに置き換えてください。
> wifi.setmode(wifi.STATION)
> wifi.sta.config("halake", "pass")
> print(wifi.sta.getip())
192.168.11.85 255.255.255.0 192.168.11.1
※Wifiに接続できない場合は、以下のコードで、ESP8266から見えているアクセスポイントの一覧を表示して見ると、問題の解決に役立つかもしれません。
function listap(t) for k,v in pairs(t) do print(k) end end;  wifi.sta.getap(listap)

同じWifi内でpingを打つとちゃんと応答があります!
PING 192.168.11.85 (192.168.11.85): 56 data bytes64 bytes from 192.168.11.85: icmp_seq=0 ttl=255 time=111.699 ms64 bytes from 192.168.11.85: icmp_seq=1 ttl=255 time=24.666 ms--- 192.168.11.85 ping statistics ---
2 packets transmitted, 2 packets received, 0.0% packet lossround-trip min/avg/max/stddev = 24.666/68.183/111.699/43.516 ms

Luaスクリプトの転送

最後のLチカの実現までもう一手間あります。シリアル通信でコードを実行することはできるようになりましたが、この方法だと電源をいれる度にプログラムを送る必要があります。
NodeMCUにはファイルシステムがあり、init.luaというファイルをアップロードすると起動するごとにそのファイルの内容を実行してくれます。
そのアップロード方法を確認しましょう。

まずは適当なinit.luaファイルを作るか、サンプルを持ってくる必要がありますが、NodeMCUのサイトにHTTPサーバの例もありますし、エンジニアであればAPIドキュメントをみてプログラムを組むこともできます。

そのためのツールとして、nodemcu-uploader.pyというそのものズバリなプログラムを使います。
例によって、"Download zip"のリンクをクリックしてzipファイルをダウンロード、解凍を行います。
解凍したディレクトリの中にある、nodemcu-uploder.pyファイルを使い、init.luaをアップロードします。
./nodemcu-uploader.py --port <ポート> upload init.lua
例)
./nodemcu-uploader.py --port /dev/tty.usbserial-FTHK458I upload init.lua

リモートLチカ!

いよいよ最後です!IO2を使って、LEDをリモートでオン、オフしてみましょう。
適当なLEDを使って、また数百Ωの抵抗をIO2に接続します。

こういった接続です。

ESP8266のIO2 <-> LED(カソード、足の長い方)
LED(アノード、足の短い方) <-> 抵抗 <-> GND

配線ができたら、次で終わりです。init.luaファイルを以下に置きました。ブラウザからアクセスするとLEDがアクセスするごとにオンになったり、オフになったりを繰り返します。



いやぁ、ESP8266って本当に面白いですね!ESP8266を使ったプログラミング教室をやってますので、越谷レイクタウンに近い方はぜひ遊びにいらして下さい!