ESP8266でLuaを使ってみる

Firmwareのビルド


NodeMCUというと2つの意味で使われているようです。
@Lua言語が動くESP8266のファームウェア
AESP8266開発ボード(ハードウェア)

今までESP8266開発ボードは沢山購入してきましたが、
一度もNodeMCUファームウェアを試したことはありませんでした。
そこでNodeMCUファームウェアとそこで動くLua言語を紹介します。

手元に、いくつかNodeMCUとして売られていた開発ボードが有りますが、
すぐにESP8266 Core+Arduino IDEでスケッチを書き込んでしまったので、
まっさらなNodeMCU開発ボードが有りません。

そこで、今回はハードはWeMosを使い、WeMos上にNodeMCUファームウェアを書き込んでみます。
NodeMCU on WeMosということになります。
ESP-WROOM-02やNodeMCU開発ボードでも手順は同じです。

NodeMCUファームウェアの入手はこちらのページで必 要事項 を書き込むと、
ファームの場所を示すメールが送られてくるので、24時間以内にそこからダウンロードすることができます。

ただ、インクルードするモジュールを変えるたびに、毎回申し込みをしなければならないので、
自分でファームをビルドしてみることにしました。
ファームのビルドについてはこちらに 詳しく紹介されています。
私が行ったのも、上記で紹介されている手順と同じです。


esp-open-sdkのインストール

最初にESP8266用のtoolchain(esp-open-sdk)をインストールします。
最近になって、幾つかの方法でインストールすることが分かったので、こちらで まとめ て紹介しています。


NodeMCUファームのビルド

私の環境ではpyserialがインストールされていなかったので、一度目のファームのビルドの途中でエラーになりました。
ファームをビルドする前に、pyserialがインストールされているかどうか、確認した方がいいです。
user_modules.hで必要な機能を指定しますが、私はデフォルトのまま使いました。
makeが終わると0x00000.bin 0x10000.binが出来上がります。
これがNodeMCUファームの本体です。
$ sudo apt install python3-pip
$ python3 -m pip install pyserial


$ git clone --recurse-submodules https://github.com/nodemcu/nodemcu-firmware
$ cd nodemcu-firmware
$ vi app/include/user_modules.h

ここで必要な機能を選択する

$ make

$ ls -l bin
合計 416
-rw-rw-r-- 1 nop nop  29120 11月 30 20:53 0x00000.bin
-rw-rw-r-- 1 nop nop 393216 11月 30 20:53 0x10000.bin


NodeMCUファームの書き込み

ESP8266のファームは、GithubからPreBuildされたファームをダウンロードして使うことが多いので、
ファームの書き込みは、以下で公開されているツールを使っています。

Flash Download Tools (ESP8266 & ESP32)
http://www.espressif.com/en/support/download/other-tools

ただ、このツールはWindows環境で動くので、Linux→Windowsにファームをリモートコピーする必要が有ります。
これも面倒なので、Linuxを使って書き込みます。
WeMosにファームを書き込む時、特別な操作は必要ありませんが、生のESPを使うときはここでESPを
UART Download Modeに変更します。
$ sudo make flash
use one of the following targets to flash the firmware
  make flash512k - for ESP with 512kB flash size
  make flash4m   - for ESP with   4MB flash size

$ sudo make flash4m
make -e FLASHOPTIONS="-fm dio -fs 32m -ff 40m" flashinternal
make[1]: ディレクトリ '/home/nop/nodemcu-firmware' に入ります
make -C ./app flashinternal
make[2]: ディレクトリ '/home/nop/nodemcu-firmware/app' に入ります
../tools/esptool.py --port /dev/ttyUSB0 write_flash -fm dio -fs 32m -ff 40m 0x00000 ../bin/0x00000.bin 0x10000 ../bin/0x10000.bin
esptool.py v1.2-dev
Connecting...
Running Cesanta flasher stub...
Flash params set to 0x0240
Writing 32768 @ 0x0... 32768 (100 %)
Wrote 32768 bytes at 0x0 in 2.9 seconds (91.9 kbit/s)...
Writing 393216 @ 0x10000... 393216 (100 %)
Wrote 393216 bytes at 0x10000 in 34.1 seconds (92.3 kbit/s)...
Leaving...
make[2]: ディレクトリ '/home/nop/nodemcu-firmware/app' から出ます
make[1]: ディレクトリ '/home/nop/nodemcu-firmware' から出ます

ESP-WROOM-02など、FLASHサイズが2MbyteのESPを使うときはMakefileにflash2mのターゲットを追加する必 要が有ります。
flash512k:
        $(MAKE) -e FLASHOPTIONS="-fm qio -fs  4m -ff 40m" flashinternal

flash4m:
        $(MAKE) -e FLASHOPTIONS="-fm dio -fs 32m -ff 40m" flashinternal

flash2m:
        $(MAKE) -e FLASHOPTIONS="-fm dio -fs 16m -ff 40m" flashinternal



NodeMCUファームの確認

screenを起動してESPをリセットし、以下の様に表示されればNodeMCUファームの書き込みは成功です。
$ sudo apt-get install screen

$ sudo screen /dev/ttyUSB0 115200

ESPをリセット

ファームを書き込んだ直後はファイルシステムのフォーマットが走ります。


>に続いて、以下を入力します。
-- print ap list
function listap(t)
    for k,v in pairs(t) do
        print(k.." : "..v)
    end
end
wifi.sta.getap(listap)



アクセスポイントの一覧がずらずらと表示されます。
これでNodeMCUファームの準備は完了です。



こちらで紹介しているAmicaブランドのNodeMCUボードを新 たに入手しました。
まっさらな状態で確認しましたがNodeMCUファームではなく、ATファームが書き込まれていました。




別のNodeMCUボードを入手しました。
ボーレート=9600Bpsで接続したらNodeMCUファームが書き込まれていましたが、カスタムビルドされたファームの様です。
NodeMCU対応ボードを購入しても、手元に来るまで、NodeMCUファームが書き込まれているかどうかは分からないです。


以下のスクリプトを実行してみました。
-- print ap list
function listap(t)
      for ssid,v in pairs(t) do
        authmode, rssi, bssid, channel =
          string.match(v, "(%d),(-?%d+),(%x%x:%x%x:%x%x:%x%x:%x%x:%x%x),(%d+)")
        print(ssid,authmode,rssi,bssid,channel)
      end
end


wifi.setmode(wifi.STATION)
wifi.sta.getap(listap)


APの一覧が取れました。



次回はLuaの開発ツールを紹介します。