概要
ATOMシリーズでのI2C利用を確認してみました。とくにEchoではピンでのI2Cができないと記述されていたので検証してみました。
結果
ちょっと前にブログで使ったI2C接続の画面があったので、接続してみました。ちょうどピンの配置的にそのままさせました!
EchoのGPIO25、21でもI2Cは使えますね。ただし販売ページには使えないと書いてあるので、使わないほうが無難だと思います。
スピーカーとかマイクが搭載されている別基板がEchoには内蔵されていて、そこに21と25も引き回されているんですよね。なので普通のGPIOよりノイズなどの影響を受けやすいのかもしれません。
接続方法(ピン側)
ATOM | I2C |
GND | GND |
3V3 or 5V | VCC |
GPIO25 | SDA |
GPIO21 | SCL |
一例になります。一般的には3V3で接続するほうが正しいです。テストで使った画面は5Vでないと動かないものなので5Vを接続しています。
Echoの場合には動くかもしれませんが、非推奨です。Matrixの場合にはIMU(MPU6886)が0x68のアドレスですでに接続されているので注意してください。
#include <Wire.h> void setup() { Serial.begin(115200); Wire.begin(25, 21); } void loop() { Serial.println("I2C Scan"); for (int address = 1; address < 127; address++) { Wire.beginTransmission(address); int error = Wire.endTransmission(); if (error == 0) { Serial.printf("%02X", address); } else { Serial.print(" ."); } if (address % 16 == 0) { Serial.print("\n"); } delay(10); } Serial.print("\n\n"); delay(1000); }
I2Cアドレスをスキャンするスケッチ例です。ピン側は2系統あるI2Cの1系統目のWireクラスを使ってアクセスするのがよいと思います。
接続方法(GROVE側)
ATOM | I2C |
GND | GND |
5V | VCC |
GPIO26 | SDA |
GPIO32 | SCL |
GROVE側はVCCが5V固定なので注意しましょう。接続先によっては3.3Vでないといけない場合があります。
#include <Wire.h> void setup() { Serial.begin(115200); Wire1.begin(26, 32); } void loop() { Serial.println("I2C Scan"); for (int address = 1; address < 127; address++) { Wire1.beginTransmission(address); int error = Wire1.endTransmission(); if (error == 0) { Serial.printf("%02X", address); } else { Serial.print(" ."); } if (address % 16 == 0) { Serial.print("\n"); } delay(10); } Serial.print("\n\n"); delay(1000); }
GROVE側でI2Cを使う場合には2系統目のWire1クラスを使うのがよいと思います。
複数使えるの?
2系統までであればWireとWire1で違うピンを割り当てれば同時に使えます。ATOM MatrixがすでにGPIO25、21をWireで使っているので、Wire1を他のピンに割り振ることになります。
2系統目のI2CはGrove側だけでなく、ピン側の22、19、23、33などにも割り振ることが可能です。
3系統以上は同時には利用できませんが、begin()関数で初期化からやり直せば他のピンに割り振ることが可能です。
まとめ
ATOM EchoでI2Cがなぜ非推奨なのかはわかりませんが、公式ではGROVE側を使ってくれと案内しています。
どこかで機種別のクイックリファレンスを1ページでまとめたいと思います。。。
コメント