概要
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ページでまとめたいと思います。。。



コメント