この記事は慶應義塾大学SFC村井&徳田研 Advent Calendar 2015の17日目です。
--
(多分)アドベントカレンダー内唯一のマイコンの話です。ESP8266というチップをご存知ですか?Wi-FiアンテナとTCP/IPプロトコルスタックが搭載されたモジュール(厳密には搭載されているSoCを指します)です。国内外で今年流行ってますね。流行ってるんです。今回はこれを利用して自作のプログラムを実行する方法を書こうと思います。目標はHello, worldです。無線関係ない・・・
今回はRTOS_SDKというSDKを利用してプログラムをコンパイルします。
ESP8266には最初から対話型コマンド実行プログラム(ATコマンド)が搭載されています。なのに何故わざわざ自分でプログラムを書いて焼きこむ必要があるのでしょうか。主な理由は以下の3つです
- 対話型のコマンドを利用するためには、対話相手となるPC, マイコン, Raspberry Pi等が必要となってしまい、せっかくの小型設計が無駄となってしまう。
- 対話するためには応答が返ってくるのを確認したり待ったりするプログラムが必要で、速度的デメリットがある。
- 自分のプログラムが走るなら走らせたい!!!!
RTOS_SDKを選ぶ理由は、マルチスレッディングなどの機能が便利に利用できるからです。
- PC
- ESP8266
- USBシリアル変換コネクタ(ESP8266とPCを通信させるため。3.3V給電するものがよい)
配線の仕方や購入すべきttlコネクタについては特に書かないので他の記事を読んでみてくださいm(..)m。一応自分の配線は↓なかんじです。
今回の記事で対象としているビルド環境は
- Mac OS X Yosemite 10.10.5 x86_64
- Python 2.7.10
- gcc version 5.3.0 (Homebrew gcc 5.3.0)
- Ubuntu 15.10 Wily Werewolf i686
- Python 2.7.10
- gcc version 5.2.1 20151010
他にも依存パッケージがたくさんありますが、apt-get, brewで入手できる2015/12/17現在の最新版を利用しました。Mac OSでは一部分注意が必要なものの手順は基本的に共通です。
今回必要なツール, ソースは以下のとおりです。
とりあえず全部git clone.
ESP8266向けのプログラムをビルドするために必要なtoolchain。プログラムをコンパイルする際に必要なクロスコンパイラなどが含まれます。インストール方法はREADMEに書いてあるので割愛します。
Mac OSを利用している際だけ注意が必要で、READMEに書いてあるとおり、どこかにCase-sensitiveなイメージを作成し、その上で作業を行わなくてはなりません。
make後はesp-open-sdk/xtensa-lx106-elf/binを$PATHに加えます。
今回利用するメインのSDK。APIのReferenceはこちら。このSDK内のAPIを呼び出して各種処理を行なう。
上記の環境を利用してビルドしたプログラムをESP8266に書き込むときに使用するツールです。python setup.py install
でインストールしましょう。
今回はHello, worldが目標なので、ESP8266_RTOS_SDKに含まれるproject_templateというプロジェクトをそのまま利用します。
ESP8266_RTOS_SDK/examples/project_template/ディレクトリをどこかにコピーします。コピーのほうで、ディレクトリ内のgen_misc.shを編集します。コメントに書いてあるとおり
export SDK_PATH=
export BIN_PATH=
にRTOS_SDKのパスとコンパイル後のファイルの出力先を指定してください。
project_template/user/user_main.cがコンパイルされるCプログラムなので、自分で変更を加えてみます。例えば
printf("Hello, world\n");
を追記するなどです。
さていよいよビルドです。./gen_misc.shを実行します。色々聞かれますが、意味はreadme読んでください。基本は全部Enter押しとけばいいです。以下は全てEnterを押して標準のオプションを選択した際の話となります。
ビルドが終われば指定したBIN_PATHにeagle.flash.binとeagle.irom0text.binというファイルができているはずです。
作成したプログラムをESP8266に書き込みます。これにはesptoolを利用します。詳しい使い方はヘルプを見てください。
ここでの注意ですが、ファームウェア書き換えモードに入る合図として、GPIO0番をGNDへと接続してください。
作成したプログラムを書き込むためには
esptool.py -p [ESP8266のつながっているポート] -b [指定したボーレート(主に115200か9600。指定したい場合。)] write_flash [オフセット] [書き込むファイル]
を使用します。例えば、ubuntuでUSBシリアル変換器が/dev/ttyUSB0と認識されている場合
sudo esptool.py -p /dev/ttyUSB0 -b 115200 write_flash 0x00000 eagle.flash.bin 0x40000 eagle.irom0text.bin
とすることで書き込むことが出来ます。
ここまででエラーが出たりしなければ無事に自作のプログラムを実行する事ができるようになったはずです。
GPIO0をGNDから抜き、電源を入れ直します。起動メッセージやprintfで出力した文字列は標準でuartにbaud rate 74880で出力されてくるので、それを待ち構える必要があります。
screenコマンドで接続すれば見れるはずなのですが、ボーレートが高すぎるためか74880をオプションで指定しても文字化けしてしまいます。これは有名な問題なので、読み込むためのpython scriptが落ちていました。これを利用して待ち受けていれば、しっかりと"Hello, world"の文字列が流れてくるのを観測できるはずです。
お疲れ様でした。ハードウェアの配線や詳しいコマンドの使い方など説明の難しい部分があり上手に伝えられた自信はありませんが、少しでも興味を持って頂ければ幸いです。
たくさんよくわからない落とし穴があり、完全にまとまった情報はめったにないので、自分が通った道を次に通る人が少しでも楽になればいいと思って書きました。
本当に面白いチップなので是非一回手にとって遊んでみてください!!