ESP8266 でADC 増設その2

前回、ADC のアナログ入力を増設する方法として以下を調査していました。

ESP8266 でADC 増設するには?

作者に聞いてみたところ、Version2のICには、MAX11609EEE+ を使っているとの事。16ピンQSOP で、DigiKey で336円くらいのものです。

MAX11609EEE+

datasheet

データシートを見てみると、これは8チャンネルあるようです。通信は、I2Cでいけるようです。

MAX11609EEE

とりあえず、8チャンネルもいらないので、4チャンネルのMAX11607 というのを試しに使ってみようかと思っています。

Aliexpress で価格を調査すると、4ch8ch も値段がほとんど変わらないようです。1個400円ちょい。

 

他にも、I2C で ADC はいろいろあるようで、たとえば、TIの4チャンネルなんかの ADS7924IRTER は供給量も多いようです。

 

標準で付いている、ADC も工夫すればGPIO 分のアナログリードができるようなのでそれを試してみてから考えたいと思います。

ダイオードをつけて、計測前にGPIO x ピンをHigh にしてADC 値を読むという原理です。 Lua のサンプルコードでそんなロジックが書いてありました。なるほどーですね。

 

で、手持ちのダイオードがなぜか見つからず、ジャンクのマザーボードからチップダイオードを採取してユニバーサル基板につけたところまで今、作業が進んでいます。

ESP13 と BackBoost のPCBを作成中

Eagle の勉強と、PCB をプリントに出すため、まずはお手ごろな素材を元に勉強中。

 

コンセプト

・Lion の1セルに、充電ができて、過充電、過放電保護がある

・充電は、マイクロUSB からできる

・1セルから3.3v を効率よく、安定して作るため、backboost 回路を入れる

・自分が持っている、UART のシリアル変換を直接挿せるようにする

・ケースに入れる都合上、幅を2cm x 6.5cm 未満とする

・UART の PIN は自動的にリセットがかかるよう、DTR からの信号を処理する回路を埋め込む

・バッテリーや、3.3V 出力など後に計測したいので、PINを出しておく

・DeepSleep は必ず使うので、配線しておく

・ブレッドボードに挿せる様、PIN を出しておく

・なるべく安くする

・レゴブロック風のものをジョイントすると機能が拡張できるようにしたい。

 

といういうな、お題を掲げて作っています。

まだ、途中ですが、以下のようなものができてきました。

1

安くあげるため、USB と充電回路(保護付き)は既成のモジュールを使うことに、90円くらいのものです。

この基板をノギスや、スキャナで取ってeagle のライブラリを作成。ここが面倒でした。また、ESP12Eと、ESP13(WROOM-02)と大きさを比べると、ESP13の方が小さく、組み込みやすそうです。

2

今回の目玉である、バックブースト回路は表に載せました。ブレッドボードに指せば裏側に回る予定。真ん中のパッド部分はスルーホールを横に作って、裏側の胴箔に熱伝統させる予定です。

3

裏面に部品が回せるのを知ったので、(Mirrorすれば良いだけですが、、、)上記のような配置にしました。まだ配線は仮なので、これから変わります。

4

左には、UARTのPINを直接させるようメスピンヘッダーをつけます。順番は逆配列にしないとブレッドボードに挿した時LEDとか見えませんので、後に変更予定です。

 

5

回路図は、離れたところにある配線をどうやるのかわからず、あれこれググりました。これはラベルでやるようですが、いまいち良くわかっていません。とりあず、つなぎたいところに、配線を伸ばしNAMEをつけて、ラベルみたいなのは、シンボルがあったので、それを使っています。supply2.lbr というのにありました。たぶんもっといいやり方があるのでしょうが、良くわかりません。機能は満たしているので、今はこれでよしとします。

 

先人たちの回路図を見ると、機能ごとに分離して、見やすくする工夫をしているようです。なので上記のような感じにしてみました。その後、あれこれと思案し、以下のようになっています。まだ途中。

 6

ブレッドボードに挿すPINは最低限のものにしたけれども、案外空きスペースがなくなって来ているので、複雑な回路だと2階建てにする感じになりそう。

 

▼まとめ

・回路図は見やすくするため、機能ごとにわける。

・離れたところを配線するため、NAMEを使い、ラベルをつける

・ラベルは回路図だけに出るライブラリ(supply2.lbr )があるのでそれを使う

・裏面に部品を配置するには、Mirror を使う。

・実際の部品で仕様がわからないものは、スキャニングして大きさを算出。ノギスで実物を計測。

・独自ライブラリを作るには、3ステップ。

New > Library

Package 作成(左から5番目のアイコン)で、PCB基板に実際に付く図形を書く

Simbol 作成で、回路図上で見える図とPINを書く

Device 作成し、上記を対応づけ。Connect でPIN対応づけできる

・部品の配置の際、ルーラをドキュメントレイヤーに置いておくと便利(Metric ruler のLIB)

 

▼不明なこと

・離れたとこにある配線のやりかた。見やすいラベルを同時付け、対応づけるには?

・ESP13のUARTでリセットを自動的に行う回路。いろいろあるようです。現在3種類のやり方を模索。モノがまだ来ていないので着たら検討。

・ESP13 と ESP12のピンの対応づけ表がほしい。 EN は CHPD で、TOUTは、ADCに対応していると考えればよい?

・ESP13はGNDが2つ増え、合計3つ。なので、PIN数がESP13の18PINに対し、ESP12は、16PINということなのか?

 

▼調査すること

・幅、2cmx長さ5cm、暑さ5mmくらいのお値打ちLIONを探す。

・どっかの記事で、ADCはダイオードをかませば、GPIOのピン数分読めるというような英文記事を見たが、あれは本当か?

ESP8266 でADC 増設するには?

ESPシリーズは、全機種ADC が1ポートなので、アナログ値を読むには何かしら工夫しないといけないのですが、その方法を模索したいと思います。新しい課題です。

 

調査第一段階では、以下のものがあるようです。

ESP8266 Analog Input Expander Library for MCP3021 A/D Conveters

https://github.com/AllAboutEE/ESP8266-MCP3021-Library

これは、tindie で作っているヒトがいるようです。

ESP8266 Analog Inputs Expander (Version 2)

https://www.tindie.com/products/AllAboutEE/esp8266-analog-inputs-expander/

初期リリース版は、4つのMicrochip MCP3021を使っているようですが、Version2では、1ICとなっているようです。このIC は4チャンネルのやつだと思うのですが、型番がよくわかりません。MCP3304 か、MCP3008のTSSOP パッケージかな?ちょっとお尋ね申すことに。

 

とりあえず、回路は簡単そうなので部品を入手して模索してみたいと思います。

espeink の現在の調査状況

とりあえず、問題点となるポイントが絞れてきました。

設定を終えて、再度起動するときに以下のようになります。

deep sleep 60s

þárl.lœž|.Œlà|....Œ.lì.b|Ž‚.ì.’r’bŒ.bŒònnžlnnœâì.b.pŒŽlrlrlpònà....‚.l......b.nâ|.Œll..ŽbŒònnî.lŒŽl`...nn.l`...nrŽ’’n...lœ.lpònà....rŒœœâà....b.nâ|.ŒŒŽ.à.bŒònnî...l`...nnlŒl`...nrŽ’’n..rŒ’`.`òn...žàb‚nlŒ.Œònnî..Ž.lpònà....rŒœœâàl’..b.nâ|.ìì쌎bŒònnî.lŒ.l`...nnlŒl`...nrŽ’’n..‚òl`..r’’n..‚òl`.är.Datasource http://192.168.1.17/server/espbm.php
mode : sta(18:fe:34:9b:99:a3)
add if0
scandone
add 0
aid 4
pm open phy_2,type:2 0 0
cnt 

connected with JunkHackAP, channel 6
dhcp client start...
ip:192.168.1.24,mask:255.255.255.0,gw:192.168.1.1
Wdt. This takes too long. Go to sleep.
rm match
pm close 7 0 0/19987670
deep sleep 60s

.árl.lœž|.Œlà|....Œ.lì.b|Ž‚.ì.’r’bŒ.bŒònnžlnnœâì.b.pŒŽlrlrlpònà....‚.l......b.nâ|.Œll..ŽbŒònnî.lŒŽl`...nn.l`...nrŽ’’n...lœ.lpònà....rŒœœâà....b.nâ|.ŒŒŽ.à.bŒònnî...l`...nnlŒl`...nrŽ’’n..rŒ’`.`òn...žàb‚nlŒ.Œònnî..Ž.lpònà....rŒœœâàl’..b.nâ|.ìì쌎bŒònnî.lŒ.l`...nnlŒl`...nrŽ’’n..‚òl`..r’’n..‚òl`.är.Datasource http://192.168.1.17/server/espbm.php
mode : sta(18:fe:34:9b:99:a3)
add if0
scandone
add 0
aid 4
pm open phy_2,type:2 0 0
cnt 

connected with JunkHackAP, channel 6
dhcp client start...
ip:192.168.1.24,mask:255.255.255.0,gw:192.168.1.1
Wdt. This takes too long. Go to sleep.
rm match
pm close 7 0 0/19987656
deep sleep 60s

þá

これは、DHCP でIP を取得するまえに、データソースのURL をフェッチしにいっているようで、WiFi のコネクトチェックがアボートしているので、URLにコネクトしていない状況です。どういうタイミングかはわかりませんが、極まれに以下のようになるときがあります。

deep sleep 60s

.árl.lœž|.Œlà|....Œ.lì.b|Ž‚.ì.’r’bŒ.bŒònnžlnnœâì.b.pìŽlrlrlpònà....‚.l......b.nâ|.ìllŽŽŽbŒònnî.lŒŽl`...nn.l`...nrŽ’’n..’lŽ.lpònà....rŒœœâà....b.nâ|.Œ.ŽŽŽbŒònnî...l`...nnlŒl`...nrŽ’’n..‚ŒŽ.l`òn...žàb‚nlŒ.Œònnî..Ž.lpònà....rŒœœâàlŒ..b.nâ|.ìlŽ.à.bŒònnî.lŒ.l`...nnlŒl`...nrŽ’’n..ò.œ.l.r’’n..ò.œ.lärlDatasource http://192.168.1.17:8266/server/espbm.php
mode : sta(18:fe:34:9b:99:a3)
add if0
scandone
reconnect
scandone
reconnect
scandone
reconnect
scandone
reconnect
scandone
reconnect
scandone
reconnect
scandone
reconnect
scandone
reconnect
scandone
add 0
aid 4
pm open phy_2,type:2 0 0
cnt 

connected with JunkHackAP, channel 6
dhcp client start...
No heap available, failed to malloc 440
No heap available, failed to malloc 440
Wdt. This takes too long. Go to sleep.
rm match
pm close 7 0 0/10213903
No heap available, failed to malloc 440
del if0
usl
sul 0 0
deep sleep 60s

.á

現在までで、SDK はとりあえず以下で調査しました。

SDK Version make可否 make問題点 実際の挙動 備考
0.9.2 X      
0.9.3 X      
0.9.5 O なし URL フェッチしない  
0.9.6_b1 X unknown type name ‘uint32_t’

unknown type name ‘uint16_t’

unknown type name ‘uint8_t’

  cgiwifi.c

io.h
1.0.0 X 同上    
1.0.1b1 X 同上    
1.0.1b2 X 同上    
1.0.1 O なし    
1.1.0 X eink.c で使われている

os_update_cpu_frequency

がこのSDKにない

  v1.1.0_15_05_26
1.1.1 X unknown type name ‘uint**_t’

conflicting types for ‘os_random’

  user/cgiwifi.c

user/io.h

include/espmissingincludes.h

1.1.2 X 同上   同上
1.2.0 X 同上   同上
1.3.0 X      
1.4.0 X      

※随時、更新予定。

 

SDK のバージョンがあがるごとに、廃止されたファンクションがあったり、引数が変わったりしたものがあったりと、それなりに対応が必要そうです。作者はおそらく、推測ですが0.9.5 あたりで作成しているかと思います。

 

esp-open-sdk の makefile を見ると以下のようにあり、まだ試すバージョンがあります。

VENDOR_SDK_ZIP_1.3.0 = esp_iot_sdk_v1.3.0_15_08_08.zip
VENDOR_SDK_DIR_1.3.0 = esp_iot_sdk_v1.3.0
VENDOR_SDK_ZIP_1.2.0 = esp_iot_sdk_v1.2.0_15_07_03.zip
VENDOR_SDK_DIR_1.2.0 = esp_iot_sdk_v1.2.0
VENDOR_SDK_ZIP_1.1.2 = esp_iot_sdk_v1.1.2_15_06_12.zip
VENDOR_SDK_DIR_1.1.2 = esp_iot_sdk_v1.1.2
VENDOR_SDK_ZIP_1.1.1 = esp_iot_sdk_v1.1.1_15_06_05.zip
VENDOR_SDK_DIR_1.1.1 = esp_iot_sdk_v1.1.1
VENDOR_SDK_ZIP_1.1.0 = esp_iot_sdk_v1.1.0_15_05_26.zip
VENDOR_SDK_DIR_1.1.0 = esp_iot_sdk_v1.1.0
# MIT-licensed version was released without changing version number
#VENDOR_SDK_ZIP_1.1.0 = esp_iot_sdk_v1.1.0_15_05_22.zip
#VENDOR_SDK_DIR_1.1.0 = esp_iot_sdk_v1.1.0
VENDOR_SDK_ZIP_1.0.1 = esp_iot_sdk_v1.0.1_15_04_24.zip
VENDOR_SDK_DIR_1.0.1 = esp_iot_sdk_v1.0.1
VENDOR_SDK_ZIP_1.0.1b2 = esp_iot_sdk_v1.0.1_b2_15_04_10.zip
VENDOR_SDK_DIR_1.0.1b2 = esp_iot_sdk_v1.0.1_b2
VENDOR_SDK_ZIP_1.0.1b1 = esp_iot_sdk_v1.0.1_b1_15_04_02.zip
VENDOR_SDK_DIR_1.0.1b1 = esp_iot_sdk_v1.0.1_b1
VENDOR_SDK_ZIP_1.0.0 = esp_iot_sdk_v1.0.0_15_03_20.zip
VENDOR_SDK_DIR_1.0.0 = esp_iot_sdk_v1.0.0
VENDOR_SDK_ZIP_0.9.6b1 = esp_iot_sdk_v0.9.6_b1_15_02_15.zip
VENDOR_SDK_DIR_0.9.6b1 = esp_iot_sdk_v0.9.6_b1
VENDOR_SDK_ZIP_0.9.5 = esp_iot_sdk_v0.9.5_15_01_23.zip
VENDOR_SDK_DIR_0.9.5 = esp_iot_sdk_v0.9.5
VENDOR_SDK_ZIP_0.9.4 = esp_iot_sdk_v0.9.4_14_12_19.zip
VENDOR_SDK_DIR_0.9.4 = esp_iot_sdk_v0.9.4
VENDOR_SDK_ZIP_0.9.3 = esp_iot_sdk_v0.9.3_14_11_21.zip
VENDOR_SDK_DIR_0.9.3 = esp_iot_sdk_v0.9.3
VENDOR_SDK_ZIP_0.9.2 = esp_iot_sdk_v0.9.2_14_10_24.zip
VENDOR_SDK_DIR_0.9.2 = esp_iot_sdk_v0.9.2

0.9.5 ~ 1.3.0 の間にまだあるので、それらをとりあえず全部試してみようかと。

コードの調査している部分は、

---- user_main.c
::
    httpclientFetch(myConfig.url, httpclientCb, httpclientHdrCb);
    
    einkDisplay(24*1024, tcpEinkNeedData, einkDoneCb);
::

です。古典的に、デバックにはシリアルプリントと delay を入れているんですが、コネクトしている部分がよくわからず、一体どこで、アクセスポイントに接続して、dhcp してIP をもらっているのかが良くわかっていません。このあたりは、C のデバックデックニックのスキルだと思いますが、もっと効率的なものはないでしょうかね。

 

原理的に、deep sleep から復帰したら、まずアクセスポイントにコネクトし、IP をゲットするまで delay させてからフェッチしたいんですが、そのdelay を入れるところがよくわかりません。

 

もう少し、簡単なアクセスポイントに接続するコードを書いて試してみようかと思います。部品とプリント基板を発注しようと考えていたんですが、もう少しソースコードを調査しないと動作しなさそうなので、来週以降に発注は持ち越しになりそうです。httpのtcp 経由じゃなく、ローカルのファイルシステム(espfs)に含まれる.bm ファイルは表示されている感じなので、表示することはできそうかなと思います。

 

さぁ、どこまで根気が続くかです。hack とは根気がいるものですね。推理と実験を繰り返し、1つづつ問題を把握しないといけませんが、問題を分解するのにスキルが足りていない部分は都度、勉強しながらとなるので、時間がかかります。

今のところ、このhack で勉強になったのは、基板を設計しお値打ちに作成する方法、open-sdk というものがあること、esptool にはpython 版と C 版があるということです。

 

▼まとめ

・作者はおそらく、0.9.5 か 1.0.1のSDK を使っていたと推測。

・esphttpd は、オリジナルがおそらく以下

https://github.com/OLIMEX/ESP8266/tree/master/esphttpd

・そして、最新のSDKなどにあわせて新しくなったものが以下にある

https://github.com/izhak2/esphttpd

・この単体をまず試してみようと思う。特に、新しいesphttpd は Makefile の書き方が参考になるし、新しいSDKにも対応しているようなので。

espeink の挙動

とりあえず、全体がまだ良くわかっていないけれども、E-ink とストリームするサーバが必要だということはわかったので、そのメモです。

 

ファームウェアの user/config.c 中にあるURL を以下のように書き換えて、ファームウェアをアップ。

---- user/config.c
::
void configLoad() {
    int c;
    spi_flash_read(ESP_PARAM_SEC*SPI_FLASH_SEC_SIZE, (uint32 *)&myConfig, sizeof(MyConfig));
    c=calcChsum();
    if (c!=myConfig.chsum) {
        // os_strcpy(myConfig.url, "http://meuk.spritesserver.nl/espbm.php");
        os_strcpy(myConfig.url, "http://192.168.1.17:8266/server/espbm.php");
    }
}
::

192.168.1.17:8266 は、とりあえずosx で起動しているapache です。

本来、mode が 3 で最初に起動するときは動作し、アクセスポイントに接続したら 192.168.4.1 でアクセスできるはずなんだろうけども、そのアクセスポイントに入るパスワードが良くわからず、ソースコード中でとりあえずアクセスポイントに接続するようにしてみた。そして、esp12 に他のブラウザからアクセスしてみたのが以下。

WiFi_connection

 

Datasource の URL にあるespbm.php はおそらく、.bm をストリームするものだと思うけれども、サンプルファイル中にはなく、とりあえず変換済みの.bm ファイルにリダイレクトするものを用意。具体的には、以下のようなもの。

<?php
fpassthru(fopen("../html/apconnect.bm", "r"));
exit(0);
?>

これが正しいのかどうかは、今のところ不明ですが、こうしてみると、シリアル通信は、以下のようになります。

★Reset 後の UART の内容
::

 ets Jan  8 2013,rst cause:4, boot mode:(3,7)

wdt reset
load 0x40100000, len 31640, room 16 
tail 8
chksum 0x70
load 0x3ffe8000, len 2572, room 0 
tail 12
chksum 0x06
ho 0 tail 12 room 4
load 0x3ffe8a10, len 3528, room 12 
tail 12
chksum 0x7d
csum 0x7d
rlDatasource http://192.168.1.17:8266/server/espbm.php
mode : sta(18:fe:34:9b:99:a3)
add if0
scandone
reconnect
scandone
add 0
aid 5
pm open phy_2,type:2 0 0
cnt 

connected with JunkHackAP, channel 6
dhcp client start...
No heap available, failed to malloc 440★ヒープがないとさ。IPがとれていない
Wdt. This takes too long. Go to sleep.
del if0
usl
sul 3 0
rm mismatch
pm close 7 0 0/17956334
deep sleep 60s★一回スリープするが、

.árl.lœž|.Œlà|....Œ.lì.b|Ž‚.ì.’r’blŽbŒònnžlnnœâì.b.pìŽlrlrl.‚rò’nàbânbp.ü
★60秒後に起きた時には動作せず。

うーん、おしいところまではきていますが、何かがおかしいですね。

テストのために、ソースコードには以下の変更がしてあります。

1) 3.1V 以下でも動作するように定数を書き換え

2) 初回 mode(3) のアクセスポイントに入るパスワードが不明で、接続するよう設定してある

 

なんか、2の変更がまずそうかもしれません。

まぁ、でもここまでで、以下の事が、ぼやっとですがわかりました。

 

▼まとめ

・ESP12 から表示するURLは指定でき、そこから画像をストリームして表示しているだろう。

・ESP12 に表示させる画像は、別サーバから取得していることがわかった。

・初回ブートかどうかを判別させる、RTC_MAGICコード部分はうまく動作している

・初回アクセスポイントの設定に行ったとき、開発ボードのLED は光り、画像出力pin へはデータが流れているようだ。

 

▼不明なこと

・前回不明だったことがまだクリアされていない。

・最初の起動時に、192.168.4.1 で mode(3) のステーションで起動してくるが、このときのwifi アクセスポイントに入るパスワードは?

・EPS12 が設定を終えれば、定期間隔でWEB サーバを見に行くが、この処理はどうやればいいのか?

最初の部分は、ESP8266 の挙動を知れば解決できるかもしれないです。wifi_set_opmode(3); からリスタートがかかるときの挙動というか、サンプルにあるWEBサーバの挙動がどうなるか調査することに。

後者は、推測なのでなんとも言えないのですが、今のところ以下のように考えています。

・800×600 の画像を.bm の形式でストリームさせる。png を bm に変換させるサンプルスクリプトは、ソースコード中のmkimg.php がそれです。出力画像の部分をストリームさせればいいかと。どんなhttpヘッダーをつければいいのですかね?

<?php

//Small script to convert an 800x600 png into a .bm file the
//eink display can render from its internal espfs.

function convertImage($file, $out) {
    $im=imagecreatefrompng($file);
    $of=fopen($out, "w");
    for ($y=0; $y<600; $y++) {
        for ($x=0; $x<800; $x+=8) {
            $b=0;
            for ($z=0; $z<8; $z++) {
                $b<<=1;
                $c=imagecolorat($im, $x+$z, $y);
                if ((($c)&0xff)<0x80) $b|=1;
            }
            fprintf($of, "%c", $b);
        }
    }
    imagedestroy($im);
    fclose($of);
}

convertImage("icons/apconnect.png", "html/apconnect.bm");
//convertImage("★ソース画像", "★出力画像");

?>

espeink make その4

続きをやっています。昨日、esptool は C 製のを使うことがわかったので今回は実際に ESP12 に書き込んでみます。

まだ、PCB ボードは作っていませんが、開発ボードにとりあえず書き込めるかやってみようと思います。

 

書き込む開発ボードは、以下のものです。他2台は、以前にあれこれやっている最中に3.3V 以上入れすぎて壊れたようです。2台は昇天しましたので、正常なのはこれと、あと未開封のが1つあります。

dev

 

さて、ソースディレクトリに移動し、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 ディスプレイがないとこれ以上の確認はちょっと厳しいです。できなくはないですが、あとは現場合わせで楽しんでもいいかなぁと。