SNSへはこちら

ESP8266でベアメタル(1) - 開発環境整備・ROM焼き

ESP8266 ってあるじゃないですか。あの格安のやつ。え???知らない??じゃあ ESP-WROOM-02 って言えばわかりますかね。そうそう、アレです。
超絶格安で Wi-Fi が使えて、未来の IoT を手軽に大変出来て大変面白いです。自身が Web サーバーにもなれるので可能性が無限大です。

モチベーション

ということでかなり有名なので、Arduino IDE で楽に開発出来るのです。っていうか AT コマンドを実行できるファームウェアがデフォルトで入っているので、そもそも ROM を書き換える必要すらないです。

世の中には Arduino IDE を使った開発手法が非常によく出ていて、良きこと良きk...

んなわけあるかああ!!!甘ったれるな!!

という、いつものテンションで始まりました。本記事シリーズは、この忌まわしき IDE を一切用いずに低レイヤを実感しつつ、このモジュールをしゃぶり尽くしてやろうという企画です。このモジュールの分かりやすい説明はここで後輩くんが説明してくれているので、こちらもどうぞ。

使用ハード

秋月の DIP 化基板を用います。

あとは通信と ROM 書き換えのために USB シリアル変換モジュールも必要ですが、僕は自作のモジュールを使っています。
FT234X のモジュールがおすすめですね。電源レベルが 3.3V だし。

ツールのインストール

それでは早速やっていきましょう。まずは必要な環境の構築です。

Mac 版の gcc 等ツールチェインはこちらからダウンロード出来るのでどうぞ。展開してパスの通った場所に置けばこれだけで gcc は使えるようになります。

書き込みツールは esptool を使います。こちらも pip3 でサクッと出来る。

$ pip3 install esptool
$ esptool.py version
esptool.py v3.0
3.0

配線

取り敢えず以下のようにしておきます。他の記事とかを見るとプルアップしているようだが、面倒なので単にジャンパワイヤをつなげている感じです。

ピン名 接続先 備考
EN 3V3
IO0 3V3: 通常起動、GND: ブート
IO2 3V3
IO15 GND
TXD/RXD RXD/TXD

ファームウェアのアップデート

これから自分で作ったバイナリを焼くことになると思うので、ひとまずファームウェアアップデートをやってみます。
今後はこれを消し去るので、このファームは後々使うことは(多分)無いと思いますが、取り敢えず入門として、ね?

元々便利な AT コマンドを叩くのは後にして、アップデートしてみます。ここでは自作バイナリを書き込んだ後でも、もとに戻せるように練習も兼ねています。

OTA

まずは Espressif のクラウドからアプデを実行する方法です。Wi-Fi 接続を含めて手順にします。

まずは ESP8266 を通常起動。ここからシリアルコンソール内でのコマンドです。Baud Rate は 115200。自分が打ったコマンドの行は > から始めています(本来は表示されない)。

> AT # 取り敢えず起動しているか確認

OK # OK.
> AT+CWMODE=1 # Stationモードに切り替え

OK
> AT+CWLAP # 入感しているWi-Fi AP一覧を表示
+CWLAP:(4,"HUMAX-xx",-67,"aa:bb:cc:dd:ee:ff",1,15,0)
...
...

OK
> AT+CWJAP="ssid","password" # 接続したいAPの情報を打つ
WIFI CONNECTED
WIFI GOT IP

OK # 接続された
> AT+CIUPDATE # これでアプデ開始!楽!!
+CIPUPDATE:1
+CIPUPDATE:2
+CIPUPDATE:3
+CIPUPDATE:3
+CIPUPDATE:4

OK
WIFI DISCONNECT # アプデが終わったら自動的に再起動する

 ets Jan  8 2013,rst cause:1, boot mode:(3,0)

load 0x40100000, len 1456, room 16 
tail 0
chksum 0xa2
load 0x3ffe8000, len 776, room 8 
tail 0
chksum 0xc3
load 0x3ffe8310, len 552, room 8 
tail 0
chksum 0xb8
csum 0xb8

2nd boot version : 1.5
  SPI Speed      : 40MHz
  SPI Mode       : QIO
  SPI Flash Size & Map: 16Mbit(512KB+512KB)
jump to run user2 @ 81000

correct flash map
sy|?|pl||p`|?|l|||?p?p?|?l???l|l??l?l??`lll?????l??
ready
> AT+GMR # バージョンを確認
AT version:1.7.4.0(May 11 2020 19:13:04) # たしかに新しくなっている!!
SDK version:3.0.4(9532ceb)
compile time:May 27 2020 10:12:20
Bin version(Wroom 02):1.7.4
OK

esptoolを使って自力でアップデート

お次は自分でコマンドを叩きましょう。とはいっても、たった今最新ファームを入れてしまったので、ダウングレードしますw

フラッシュサイズの確認

その前に、使用している ESP8266 のフラッシュサイズを調べておきましょう。このモジュール、どうやら製造途中で仕様変更を行ったらしく、4MB だったのがとあるロットから 2MB に半減されているらしいです。商売としてあり得ないね。アホかな?

...という愚痴はさておき、esptool を使って調べてみましょう。Arduino IDE でも出来るんですが、いちいち確認用のバイナリを書き込むのなんて愚かですから、コマンドラインでサクッと見たいわけです。

ブートモードで起動(IO0 = GND)させ、以下のコマンドを叩けば出てきます。

$ esptool.py -p /dev/cu.usbmodem14102 flash_id
esptool.py v3.0
Serial port /dev/cu.usbmodem14102
Connecting....
Detecting chip type... ESP8266
Chip is ESP8266EX
Features: WiFi
Crystal is 26MHz
MAC: 
Uploading stub...
Running stub...
Stub running...
Manufacturer: a1
Device: 4016
Detected flash size: 4MB
Hard resetting via RTS pin...

おお〜〜〜、僕の持っているやつは 4MB 版でしたね。

書き込み用のファームを準備

まずはファームの準備です。先程申し上げたように、AT ファームをダウングレードするのでまずは PC 側に落としておきましょう。

Espressif のダウンロードサイトから ESP8266 NonOS AT Bin V1.6.2 をダウンロードし展開します(V1.7.0〜V1.7.3 は GitHub で 「起動しない」と Issues が出ているようなのでおすすめしません(詳細はまだ読んでいない))。するといくつかバイナリが入っていますね...なんだこれ?

これらの詳細は今展開したディレクトリ内、bin/at/REAME.md を見ればわかります。

### Flash size 32Mbit-C1: 1024KB+1024KB
    boot_v1.2+.bin              0x00000
    user1.2048.new.5.bin        0x01000
    esp_init_data_default.bin   0x3fc000
    blank.bin                   0xfe000 & 0x3fe000

あっ、そうそう。今後のためにこちらから ESP8266 Non-OS AT Instruction SetESP8266 Non-OS SDK API Reference もダウンロードしておくといいですよ。

以下のコマンドで実行です。AT Instruction Set に記載の他のアドレスで試しましたが、通常起動時に無限ループとなってしまい正常動作は出来ませんでした。アドレスそのものが違うからそりゃそうだろうけどね。実際のメモリマップとかおいおい調べていきたいですねえ。

$ esptool.py write_flash --flash_size 4MB-c1 0x0 boot_v1.7.bin 0x01000 at/1024+1024/user1.2048.new.5.bin 0xFE000 blank.bin 0x3FE000 blank.bin 0x3FC000 esp_init_data_default_v08.bin
ready
> AT

OK

> AT+GMR
AT version:1.6.2.0(Apr 13 2018 11:10:59) # 変わっている!
SDK version:2.2.1(6ab97e9)
compile time:Jun  7 2018 19:34:29
Bin version(Wroom 02):1.6.2
OK

これでOKです!

ということで、これで ROM 焼きを失敗しても元に戻せますね!!今後はどんどんレイヤを低くしていこうと思います〜〜