Seeed XIAO RP2040のフルカラーLED2種類を制御する

# やること
Seeed社のRP2040マイコンXAIA RP2040に標準搭載されているフルカラーLEDとNeoPixelを制御します。
いわゆるLチカですが、6色すべてを光らせたいと思います。
今回はArduino IDE 1.8.XXを使って制御します。Python等で制御する場合はピン番号の記述等が異なる可能性があります。
![XIAO_RP2040_LED.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/103709/ff1f8dc0-33b1-0972-345b-03542a97652b.png)

# 必要なもの
- Seeed XIAO RP2040
- ArduinoIDE 1.8.XXのインストールされたパソコン

今回はWindows10とArduino IDE 1.8.13を使用します。
![XIAO_RP2040_USB.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/103709/cd5c6032-015e-52a1-3802-903eef9bbcf6.png)


# 書き込み準備
## ボードを追加する
「環境設定」から「追加のボードマネージャのURL」に
「https://files.seeedstudio.com/arduino/package_seeeduino_boards_index.json」
を追加する。（説明画像用意してないです）

Arduino IDE のボードマネージャから「Seeed XIAO RP2040」をインストールします。
![XIAORP2040_01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/103709/1fea739a-13d4-6e7d-2675-c14f65ef8b6a.png)

今回は1.9.3で確認しています（画像はインストール済みの状態です）。
![XIAORP2040_02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/103709/eb0bfdef-eb2a-08d4-0118-5881f770d59c.png)
※2022/6/9追記
現在、バージョン2.7.2とバージョン1.12.0がインストールできるようです。
詳細に検証してないですが、2.7.2のバージョンでは後で説明するsetup1()やloop1()がcore1の処理に割り当てられていない可能性があります。（何にも紐づいていない新しい関数を定義しているとコンパイラが解釈している）
ArduinoIDEからマルチコアを利用するにはバージョン1.x.x系統を使用した方がよさそうです。

ボードが「Seeed XIAO RP2040」で選択されていることを確認します。
![XIAORP2040_03.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/103709/5883eed9-886e-daa9-86f7-68ea228cf5d4.png)

## ライブラリを追加する
Arduino IDE のライブラリマネージャから「Adafruit NeoPixel」をインストールします。
![XIAORP2040_05.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/103709/989539b8-1043-fb79-ca86-e12bab21fcb4.png)

今回は1.10.1で確認しています（画像はインストール済みの状態です）。
![XIAORP2040_04.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/103709/7952a6ee-ad2d-2cb9-77ab-9c25e904d091.png)


# 書き込む
以下のサンプルコードをコピペして書き込みます。

フルカラーLEDとNeoPixelそれぞれ
R　→　G　→　B　→　白
の順で光るはずです。
![XIAO_RP2040_LED2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/103709/ced60218-1b12-883f-af66-466e543a5ac3.png)

```cpp:XIAO_RP2040_LEDTest.ino
// 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を別のコアで制御するように記述しています。

```cpp:Multicore.ino
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_XIAO_RP2040.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/103709/7028a895-7fd5-a141-4dc1-3f2eeade525d.png)

全体的にXIAO RP2040の方が高性能ですのでXIAOの在庫は今後なくなっていくと推測されます。
このように完全な互換ではないので従来のXIAOで書いていたスケッチがそのまま適用できない可能性があり、従来型のXIAOを使いたい人は早めに在庫を抑えた方がよさそうです。

## 読み方
XIAO シャオ
Adafruit エイダフルート

## 外部リンク
### Seeed社 公式wiki

https://wiki.seeedstudio.com/XIAO-RP2040-with-Arduino/

公式によるArduino IDEでの使い方を解説したページです。

### Adafruit NeoPixelLibrary

https://adafruit.github.io/Adafruit_NeoPixel/html/class_adafruit___neo_piLibrary 

NeoPixelのライブラリの使い方です。

### 販売ページ
https://akizukidenshi.com/catalog/g/gM-17044/

https://www.marutsu.co.jp/pc/i/2229736/

https://www.switch-science.com/catalog/7634/