このところ、Groveコネクタご本家のSeeed社製のGroveモジュール、マイコンをいくつか手に入れました。4ピンのGroveコネクタ、物理的なコネクタ形状は皆互換なので、接続しようとすれば皆接続できてしまう。けれども、電気的に接続OKかどうなのかは、回路をよく調べてから接続しないといけないです。勿論、それを制御するソフトに変更が必要なこともままあります。今回は、Grove化されたBMP280圧力センサを異なるGroveホストに接続してみます。
※「部品屋根性」投稿順Indexはこちら
Groveコネクタは「マイコン使った電子工作する時」に非常に便利なコネクタではないかと思います。高々4ピンのコネクタで、いろいろなセンサモジュールやらアクチュエータなどがArduinoなどのマイコンボードに簡単接続可能、そのうえ制御用のソフトウエア・ライブラリも揃っているものが多く、とても便利。しかし、以前M5StackのGroveコネクタについて調べてみたことがありましたが、物理的に接続すれば「とりあえず」動くものも多いけれど、マズイ場合もありそう、という見解にいたりました。その原因は、同一のコネクタだけれども、
-
- コネクタに出ている電源電圧が異なることがある
- コネクタに出ている端子の信号レベルも異なる
- コネクタに出ている端子の機能も異なる
ぶっちゃけ、便利な分、結構「何でもあり」のコネクタに見えます。手元にあるホスト側のGroveポートを備えたマイコンボードから以下3点を選んでみました。
-
- Seeeduino Lotusボード、Arduino Uno互換ボード
- Wio Terminal、Arduino Uno互換に見える高機能なマイコン端末
- M5Stack、Arduino環境でソフト開発可能な高機能なマイコン端末
アイキャッチ画像を御覧ください。一番、左のSeeeduino Lotusボードは、一瞬Arudino基板に被せて使用する「シルード」にも見えますが、Seeed社製のArduino Uno互換のマイコン・ボードです。ボード形状やArduino拡張端子などはご本家とコンパチでありつつ、ご本家にはないGroveコネクタを12個も搭載しております。搭載しているマイコンは、Arduino Uno同様のATmega328マイコンなので電気的、ソフトウエア的にも互換性はバッチリ、ただし基板をコンパクトにまとめるためにマイコンはオリジナルのDIPでなく表面実装パッケージ品であります。また、USBコネクタは小さくなり、ACアダプタ用のコネクタなどは省略されています。真ん中は、同じくSeeed社製のWio Terminalですが、こちらはUnoと同じくマイクロチップ製のマイコンを搭載していると言っても、Arm Cortex-M4F搭載のATSAMD51です。Arduinoの開発環境内では限りなくArduino Unoに似た感じでプログラム可能です。しかし、プログラムメモリのサイズだけでもUnoの16倍、RAMにいたっては96倍もの容量が使えます。LCD画面やら無線やらセンサやらUnoには乗っていないものもいろいろ搭載。Groveコネクタは側面に2個を備えています。右端のM5Stackは皆さんご存知でしょう。無線マイコンとして人気者のESP32を搭載。こちらもLCE画面やら無線やらいろいろ搭載。Groveコネクタは側面に1個です。
さて、これら3つのマイコンボードのGroveインタフェースについてまとめると以下のようになります。
-
- Seeeduino Lotusボード、5V電源、IO電圧も5V
- Wio Terminal、3.3V電源、IO電圧も3.3V
- M5Stack、5V電源、IO電圧は3.3V
また、機能的にもLotusボードは、12個もGroveコネクタを持つので
-
- デジタル
- アナログ
- I2C
- UART
の全機能そろい踏みなのに対して、Wio TerminalはI2Cとデジタル/アナログ兼用が各1、M5StackはI2Cのみです。3者に共通するGroveインタフェースは、I2Cになるので、I2Cで接続できるモジュールを1つ取り出しました。
Bosch製圧力センサ BMP280搭載のGroveモジュール
です。以前にもBMP280搭載のGroveモジュールを取り上げさせていただいたことがあったですが、そのときの温湿度センサとコンボになったモジュールとは違うモジュールです。単体BMP280のみを搭載した
Grove Begineer Kit for Arduino に付属のGrove 圧力センサモジュール
中央にある、銀色の、小さな穴の開いているパッケージがBMP280です。さて、このモジュールの回路を、Seeed社の回路図を元に(水魚堂さんエディタで)書きなおしたものが以下であります。
今回ターゲットのセンサ、BMP280はティピカル1.8V電源のデバイスです。1.8V電源で動かしているんだけれど、IO電圧は3.3Vが良いな~という場合には、VDD1.8VでVDDIO端子に3.3V与えて動かすこともできるみたい。消費電力のことなど気にしなければ電源3.3V(MAX3.6V)でも動作可能なので、VDDとVDDIOの両方に3.3Vを与えて使うこともできます。今回はそれ。上の説明のように、Seeduino Lotusボードは5V電源、5VIOなので、
-
- Groveモジュール上のLDOレギュレータで5Vから3.3Vを作っている
- IO電圧3.3VのBMP280とIO電圧5VのLotusボードの間にNch MOSFETを挿入してI2Cバスの電圧に「折り合い」をつけている
です。I2CバスのHigh側はプルアップ抵抗で吊り上げます。MOSFETのLotus側は5Vで、BMP280は3.3Vで吊り上げています。MOSFETのゲートには3.3Vが掛かっているので、5V側の「高い」電圧が直接BMP280の端子に加わることはありません。それに対してMOSFETはどちらかの再度でLowに引く分には電圧をしっかり伝えてくれるので、双方向に伝達可能。
というわけでこのGroveモジュールをSeeeduino Lotusボードに接続する場合、問題なく動作する、というわけです。Seeed社のサンプルプログラムを元に書いた制御ソフトはこちら。
#include "Seeed_BMP280.h" #include <Wire.h> BMP280 bmp280; void setup() { Serial.begin(9600); if (!bmp280.init()) { Serial.println("BMP280 init error."); } } void loop() { float pressure; Serial.print("Temp: "); Serial.print(bmp280.getTemperature()); Serial.println("C"); Serial.print("Pressure: "); Serial.print(pressure= bmp280.getPressure()); Serial.print("Pa"); Serial.println("\n"); delay(5000); }
さて、このモジュールをM5Stackに接続する場合を考えます。
-
- M5StackのGroveコネクタに出ている電源は5VなのでOK
- IO電圧は3.3V
です。IO電圧はSeeduino Lotusとは異なりますが、MOSFETのところの回路を考えると、両側がHigh=3.3Vでも何の問題もない筈。実際、このモジュールをM5StackのGroveコネクタに接続しても問題なく動作します。制御ソフトウエアもほとんど一緒ですが、ハードウエアがM5Stackであるので、僅かな修正が必要です。上記をこんな感じに書き換えて動作させました。
#include <M5Stack.h> #include "Seeed_BMP280.h" #include <Wire.h> BMP280 bmp280; void setup() { M5.begin(); Serial.begin(9600); if (!bmp280.init()) { Serial.println("BMP280 init error."); } } void loop() { float pressure; Serial.print("Temp: "); Serial.print(bmp280.getTemperature()); Serial.println("C"); Serial.print("Pressure: "); Serial.print(bmp280.getPressure()); Serial.print("Pa"); Serial.println("\n"); delay(5000); }
流石Arduino環境、ハードウエア・プラットフォームが変わってもほとんど同じソースで動作させることが可能。
最後に、Wio TerminalのGroveコネクタへの接続を考えます。
-
- Wio TerminalのGroveコネクタに出ている電源は3.3V
- IO電圧は3.3V
この電源3.3Vのために、今回は「見送り」であります。裸のBMP280であれば、3.3V電源、3.3VIOで問題ないのですが、対象のGroveモジュールにはLDO(ロウ・ドロップアウト)レギュレータが搭載されており、BMP280の電源はそいつが生成しています。いくらLDOといっても、レギュレータの入力電圧と出力電圧の差はある程度ないと動作しない筈。回路図記載のデバイスを調べてみると
最低でも電位差1Vないと安定に動作しない
ようです。3.3Vがターゲット電圧なので、ざっくり4.3V以上の電圧を与えないと「動作が不安定」になる可能性あり、と。
まあ、ゆるゆると各種Groveモジュールを調べてまいりたいと思います。