chakokuのブログ(rev4)

テック・コミック・DTM・・・ごくまれにチャリ

luaを乗せたESP8266(NodeMCU)でI2C通信する

BOSCHの温湿度・気圧センサーBME280を搭載したボードとESP8266をI2Cで接続、luaに組み込まれたi2cモジュールを使ってIDレジスタ(address:0xD0)をReadしてみた。。期待値は0x60だけど読めた値は0、、、、はぁこれではだめだ。オシロで調べると原因を特定できると思うけど、GPIOのピン番号を間違っているか、デバイスアドレスを間違っているか。。

以下がソース、i2c.setupで、I2C_Data:GPIO6、I2C_CLK:GPIO05を指定、デバイスアドレス:0x76の番地:0x0D(ID Register)をリードする例 (node mcu サンプルより引用してるので、開発側の意図そのまま)


> i2c.setup(0,6,5,i2c.SLOW)
> i2c.start(0)
> i2c.address(0,0x76,i2c.TRANSMITTER)
> i2c.write(0,0xd0)
> i2c.stop(0)
> i2c.start(0)
> i2c.address(0,0x76,i2c.RECEIVER)
> c = i2c.read(0,1)
> i2c.stop(0)
> print(string.byte(c))
0
オシロで見る限り、それらしい信号が出ている。なのに、なぜセンサーデバイスは応答しないのか。。(補足:正しく認識されると、9発目のCLKに同期してデバイスからACK(DATA=L)が返るはずだが、そうなっていない)

とよく見ると、センサーボードに電源が正しく繋げられてなかった。ブレッドボードの溝を誤解していた(ブレッドボードの縦の溝にはジャンパ飛んでないのに)。なんたる初歩的なミス。。
再度スクリプトを実行。

前半省略
> print(string.byte(c))
96
それらしい値が返っている。meadow上のemacs lispでHEX変換してみる。。

(format "%x" 96)
"60"
というわけで、、ESP8266とセンサーボードまでのI2Cによる疎通はOK

SDKとCでスクラッチからコードを書くのもいいけど、スクリプトで周辺IOを叩くと実行してすぐにOK/NGが判明するのでTurn Around Timeが非常に短くていい。組み込み入門もまずはluaでLチカしたらいいのでは?とも思えた。

レジスタが読めたので、あとはソフトだけの世界(あぁ楽だ)。。センサデータの変換サンプルコードはC言語版やPython版で公開されているので、変換アルゴリズムLuaに書き換えれば、気温・気圧・湿度がセンシングできるはず。ESP8266上のLuaも安定しているので、Lua言語にどっぷりはまってみる予定でございます。

■追記(160325)

Luaを学ぶべく解説本を買った。Luaの全てが載っているということだけど、、bit演算とか書かれていないような。。

Programming in Lua プログラミング言語Lua公式解説書

Programming in Lua プログラミング言語Lua公式解説書

■追記(160417)

なんと、NodeMCUのライブラリ群にすでにBME280用のAPIが用意されていた。言うなれば、、これまでの取り組みは徒労だ。。まぁ勉強になったのでいいけど。
http://nodemcu.readthedocs.org/en/dev/en/modules/bme280/#bme280-module

■ご参考URL
I2Cモジュールサンプルコード
http://nodemcu.readthedocs.org/en/dev/en/modules/i2c/#example
I2Cは制御方法がシンプルで分かりやすい。。
ピン番号リスト
http://nodemcu.readthedocs.org/en/dev/en/modules/gpio/#gpio-module
BME280の変換ソース(SwitchScience様提供)
https://github.com/SWITCHSCIENCE/BME280

Chrome上で動作するLua Web IDE
https://chrome.google.com/webstore/detail/lua-web-ide/imcadgiofccfolmogolfjnahpphaepfe?hl=ja
ブレークやステップ等は提供されないので、シリアルコンソールでの作業とほとんど変わらないけど、コードをESP8266(NodeMCU)にアップロードしてくれるのでちょっとだけ楽

lua manual(5.3)
http://www.lua.org/manual/5.3/

http://lua.tips/index.php?LuaTips

I2C仕様書
http://www.nxp.com/documents/user_manual/UM10204_JA.pdf
I2C解説ページ(電子工作の実験室 様)
http://www.picfun.com/c15.html