この記事は?
RP2040搭載の安いマイコンボード Waveshare RP2040-Zeroで、Wire (I2C)とSPIにを同時に使うため、割り当てられるピンを変更しようとして結構ハマりました。対処方法を備忘録かねて記事にします。
本記事ではRP2040-Zero + Arduino IDEの環境ですが、ほかのRP2040を使ったマイコンボード(Raspberry Pi Picoなど)を使う場合でも同じようにできるんじゃないかと思います。
環境
マイコンボード:RP2040-Zero (RP2040搭載)
IDE: Arduino IDE 2.0
ライブラリ:Arduino Mbed RP2040 Boards
RP2040-Zeroについて
RP2040はRaspberry Pi財団開発のマイコンです。最近すごくホットですね。
公式SDKを利用してC/C++で開発したり、MicroPythonで開発することが多いと思います。
Arduino公式のパッケージ(Arduino Mbed RP2040 Boards)を導入するとArduino IDEで開発することができます。※1
RP2040-Zeroは、Waveshare社が販売する、RP2040搭載のマイコンボードです。
スイッチサイエンスでは700円弱、Aliexpressだと500円くらいで手に入ります。Raspberry Pi Picoよりちょっと安いですね。
価格そうですが、一部のピンをパッドに引き出す、ボードの裏表に部品を実装するなどにより(このため表面実装はできません)、RP2040よりかなり小さいサイズもこのボードの魅力です。
Raspberry Pi Picoの21mm×51.3mmに対し、RP2040-Zeroは18mm×23.5mmです。半分くらいですね。
あとUSB Type-C接続なのが地味にうれしかったりします。
ピンの割り当てについて
RP2040はI2CおよびSPIのユニットをそれぞれ2つずつ搭載しており、それぞれの信号用端子を複数のピン組み合わせから選択して割り当てることができます。
一方、Arduino IDE + Arduino Mbed RP2040 Boardsを使用する場合、I2CおよびSPIのピン割り当てはライブラリ内であらかじめ以下のように設定・固定されています。
ピン種別 | ピン |
---|---|
I2C SDA | GP7 |
I2C SCL | GP5 |
SPI MISO | GP16 |
SPI CS | GP17 |
SPI SCK | GP18 |
SPI MOSI | GP19 |
Arduinoスケッチのsetup()
に制御が移る前に各モジュールの初期化が完了しているため、setup()
内ででピン割り当てを変更しようとするとプログラムがクラッシュしたりします。(Raspberry Pi Picoの場合、プログラムがクラッシュするとLEDが点滅します)
これを変更するには、ピンの定義をしているpins_arduino.h
を直接編集します。
pins_arduino.h
はデフォルトだとC:\Users\[ユーザ名]\AppData\Local\Arduino15\packages\arduino\hardware\mbed_rp2040\[バージョン]\variants\RASPBERRY_PI_PICO
に配置されています。
コード中の以下の箇所を、所望の設定に書き換えます。
//L45~
//SPI
#define PIN_SPI_MISO (16u)
#define PIN_SPI_MOSI (19u)
#define PIN_SPI_SCK (18u)
#define PIN_SPI_SS (17u)
//L55~
// Wire
#define PIN_WIRE_SDA (4u)
#define PIN_WIRE_SCL (5u)
それぞれのピンの名前でマクロ定義される数値を、GPIOの番号(注:ピン番号ではありません)に変更します。
例えば僕の場合、SPIをGP4~GP7、I2CをGP12,13に割り当てたかったので、以下のように編集します。
//L45~
// SPI
#define PIN_SPI_MISO (4u)
#define PIN_SPI_MOSI (7u)
#define PIN_SPI_SCK (6u)
#define PIN_SPI_SS (5u)
//L55~
// Wire
#define PIN_WIRE_SDA (12u)
#define PIN_WIRE_SCL (13u)
あとは通常通りスケッチを作成・ビルドし、ボードに焼いてやると、設定したピンでI2C/SPIが使用できます。
RP2040-Zeroを使用する場合、一部マイコンのピンがパッドに引き出されている関係でピンアサインが干渉しやすく、デフォルトからの設定変更がほぼ必要となってきます。
このやり方でうまくピン割り当てを変更してやると、所望のモジュールが問題なく使えるようになります。
※1: Arduino IDE用RP2040パッケージは公式のものと別に非公式で有名なやつがあって、そっちの方が開発楽っぽいですね・・・そっちでもI2Cなどのピン割り当て変更できないか、時間があるときに確認してみようと思います