IoT何をいまさら(80) M5Stack、BB風拡張PCA9306搭載

Joseph Halfmoon

アイキャッチ画像にブレッドボードにM5Stackが刺さっているかのような写真を掲げましたが、よく見ればブレッドボード風のユニバーサル基板であります。載っているのはPCA9306、NXP製のレベル変換ICです。これで安心してI2Cで拡張できるので、まずはI2C接続MAPをM5ezでGUI表示。

前回、ラズパイの拡張端子をちょっと使いやすくしただけで、がぜんやる気がでました。今回は同様な「てこ入れ」をM5Stackに施したいと思います。もともと信号の取り出しが非常に便利にできているM5Stackなので、物理的な取り出しというより、電気的にイージーにしたいというのが今回の目論見であります。

とりあえず作成途上の「ブレッドボード風」拡張基板を御覧ください。L字ピンソケットでM5Stackに接続させております。これで間違って信号を接続するようなことはありますまい(基板が正しければですが。)

M5_handmadeExtBoardそして基板上に、まず第1に搭載いたしましたのは、NXPセミコンダクタ製のPCA9306チップ、Dual bidirectional I2C-bus and SMBus voltage-level translatorを搭載した秋月製のブレークアウトボードであります。接写した基板の様子が下に。

AE-PCA9306以前からずっと気になっていた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の接続を回路図にするとこんな感じ。

M5_PCA9306_BMP280_Schematicさらに調べたかったのが、M5Stackに内蔵されているI2C接続のデバイスとちゃんと共存しているよね、という確認。ぶちゃけ、外付けのI2Cデバイスのアドレスがバッティングしていたりすると動かない。

かなり昔に1度つかったことがあるI2CバスのSCANのソースがあったので、それで確かめたい。ついては、一度GUIの便利さにハマると止められないので、その辺の操作は全てM5ezでGUI化することにいたしました。まあ、後でMQTTでNode-RED接続するときも楽だし。既にあるM5ezでつくったコードにSensorsというタイトルでサブメニューを追加し、とりあえずその中で操作することにいたしました(追加したサブメニューの部分のソースを末尾に掲げました。)

サブメニューの様子がこちら。

SensorSubMenuI2CSCANを実行したときの画面の様子がこちら。7ビットアドレス0x00から0x7Fをスキャンしたもの。行が0x00から0x70、列が下の0からF。0と表示されているアドレスはデバイス不在に見える部分、1はデバイスからレスポンスが返ってきているところ。

M5Stack_I2CMAPbアドレスを解釈すると以下のとおりでありました。

  • 0x77 「拡張ボード」から外部にぶら下がっている圧力センサ、BMP280
  • 0x75 内蔵電源管理チップ、IP5306
  • 0x68 内蔵加速度、角速度センサ MPU6886 または MPU9250

ちゃんと、BMP280と内蔵のI2Cインタフェースのデバイス共存しているっぽいです。しかし、手元のM5Stack Gray搭載の加速度センサの種類、確かめてなかったです。後でこれも調べて置かないと。

一方、PC9306を介し、さらにその先のFETも介して接続しているBMP280ですが、読んでみるとちゃんと読めているっぽい。。。Node-REDでグラフ描かせる題材にはもってこいか?M5Stack_BMP280

やっぱり信号繋ぎやすくなると、やる気になるのだな。

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");
}