タイトルだけで、ほとんど分かってしまうような内容ですが・・
Raspberry Pi Pico(および他のRP2040搭載マイコン基板)の開発環境・言語は
・Python(MicroPython, CircuitPython)
・C/C++
・Arduino IDE(earlephilhower版)
・Arduino IDE(Mbed OS RP2040版[公式版])
があります。以下は Arduino IDE(Mbed OS RP2040版[公式版])で経験したことです。
以前は動いたのに・・・
■ 2年前に作成して動作実績のあるコードを流用して別のものを作ろうとしたのですが、下図のようにラズパイPicoにOLEDを2本の線でI2C接続するという単純なものが動作しません。
・LEDは点滅するけどOLEDは真っ暗。
・電源OK。配線もOK。
・コードは昔動いた実績あるもの、変更なし。
・部品はたぶん壊れてない。と思いたい(やや不安)・・
調査したところ RP2040 ライブラリをアップデート (2.2.0 ⇒ 3.4.1) した際に pins_arduino.h のピン定義が変更されていたことが判明しました。
・・って「あ、な~んだそーゆーことか~」と読めば1秒だけど、分かるまでちょっと、かなり、結構、相当な、莫大な、めっちゃ時間がかかりました。迷宮入りだと放置してたけど半年後に再挑戦して辿り着いたのです。
RP2040 ライブラリのバージョンによるpins_arduino.h のピン定義の違い
下記のようにシリアル送受信のピンは変わりませんが、SPIとI2Cは変更されてます。
pins_arduino.hから抜粋
#define PIN_SERIAL_TX (0ul)
#define PIN_SERIAL_RX (1ul)
// SPI
#define PIN_SPI_SCK (2u)
#define PIN_SPI_MOSI (3u)
#define PIN_SPI_MISO (4u)
#define PIN_SPI_SS (5u)
// Wire
#define PIN_WIRE_SDA (6u)
#define PIN_WIRE_SCL (7u)
// Serial
#define PIN_SERIAL_TX (0ul)
#define PIN_SERIAL_RX (1ul)
// SPI
#define PIN_SPI_MISO (16u)
#define PIN_SPI_MOSI (19u)
#define PIN_SPI_SCK (18u)
#define PIN_SPI_SS (17u)
static const uint8_t SS = PIN_SPI_SS; // SPI Slave SS not used. Set here only for reference.
static const uint8_t MOSI = PIN_SPI_MOSI;
static const uint8_t MISO = PIN_SPI_MISO;
static const uint8_t SCK = PIN_SPI_SCK;
// Wire
#define PIN_WIRE_SDA (4u)
#define PIN_WIRE_SCL (5u)
■なるほど、これじゃ動かないわけだ! ということで配線を2本入れ替えたら動作しました。やれやれ・・
■ ネットにはラズパイPico等のRP2040のマイコン基板でI2CやSPIを使用したシステムの動作記事を多く見かけます。ハードもソフトも、これら動作検証済みの記事の通りに製作したのに動作しない! という場合、原因としてpins_arduino.h のピン定義がネット記事の環境と自分の環境で異なるのかもしれません。
pins_arduino.h ファイルはどこにある?
■ 私の環境では下記2つのディレクトリにありました。\mbed_rp2040\の次にバージョンがあります。
C:\Users\user\Documents\ArduinoData\packages\arduino\hardware\mbed_rp2040\3.4.1\variants\RASPBERRY_PI_PICO
C:\Users\user\AppData\Local\Arduino15\packages\arduino\hardware\mbed_rp2040\4.0.8\variants\RASPBERRY_PI_PICO
■ Arduino IDEのアップデートも、ライブラリのアップデートも何度か実施している関係で同じものがあるものと思います。
■ mbed_rp2040 のバージョンは 3.4.1 と 4.0.8 と異なりますが、Winmergeで比較したところ内容は全く同じでした。
■ pins_arduino.h ファイルが複数存在して、ピン定義の内容が異なる場合は一つずつ試すとよいでしょう。
[参考]ラズパイPicoのピン配置図
I2CのピンはI2C0系とI2C1系があり、それぞれ6組、計12組あります。
I2C0:
[GP0/GP1]、[GP4/GP5]、[GP8/GP9]、 [GP12/GP13]、[GP16/GP17]、[GP20/GP21]
I2C1:
[GP2/GP3]、[GP6/GP7]、[GP10/GP11]、[GP14/GP15]、[GP18/GP19]、[GP26/GP27]
【関連記事】