やること
Seeed社のRP2040マイコンXAIA RP2040に標準搭載されているフルカラーLEDとNeoPixelを制御します。
いわゆるLチカですが、6色すべてを光らせたいと思います。
今回はArduino IDE 1.8.XXを使って制御します。Python等で制御する場合はピン番号の記述等が異なる可能性があります。
必要なもの
- Seeed XIAO RP2040
- ArduinoIDE 1.8.XXのインストールされたパソコン
今回はWindows10とArduino IDE 1.8.13を使用します。
書き込み準備
ボードを追加する
「環境設定」から「追加のボードマネージャのURL」に
「https://files.seeedstudio.com/arduino/package_seeeduino_boards_index.json」
を追加する。(説明画像用意してないです)
Arduino IDE のボードマネージャから「Seeed XIAO RP2040」をインストールします。
今回は1.9.3で確認しています(画像はインストール済みの状態です)。
※2022/6/9追記
現在、バージョン2.7.2とバージョン1.12.0がインストールできるようです。
詳細に検証してないですが、2.7.2のバージョンでは後で説明するsetup1()やloop1()がcore1の処理に割り当てられていない可能性があります。(何にも紐づいていない新しい関数を定義しているとコンパイラが解釈している)
ArduinoIDEからマルチコアを利用するにはバージョン1.x.x系統を使用した方がよさそうです。
ボードが「Seeed XIAO RP2040」で選択されていることを確認します。
ライブラリを追加する
Arduino IDE のライブラリマネージャから「Adafruit NeoPixel」をインストールします。
今回は1.10.1で確認しています(画像はインストール済みの状態です)。
書き込む
以下のサンプルコードをコピペして書き込みます。
フルカラーLEDとNeoPixelそれぞれ
R → G → B → 白
の順で光るはずです。
// https://wiki.seeedstudio.com/XIAO-RP2040-with-Arduino/
#include <Adafruit_NeoPixel.h>
#define NUMPIXELS 1
#define NEO_PWR 11 //GPIO11
#define NEOPIX 12 //GPIO12
Adafruit_NeoPixel pixels(NUMPIXELS, NEOPIX, NEO_GRB + NEO_KHZ800);
void setup() { //core 0
pixels.begin();
pinMode(NEO_PWR,OUTPUT); digitalWrite(NEO_PWR, HIGH);
delay(200);
}
void loop() { //core 0
pixels.setPixelColor(0, pixels.Color(255, 0, 0)); pixels.show(); delay(200); //R
pixels.clear(); pixels.show(); delay(200);
pixels.setPixelColor(0, pixels.Color(0, 255, 0)); pixels.show(); delay(200); //G
pixels.clear(); pixels.show(); delay(200);
pixels.setPixelColor(0, pixels.Color(0, 0, 255)); pixels.show(); delay(200); //B
pixels.clear(); pixels.show(); delay(200);
pixels.setPixelColor(0, pixels.Color(85, 85, 85)); pixels.show(); delay(200); //W
pixels.clear(); pixels.show(); delay(200);
}
#define redled 17 //GPIO17 // //RX_LED
#define greenled 16 //GPIO16 // //TX_LED
#define blueled 25 //GPIO25 //LED_BUILTIN //YELLOW_LED
void setup1() { //core 1
pinMode(redled ,OUTPUT); pinMode(greenled ,OUTPUT); pinMode(blueled ,OUTPUT);
}
void loop1() { //core 1
digitalWrite(redled,LOW); delay(200);
digitalWrite(redled,HIGH); delay(200);
digitalWrite(greenled,LOW); delay(200);
digitalWrite(greenled,HIGH); delay(200);
digitalWrite(blueled,LOW); delay(200);
digitalWrite(blueled,HIGH); delay(200);
digitalWrite(redled,LOW); digitalWrite(greenled,LOW); digitalWrite(blueled,LOW); delay(200);
digitalWrite(redled,HIGH); digitalWrite(greenled,HIGH); digitalWrite(blueled,HIGH); delay(200);
}
注意が必要なのが、NeoPixelではない方のフルカラーLEDはGPIOをHIGHにすると消灯し、LOWにすると点灯するように実装されています。
写真では少しわかりづらいですが、フルカラーLEDの方は混色がうまくいっておらず3色光らせてもそれぞれの色が独立して認識できます。
一方、NeoPixelの方はうまく混色されており、肉眼では白色に見えます。
おまけ
RP2040のマルチコア処理
**setup()とloop()はArduinoではおなじみですが、このサンプルコードではそれとは別にsetup1()とloop1()**も使って記述しました。
プロセッサであるRP2040には2つのコアがありますので、それぞれのフルカラーLEDを別のコアで制御するように記述しています。
void setup() { //core0
}
void loop() { //core0
}
void setup1() { //core1
}
void loop1() { //core1
}
XIAOとXIAO RP2040の違い
どちらもSeeed社の小型マイコンボードです。
XIAOが先に販売されており、ほとんど同じ外形・ピン数のまま、プロセッサをArm Cortex M0+からRP2040に変える形でXIAO RP2040がリリースされました。
スペック
全般的に後発のXIAO RP2040の方がスペックアップしています。
プロセッサのコア数が1→2、動作周波数で3倍、スケッチの書き込み領域であるフラッシュメモリは8倍、変数を格納するSRAMが8倍、加えてNeoPioxelの標準搭載とRESETボタンを追加、そして価格は変わらず500円程度、と主たる性能は圧倒的に進化しましたが、そもそもプロセッサが違うので従来型のXIAOにしかない機能もあります。
DAC出力端子
XIAOにはPWMではなく電圧を出力可能なDACピンが1つありますが、XIAO RP2040にはありません。
11ピン全てのGPIOでアナログ入力可能
GPIOの数自体は変わってないですが、XIAO RP2040ではアナログ入力ピン数が11から4に減りました。
全体的にXIAO RP2040の方が高性能ですのでXIAOの在庫は今後なくなっていくと推測されます。
このように完全な互換ではないので従来のXIAOで書いていたスケッチがそのまま適用できない可能性があり、従来型のXIAOを使いたい人は早めに在庫を抑えた方がよさそうです。
読み方
XIAO シャオ
Adafruit エイダフルート
外部リンク
Seeed社 公式wiki
公式によるArduino IDEでの使い方を解説したページです。
Adafruit NeoPixelLibrary
NeoPixelのライブラリの使い方です。
販売ページ