題名からネタバレですが、
今回ArduinoIDEを使ってRaspberryPiPicoのI2C通信を試してみました。
ArduinoIDEなので、使用するライブラリはWire.h
そもそもI2C通信しようにも、
【スレーブのデバイスが認識できない】という問題にぶち当たったので、
いまのところ無理そうというのが結論です。
2022年2月3日追記: setを追加することによりI2C通信できることが確認できました。
もちろんmicroPythonでは問題なく通信できますから、
どうしてもI2C通信が必要な場合は、
多少手間でもmicroPythonを使うことをオススメします。
以下試したことと結果です。
Youtubeチャンネルにさまざまな動画を上げています。
↓↓↓こちらからYoutubeチャンネルにアクセス!! ↓↓↓
今回も登場MCP23017
今回も登場させてみました。
IOエキスパンダと呼ばれるI2C通信でIO端子の増設ができるICです。
これまでRaspberryPi【Python】、RaspberryPiPico【microPython】の組み合わせでは
制御方法や配線方法は紹介してきましたが、
今回は新しい試みとして、RaspberryPiPico【ArduinoIDE】
という組み合わせで挑戦してみました。
ちなみに今までの記事はこちら↓↓↓
どちらも問題なく動作しています。
配線方法
RaspberryPiPicoとMCP23017の配線方法ですが、
以前記事にしたときに配線したものを丸ごと流用しています。
というかブレッドボードに挿しっぱなしだったのでそのまま使っています。
具体的な配線はこちらです。
MCP23017のスレーブアドレスは0x20で、
LEDはGPA0につなげています。
とりあえずmicroPythonで動いていた配線のそのまんまという感じです。
接続されたデバイスのI2Cアドレスの取得方法
それではまず上記の配線状態でI2Cのスレーブアドレスを確認しましょう。
※もちろん一度配線したら、もう配線関係は一切触りません。
まずはやったことのあるmicroPythonで調べる。
microPythonでの接続されたスレーブのアドレスの確認方法は以前ご紹介しましたので、
具体的な方法についてはそちらを参照してください↓↓↓
結果としては、0d32つまり0x20というアドレスに
スレーブが接続されていますよ。と教えてくれます。
次にArduinoIDEで調べる。
では、まったく同じ配線の状態で、
ArduinoIDEでWire.hを使用して、
接続されているMCP23017のスレーブアドレスを調べましょう。
ArduinoIDEでは、Arduino Playgroundのこの記事が参考になります。
ソースは以下のようになっています。
一部コメントアウトされているところなどは省略しています。
2022年2月3日追記:setの項目を追加することにより動作確認済み。
#include <Wire.h>
void setup()
{
Wire.setSDA(8);//()の中身はGP番号。配線によって異なります。
Wire.setSCL(9);//()の中身はGP番号。配線によって異なります。
Wire.begin(); // Wire communication begin
Serial.begin(9600); // The baudrate of Serial monitor is set in 9600
while (!Serial); // Waiting for Serial Monitor
Serial.println("\nI2C Scanner");
}
void loop()
{
byte error, address; //variable for error and I2C address
int nDevices;
Serial.println("Scanning...");
nDevices = 0;
for (address = 1; address < 127; address++ )
{
// The i2c_scanner uses the return value of
// the Write.endTransmisstion to see if
// a device did acknowledge to the address.
Wire.beginTransmission(address);
error = Wire.endTransmission();
if (error == 0)
{
Serial.print("I2C device found at address 0x");
if (address < 16)
Serial.print("0");
Serial.print(address, HEX);
Serial.println(" !");
nDevices++;
}
else if (error == 4)
{
Serial.print("Unknown error at address 0x");
if (address < 16)
Serial.print("0");
Serial.println(address, HEX);
}
}
if (nDevices == 0)
Serial.println("No I2C devices found\n");
else
Serial.println("done\n");
delay(5000); // wait 5 seconds for the next I2C scan
}
コピー&ペーストするだけで動作します。
で、ここからが問題なのですが、
このスケッチは、シリアルの窓に接続されているI2Cデバイスのアドレスを
表示してくれるものなのですが、
結果はこちら。↓↓↓
はい、何もつながっていないことになっています。
【配線は何も変えていない】ですから、何かしらArduinoIDE側で対策しないといけなさそうです。
ただ、I2C通信自体、Wire.hというライブラリをそのまま使わせてもらっている関係上、
これ以上調べることができませんでした….
2022年2月3日追記:しっかりと0x20というアドレスを認識できるようになりました。
まとめ
ArduinoIDEでRaspberryPiPicoが制御できるんだったら
結構簡単にできて初心者にも安心だな…
なんて思っていましたが、I2C通信のようなちょっとオプションチックなところは
まだまだ非対応のようです。
とりあえずRaspberryPiPicoの能力を十分に発揮させたいなら、
現状はmicroPythonとcircuitPythonしかないような気もします….
今後I2C通信にも対応してくれると使う人も増えそうですね。
※ここから2022年2月3日追記
setSDAとsetSCLを追記することによってあっさり解決しました….
これでRaspberyPiPicoをArduinoIDEで使用している人も安心ですね。
そのうちRaspberryPiPicoとArduinoIDEの組み合わせで、
IOエキスパンダー(MCP23017)の制御をやってみようと思います。
コメント
I2C成功おめでとうございます。IO増設に加えてI2CでEEPROM追加にも再挑戦して頂きたいです。宜しければよろしくお願いします。
コメントありがとうございます。
EEPROM挑戦してみます!
実は既に入手済みなのであとは配線してコード書くだけですので少々お待ちください。