続きをやっています。昨日、esptool は C 製のを使うことがわかったので今回は実際に ESP12 に書き込んでみます。
まだ、PCB ボードは作っていませんが、開発ボードにとりあえず書き込めるかやってみようと思います。
書き込む開発ボードは、以下のものです。他2台は、以前にあれこれやっている最中に3.3V 以上入れすぎて壊れたようです。2台は昇天しましたので、正常なのはこれと、あと未開封のが1つあります。
さて、ソースディレクトリに移動し、make flash してみます。
HOPE:espeink junkhack$ make flash esptool vb64eebd - (c) 2014 Ch. Klippel <ck@atelier-klippel.de> opening port /dev/cu.SLAB_USBtoUART at 115200 opening bootloader resetting board trying to connect trying to connect Uploading 37632 bytes from firmware/0x00000.bin to flash at 0x00000000 ..................................... starting app without reboot closing bootloader Please put the ESP in bootloader mode...★再度、RST を GND に esptool vb64eebd - (c) 2014 Ch. Klippel <ck@atelier-klippel.de> opening port /dev/cu.SLAB_USBtoUART at 115200 opening bootloader resetting board trying to connect trying to connect Uploading 166264 bytes from firmware/0x40000.bin to flash at 0x00040000 ................................................................................................................................................................... starting app without reboot closing bootloader HOPE:espeink junkhack$
こんな感じになれば書き込みはOK なようです。
esptool(esptool-ck) が、ファームウェアが2つ書き込むのですが、2つ目の時にも再度書き込みモードを要求してくるようなので、RST pin をGNDに落としてブートモードにします。このあたりは、実際のPCB 基盤につけた状態だとどうなるのでしょうかね?要検討です。
続いて、html を mkespfsimage というツールを使って圧縮しそれを 0x12000 の領域に書き込むようです。これは、以下のコマンドを使って作ることができます。
$ make webpages.espfs
が、ここで問題が2つ発生。まず、osx だと、これを実行すると、昨日試したように、
HOPE:espeink junkhack$ make webpages.espfs cd html; find | ../mkespfsimage/mkespfsimage > ../webpages.espfs; cd .. /bin/sh: ../mkespfsimage/mkespfsimage: cannot execute binary file usage: find [-H | -L | -P] [-EXdsx] [-f path] path ... [expression] find [-H | -L | -P] [-EXdsx] -f path [path ...] [expression] HOPE:espeink junkhack$
となってしまいfind の使い方が悪いよと、出てしまいます。make ファイルに書いてあるようにコマンドを実行してみますと
HOPE:espeink junkhack$ cd html/ HOPE:html junkhack$ find usage: find [-H | -L | -P] [-EXdsx] [-f path] path ... [expression] find [-H | -L | -P] [-EXdsx] -f path [path ...] [expression]
となります。osx の find は、引数を与えないとデフォルトでは出ない仕様のようです。なので、GNU の find を入れます。
$ brew install findutils --with-default-names
まず、1つ目の問題はこれでクリアです。しかし、まだ以下のようになります。
HOPE:espeink junkhack$ make webpages.espfs cd html; find | ../mkespfsimage/mkespfsimage > ../webpages.espfs; cd .. /bin/sh: ../mkespfsimage/mkespfsimage: cannot execute binary file
シェルが、mkespfsimage の、バイナリファイルを実行できないようです。このコマンドを再度 make してみます。
HOPE:mkespfsimage junkhack$ cd mkespfsimage HOPE:mkespfsimage junkhack$ make clean rm -f mkespfsimage main.o heatshrink_encoder.o HOPE:mkespfsimage junkhack$ HOPE:mkespfsimage junkhack$ make cc -I../lib/heatshrink -std=gnu99 -c -o main.o main.c main.c:59:38: warning: passing 'char *' to parameter of type 'uint8_t *' (aka 'unsigned char *') converts between pointers to integer types with different sign [-Wpointer-sign] sres=heatshrink_encoder_sink(enc, inp, insize, &len); ^~~ ../lib/heatshrink/heatshrink_encoder.h:97:14: note: passing argument to parameter 'in_buf' here uint8_t *in_buf, size_t size, size_t *input_size); ^ main.c:65:38: warning: passing 'char *' to parameter of type 'uint8_t *' (aka 'unsigned char *') converts between pointers to integer types with different sign [-Wpointer-sign] pres=heatshrink_encoder_poll(enc, outp, outsize, &len); ^~~~ ../lib/heatshrink/heatshrink_encoder.h:102:14: note: passing argument to parameter 'out_buf' here uint8_t *out_buf, size_t out_buf_size, size_t *output_size); ^ 2 warnings generated. cc -I../lib/heatshrink -std=gnu99 -c -o heatshrink_encoder.o heatshrink_encoder.c cc -o mkespfsimage main.o heatshrink_encoder.o HOPE:mkespfsimage junkhack$
とりあえず、なんか警告は出ていますができたようです。Linux (Ubuntu)のgcc 4.8.2では以下のようになりました。
root@ub:~/work/espeink/mkespfsimage# rm mkespfsimage root@ub:~/work/espeink/mkespfsimage# make clean rm -f mkespfsimage main.o heatshrink_encoder.o root@ub:~/work/espeink/mkespfsimage# root@ub:~/work/espeink/mkespfsimage# make cc -I../lib/heatshrink -std=gnu99 -c -o main.o main.c cc -I../lib/heatshrink -std=gnu99 -c -o heatshrink_encoder.o heatshrink_encoder.c cc -o mkespfsimage main.o heatshrink_encoder.o root@ub:~/work/espeink/mkespfsimage#
osx では、gcc に以下を使っていたので出たようです。
HOPE:mkespfsimage junkhack$ gcc --version Configured with: --prefix=/Applications/Xcode.app/Contents/Developer/usr --with-gxx-include-dir=/usr/include/c++/4.2.1 Apple LLVM version 6.0 (clang-600.0.57) (based on LLVM 3.5svn) Target: x86_64-apple-darwin13.4.0 Thread model: posix
とりあえず、警告は出ていますが、ビルドはされているようなので、スルーします。さて、これで2番目の問題も解決できたはずです。実行してみますと、以下のようになりました。
HOPE:espeink junkhack$ make webpages.espfs cd html; find | ../mkespfsimage/mkespfsimage > ../webpages.espfs; cd .. 140medley.min.js (74%) apconnect.bm (15%) batempty.bm (13%) connecting.html (95%) icons.png (100%) neterror.bm (16%) style.css (73%) wifi.tpl (54%) HOPE:espeink junkhack$ HOPE:espeink junkhack$ ll total 120 -rw-r--r--@ 1 junkhack staff 4946 9 24 21:27 Makefile -rw-r--r--@ 1 junkhack staff 3261 9 23 15:34 Makefile.patch -rw-r--r--@ 1 junkhack staff 4960 9 11 00:13 Makefile_org -rw-r--r--@ 1 junkhack staff 207 9 22 22:32 README drwxr-xr-x 6 junkhack staff 204 9 24 21:31 build drwxr-xr-x 4 junkhack staff 136 9 24 21:31 firmware drwxr-xr-x 10 junkhack staff 340 9 22 22:32 html drwxr-xr-x 5 junkhack staff 170 9 22 22:32 icons drwxr-xr-x 10 junkhack staff 340 9 22 22:32 include drwxr-xr-x 3 junkhack staff 102 9 22 22:32 lib drwxr-xr-x 9 junkhack staff 306 9 26 22:08 mkespfsimage -rw-r--r-- 1 junkhack staff 638 9 22 22:32 mkimg.php drwxr-xr-x 4 junkhack staff 136 9 22 22:32 server drwxr-xr-x 24 junkhack staff 816 9 22 22:32 user -rw-r--r-- 1 junkhack staff 31024 9 26 22:17 webpages.espfs★ HOPE:espeink junkhack$
★のファイルが生成されていればOK です。
なるほど、これでesp12 の中に入っているweb サーバがこのファイルシステムの中のファイルを読んで表示しているんですね。
やっとこれでhtml が書き込めるはずです。以下のようになりました。
HOPE:espeink junkhack$ make htmlflash if [ $(stat -c '%s' webpages.espfs) -gt $(( 0x2E000 )) ]; then echo "webpages.espfs too big!"; false; fi stat: illegal option -- c usage: stat [-FlLnqrsx] [-f format] [-t timefmt] [file ...] /bin/sh: line 0: [: -gt: unary operator expected esptool -cp /dev/cu.SLAB_USBtoUART -cb 115200 -ca 0x12000 -cf webpages.espfs -v esptool vb64eebd - (c) 2014 Ch. Klippel <ck@atelier-klippel.de> opening port /dev/cu.SLAB_USBtoUART at 115200 opening bootloader resetting board trying to connect trying to connect Uploading 31024 bytes from webpages.espfs to flash at 0x00012000 ............................... starting app without reboot closing bootloader HOPE:espeink junkhack$
書き込めてはいるようですが、最初の部分で stat の使い方が悪そうと出ています。おそらくこれは、ファイルがでか過ぎないかどうかを見ているんだと思いますが、とりあえずスルーします。
あとは設定とか、WiFi E-ink とそれを見に行くサーバの設定などとなるはずです。
▼まとめ
・ESP12 で動作するWEB は、圧縮されたファイルシステムの中のファイルを見に行く
・そのファイルは、mkespfsimage で heatshrink を使った圧縮で作成される
・osx の find はデフォルト引数なしだと、動作しないので、gnu 版を入れる
・mkspsimage コマンドは、再度コンパイルする。
・ESP12 への書き込みは、ファームウェアは、make flash で書き込む
・ESP12 へのhtml ファイルの書き込みは、make htmlflash を使う
・make htmlflash を使ったとき、ファイルサイズの大きさをチェックしているようですがこれがosx では、動作していない模様
・おそらく書き込みには、Linux を使ったほうが楽です。
まだ、良くわからないことがありますが、それは追って調査します。
▼良くわからないこと
・最初の起動時に、192.168.4.1 で mode(3) のステーションで起動してくるが、このときのwifi アクセスポイントに入るパスワードは?
・EPS12 が設定を終えれば、定期間隔でWEB サーバを見に行くが、この処理はどうやればいいのか?
推測では、画像のURL を指定すればいける気がします。その画像ファイルは、bm 形式のもので。このあたりは、もう少し調査しないと白黒言えませんが、なんとかいけそうな気がしてきましたので、部品を発注したり、基板を発注したりするかどうか考えて見ます。実際のボードとE-ink ディスプレイがないとこれ以上の確認はちょっと厳しいです。できなくはないですが、あとは現場合わせで楽しんでもいいかなぁと。