PR

ArduinoIDEでラズパイピコのI2C通信【現状:無理→可能】

pico-arduino-i2c-eyecatch

題名からネタバレですが、

今回ArduinoIDEを使ってRaspberryPiPicoのI2C通信を試してみました。

ArduinoIDEなので、使用するライブラリはWire.h

そもそもI2C通信しようにも、

【スレーブのデバイスが認識できない】という問題にぶち当たったので、

いまのところ無理そうというのが結論です。

2022年2月3日追記: setを追加することによりI2C通信できることが確認できました。

もちろんmicroPythonでは問題なく通信できますから、

どうしてもI2C通信が必要な場合は、

多少手間でもmicroPythonを使うことをオススメします。

以下試したことと結果です。

この記事を読むことでわかること

自己紹介

東証一部上場企業でサラリーマンしてます。

主に工場(生産現場)で使用する検査装置のアプリケーション開発してます。

ヒトの作業を自動化して簡略化するアプリケーションを日々開発中。

2022年5月に転職。現役バリバリの技術者です。
現在は超大手企業の新規事業分野で装置の研究・開発をしています。

Youtubeチャンネルにさまざまな動画を上げています

↓↓↓こちらからYoutubeチャンネルにアクセス!! ↓↓↓

今回も登場MCP23017

今回も登場させてみました。

IOエキスパンダと呼ばれるI2C通信でIO端子の増設ができるICです。

MCP23017
MCP23017

これまでRaspberryPi【Python】、RaspberryPiPico【microPython】の組み合わせでは

制御方法や配線方法は紹介してきましたが、

今回は新しい試みとして、RaspberryPiPico【ArduinoIDE】

という組み合わせで挑戦してみました。

ちなみに今までの記事はこちら↓↓↓

どちらも問題なく動作しています。

配線方法

RaspberryPiPicoとMCP23017の配線方法ですが、

以前記事にしたときに配線したものを丸ごと流用しています。

というかブレッドボードに挿しっぱなしだったのでそのまま使っています。

具体的な配線はこちらです。

mcp23017_raspberryPico
raspberryPiPicoとMCP23017を配線してLEDをつけられるようにした。

MCP23017のスレーブアドレスは0x20で、

LEDはGPA0につなげています。

mcp23017-pin
MCP23017のピン配置【データシートより】

とりあえずmicroPythonで動いていた配線のそのまんまという感じです。

接続されたデバイスのI2Cアドレスの取得方法

それではまず上記の配線状態でI2Cのスレーブアドレスを確認しましょう。

※もちろん一度配線したらもう配線関係は一切触りません。

まずはやったことのあるmicroPythonで調べる。

microPythonでの接続されたスレーブのアドレスの確認方法は以前ご紹介しましたので、

具体的な方法についてはそちらを参照してください↓↓↓

結果としては、0d32つまり0x20というアドレスに

スレーブが接続されていますよ。と教えてくれます。

micropython-i2caddress
Thonnyでスレーブアドレスを確認した結果。

次にArduinoIDEで調べる。

では、まったく同じ配線の状態で、

ArduinoIDEでWire.hを使用して、

接続されているMCP23017のスレーブアドレスを調べましょう。

ArduinoIDEでは、Arduino Playgroundのこの記事が参考になります。

Arduino Playground - I2cScanner

ソースは以下のようになっています。

一部コメントアウトされているところなどは省略しています。

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デバイスのアドレスを

表示してくれるものなのですが、

結果はこちら。↓↓↓

raspicoi2cnotfound
arduinoIDEでRaspberryPiPicoにつながっているI2Cデバイスをスキャンした結果。

はい、何もつながっていないことになっています。

【配線は何も変えていない】ですから、何かしらArduinoIDE側で対策しないといけなさそうです。

ただ、I2C通信自体、Wire.hというライブラリをそのまま使わせてもらっている関係上、

これ以上調べることができませんでした….

2022年2月3日追記:しっかりと0x20というアドレスを認識できるようになりました。
raspicoI2CArduino
ArduinoIDEでI2C通信(mcp23017)のアドレスが取得できた。

まとめ

ArduinoIDEでRaspberryPiPicoが制御できるんだったら

結構簡単にできて初心者にも安心だな…

なんて思っていましたが、I2C通信のようなちょっとオプションチックなところは

まだまだ非対応のようです。

とりあえずRaspberryPiPicoの能力を十分に発揮させたいなら、

現状はmicroPythonとcircuitPythonしかないような気もします….

今後I2C通信にも対応してくれると使う人も増えそうですね。

※ここから2022年2月3日追記

setSDAとsetSCLを追記することによってあっさり解決しました….

これでRaspberyPiPicoをArduinoIDEで使用している人も安心ですね。

そのうちRaspberryPiPicoとArduinoIDEの組み合わせで、

IOエキスパンダー(MCP23017)の制御をやってみようと思います。

コメント

  1. 高橋憲政 より:

    I2C成功おめでとうございます。IO増設に加えてI2CでEEPROM追加にも再挑戦して頂きたいです。宜しければよろしくお願いします。

    • hobbyhappy hobbyhappy より:

      コメントありがとうございます。
      EEPROM挑戦してみます!
      実は既に入手済みなのであとは配線してコード書くだけですので少々お待ちください。

タイトルとURLをコピーしました