アイキャッチ画像にブレッドボードにM5Stackが刺さっているかのような写真を掲げましたが、よく見ればブレッドボード風のユニバーサル基板であります。載っているのはPCA9306、NXP製のレベル変換ICです。これで安心してI2Cで拡張できるので、まずはI2C接続MAPをM5ezでGUI表示。
※「IoT何をいまさら」投稿順Indexはこちら
前回、ラズパイの拡張端子をちょっと使いやすくしただけで、がぜんやる気がでました。今回は同様な「てこ入れ」をM5Stackに施したいと思います。もともと信号の取り出しが非常に便利にできているM5Stackなので、物理的な取り出しというより、電気的にイージーにしたいというのが今回の目論見であります。
とりあえず作成途上の「ブレッドボード風」拡張基板を御覧ください。L字ピンソケットでM5Stackに接続させております。これで間違って信号を接続するようなことはありますまい(基板が正しければですが。)
そして基板上に、まず第1に搭載いたしましたのは、NXPセミコンダクタ製のPCA9306チップ、Dual bidirectional I2C-bus and SMBus voltage-level translatorを搭載した秋月製のブレークアウトボードであります。接写した基板の様子が下に。
以前からずっと気になっていたM5StackのGroveコネクタの電圧の問題、「信号は3.3Vなのに電源は5Vが出ている」を安全な接続に変えたいという意図であります。この基板は、異なる電圧のI2Cバスを接続できるものです。これにより、3.3V信号と5V電源というミスマッチを取り除き、5V信号、5V電源にしておきたいです。
なお、別稿にも書きましたが、この変換はNchのMOSFETがあればできまする。でも表面実装の小さなデバイスをユニバーサル基板に半田付けするのは老眼の目に結構辛い。その点秋月製のPCA9306用ブレークアウトボードは楽でした。ただデフォルトで接続されている1kのプルアップ抵抗、私は取り外したかったのでパターンカットしました。そう出来るパターンなのですが、これが細かくて老眼には辛いもの。どうせピンヘッダを半田付けするのだから、プルアップ使うときは半田を盛る、方が私にはよかった。。。
さて、この「拡張基板」によりM5StackのI2C信号を、5V信号-5V電源でも、3.3V信号-3.3V電源でも取り出せるようになりました(元が3.3V信号で、3.3V電源も近くに出ているので、3.3Vで統一したいときには変換IC不要。)
折角なので、5V用のボードを取り付けて動作をみてみたい。ということで取り出したのが、Arduino Uno用のGroveインタフェース(5V信号、5V電源)化されたBMP280センサボード。BMP280は3.3V系のデバイスですが、ボード上に5Vから3.3Vのレギュレータやら、レベル変換用のMOSFETのっているもの。M5StackとPC9306、BMP280の接続を回路図にするとこんな感じ。
さらに調べたかったのが、M5Stackに内蔵されているI2C接続のデバイスとちゃんと共存しているよね、という確認。ぶちゃけ、外付けのI2Cデバイスのアドレスがバッティングしていたりすると動かない。
かなり昔に1度つかったことがあるI2CバスのSCANのソースがあったので、それで確かめたい。ついては、一度GUIの便利さにハマると止められないので、その辺の操作は全てM5ezでGUI化することにいたしました。まあ、後でMQTTでNode-RED接続するときも楽だし。既にあるM5ezでつくったコードにSensorsというタイトルでサブメニューを追加し、とりあえずその中で操作することにいたしました(追加したサブメニューの部分のソースを末尾に掲げました。)
サブメニューの様子がこちら。
I2CSCANを実行したときの画面の様子がこちら。7ビットアドレス0x00から0x7Fをスキャンしたもの。行が0x00から0x70、列が下の0からF。0と表示されているアドレスはデバイス不在に見える部分、1はデバイスからレスポンスが返ってきているところ。
-
- 0x77 「拡張ボード」から外部にぶら下がっている圧力センサ、BMP280
- 0x75 内蔵電源管理チップ、IP5306
- 0x68 内蔵加速度、角速度センサ MPU6886 または MPU9250
ちゃんと、BMP280と内蔵のI2Cインタフェースのデバイス共存しているっぽいです。しかし、手元のM5Stack Gray搭載の加速度センサの種類、確かめてなかったです。後でこれも調べて置かないと。
一方、PC9306を介し、さらにその先のFETも介して接続しているBMP280ですが、読んでみるとちゃんと読めているっぽい。。。Node-REDでグラフ描かせる題材にはもってこいか?
やっぱり信号繋ぎやすくなると、やる気になるのだな。
IoT何をいまさら(79) Python, threadingとasyncioなLチカ に戻る
IoT何をいまさら(81) PiZeroで撮った写真をNode-REDでWeb表示 に進む
// Sensor submenu BMP280 bmp280; void initSensors() { if (!bmp280.init()) { ez.msgBox("ERROR:", "BMP280 init.", "Ok"); } } void sensorSubmenu() { ezMenu subMenu("Sensors"); subMenu.addItem("I2CSCAN", scanI2C); subMenu.addItem("BMP280", readBMP280); subMenu.addItem("Back | Back to main menu"); subMenu.run(); } void scanI2C() { bool result[0x80]; ez.header.show("I2C map"); ez.canvas.font(&FreeMono9pt7b); ez.canvas.lmargin(7); M5.I2C.scanID(&result[0]); ez.canvas.println(" 0.2.4.6.8.A.C.E."); for (int i = 0; i<8; i++) { ez.canvas.print("0x"); ez.canvas.print(i); ez.canvas.print("0 "); for (int j = 0; j<16; j++) { if (result[i*16+j]) { ez.canvas.print("1"); } else { ez.canvas.print("0"); } } ez.canvas.println(); } ez.canvas.println(); ez.buttons.wait("OK"); } void readBMP280() { ez.header.show("BMP280"); ez.canvas.font(&FreeMono12pt7b); ez.canvas.lmargin(7); ez.canvas.print("Temp: "); ez.canvas.print(bmp280.getTemperature()); ez.canvas.println("C"); ez.canvas.print("Pressure: "); ez.canvas.print(bmp280.getPressure()); ez.canvas.print("Pa"); ez.canvas.println("\n"); ez.buttons.wait("OK"); }