こんにちは、あろっちです。
Seeed Studio XIAO RP2350を入手したので試してみました。
本記事ではArduino(C/C++)とMicroPythonで試してみます。
開発環境としてVSCodeを使うこともできます。
参考URL:


スペック (XIAO RP2040との比較)
製品 | XIAO RP2040 | XIAO RP2350 |
---|---|---|
プロセッサ | RP2040 | RP2350 |
デュアル Cortex-M0+ @ 133MHz | デュアル Cortex-M33 @ 150MHz、FPU | |
RAM | 264kB SRAM | 520kB SRAM |
フラッシュメモリ | 2MBオンボード | 2MBフラッシュ |
LEDについて | ユーザー LED 1 個、電源 LED 1 個、シリアル ポート ダウンロード用 LED 2 個、RGB LED 1 個 | ユーザー LED 1 個、電源 LED 1 個、RGB LED 1 個 |
インターフェース | 11ピン: 4xADC、11xデジタル、1xI²C 、1xUART 、1xSPI 、すべてPWM | 19ピン: 3xADC、19xデジタル、2xI²C 、2xUART、2xSPI、すべてPWM |
ボタン | リセットボタンx1、ブートボタンx1 | リセットボタンx1、ブートボタンx1 |
セキュリティ | – | OTP、セキュアブート、Arm TrustZone |
低消費電力 | – | 27μA |
ソフトウェアの互換性 | C/C++ / Micropython / Arduino / CircuitPythonをサポート | C/C++ / Micropython / Arduino / CircuitPythonをサポート |
動作温度 | -20℃ -70℃ | -20℃ -70℃ |
寸法 | 21×17.8mm | 21×17.8mm |
Seeed Studio XIAO RP2040については以下の記事をご参照ください。
ピン配列



LED | GPIO |
---|---|
ユーザーLED | 25 |
RGB LED_POWER | 23 |
RGB LED | 22 |
GPIO0(D6) ON/OFF繰り返しテストの結果

B-A 40ns

Raspberry Pi Pico 2と同様の結果でした。
RGB LEDを使用するには
RGB LEDの電源であるGPIO23をHIGHに引き上げる必要があります。
pinMode(23, OUTPUT);
digitalWrite(23, HIGH);
画像ギャラリー



Seeed Studio XIAO RP2040については以下の記事をご参照ください。
USBマスストレージモード
BOOTボタンを押した状態で、リセットボタンを押すと、USBマスストレージモード(RP2350)になります。
USBマスストレージモードの時に、PCからMicroPythonやCircuitPythonのファームウェアなどがインストールできます。
MicroPython
現在、XIAO RP2350は安定バージョンのファームウェアが使えないようなので、以下のプレビュー版のファームウェアをご使用ください。
RP2350 MicroPython Firmware Preview
CircuitPython

Arduino IDEの設定
- Arduino IDEにボードを追加
※実施済みの場合、この手順は不要です。
事前にRaspberry Pi Pico/RP2040ボード(Arduino-Pico)を追加します。
追加方法は、以下の記事をご覧ください。
- Raspberry Pi Pico/RP2040ボード(Arduino-Pico)のインストール
[ツール] > [ボード] > [ボードマネージャ]をクリックし、検索ボックスに「rp2040」と入力し、[Raspberry Pi Pico/RP2040]ボード(バージョン4.2.1以降)をインストールします。
- ボードの選択
[ツール] > [ボード] > [Raspberry Pi RP2040(Ver)※] > [Seeed XIAO RP2350]を選択します。
※(Ver)の表示はArduino IDE 1系のみ
- シリアルポートの選択
[ツール] > [シリアルポート]からXIAO RP2350が接続されているシリアルポートを選択します。
Chromebookなどシリアルポートから書き込みできない環境の場合、手動でスケッチを書き込みできます。
Wire定義の修正 (Raspberry Pi Pico/RP2040ボード(Arduino-Pico) バージョン4.4.4以降)
Raspberry Pi Pico/RP2040ボード(Arduino-Pico) バージョン4.4.4でWire1が定義されましたが、背面パッドのI2CがWireで定義されたため、I2CのデフォルトピンがWire1に定義された状態になっています。
I2CデフォルトピンをWire、背面パッドのI2CをWire1と定義するには、pins_arduino.hのWire定義を以下のように修正してください。
なお、I2CデフォルトピンをWire1で使用する場合は、修正は不要です。
// Wire
#define __WIRE0_DEVICE (i2c1)
#define PIN_WIRE0_SDA (6u)
#define PIN_WIRE0_SCL (7u)
#define SDA PIN_WIRE0_SDA
#define SCL PIN_WIRE0_SCL
#define I2C_SDA (SDA)
#define I2C_SCL (SCL)
#define __WIRE1_DEVICE (i2c0)
#define PIN_WIRE1_SDA (16u)
#define PIN_WIRE1_SCL (17u)
pins_arduino.hの場所
OS | 場所 |
---|---|
Windows (アプリ版) | C:¥Users¥ユーザ名¥AppData¥Local¥Arduino15¥packages¥rp2040¥hardware¥rp2040¥バージョン¥variants¥seeed_xiao_rp2350¥pins_arduino.h |
Mac | /Users/ユーザ名/Library/Arduino15/packages/rp2040/hardware/rp2040/バージョン/variants/seeed_xiao_rp2350/pins_arduino.h |
サンプルプログラム (Arduinoスケッチ)
LED Lチカ
XIAO RP2350のユーザLEDをLチカするスケッチです。
ユーザLEDは、HIGHで消灯、LOWで点灯となっています。※負論理
Raspberry Pi Pico/RP2040ボード(Arduino-Pico) バージョン4.4.0までのSeeed XIAO RP2350ボードはLED_BUILTIN定数が定義されていないため、LEDのGPIOである25を直接指定しています。
int led = 25;
// the setup function runs once when you press reset or power the board
void setup() {
// initialize digital pin LED_BUILTIN as an output.
pinMode(led, OUTPUT);
}
// the loop function runs over and over again forever
void loop() {
digitalWrite(led, LOW); // turn the LED on (LOW is the voltage level)
delay(1000); // wait for a second
digitalWrite(led, HIGH); // turn the LED off by making the voltage HIGH
delay(1000); // wait for a second
}
RGB LED Lチカ
RGB LEDをLチカします。
ライブラリにAdafruit NeoPixelを使用しています。
#include <Adafruit_NeoPixel.h>
#define LED_POWER 23
#define LED_PIN 22
#define COLOR_REPEAT 2
// create a pixel strand with 1 pixel on PIN_NEOPIXEL
Adafruit_NeoPixel pixels(1, LED_PIN);
uint8_t color = 0, count = 0;
uint32_t colors[] = {pixels.Color(255, 0, 0), pixels.Color(0, 255, 0), pixels.Color(0, 0, 255), pixels.Color(255, 255, 255)};
const uint8_t COLORS_LEN = (uint8_t)(sizeof(colors) / sizeof(colors[0]));
void setup() {
pinMode(LED_POWER, OUTPUT);
digitalWrite(LED_POWER, HIGH);
pixels.begin(); // initialize the pixel
pixels.setBrightness(0xff / 20);
}
void loop() {
pixels.setPixelColor(0, colors[color]);
pixels.show();
delay(1000);
pixels.clear();
pixels.show();
delay(1000);
count++;
if(count >= COLOR_REPEAT) {
count = 0;
color++;
if(color >= COLORS_LEN) {
color = 0;
}
}
}
レインボー
RGB LEDをレインボーに光らせるスケッチです。
ライブラリにAdafruit NeoPixelを使用しています。
#include <Adafruit_NeoPixel.h>
#define LED_POWER 23
#define LED_PIN 22
#define MAX_BRIGHTNESS 255
Adafruit_NeoPixel pixels(1, LED_PIN);
int rgbValues[] = {MAX_BRIGHTNESS, 0, 0}; // 0=Red, 1=Green and 2=Blue
int upIndex = 0, downIndex = 1;
void setup()
{
pinMode(LED_POWER, OUTPUT);
digitalWrite(LED_POWER, HIGH);
pixels.begin(); // initialize the pixel
pixels.setBrightness(0xff / 20);
}
void loop()
{
rgbValues[upIndex] += 1;
rgbValues[downIndex] -= 1;
if (rgbValues[upIndex] > MAX_BRIGHTNESS)
{
rgbValues[upIndex] = MAX_BRIGHTNESS;
upIndex = upIndex + 1;
if (upIndex > 2)
{
upIndex = 0;
}
}
if (rgbValues[downIndex] < 0)
{
rgbValues[downIndex] = 0;
downIndex = downIndex + 1;
if (downIndex > 2)
{
downIndex = 0;
}
}
pixels.setPixelColor(0, pixels.Color(MAX_BRIGHTNESS - rgbValues[0], MAX_BRIGHTNESS - rgbValues[1], MAX_BRIGHTNESS - rgbValues[2]));
pixels.show();
delay(5);
}
一撃入魂
B(BOOTSEL)ボタンを押すと、1/2でレインボーに光るというスケッチです。
・ルール
チャンスは1回、ボタン押下時に抽選
再チャレンジしたい場合は、リセットボタンを押してみてください。
・RGB LEDの状態について
ボタン入力受付は、白点滅
抽選演出は、赤で表現
抽選結果は、当選時 > レインボー、落選時 > フェードアウト
#include <Arduino.h>
#include <Adafruit_NeoPixel.h>
// #define BTN D1
#define LED_POWER 23
#define LED_PIN 22
#define TOGGLE_PERIOD (1000u)
#define LED_STAND_BY_COLOR 0xffffff
#define LED_READY_COLOR 0xff0000
Adafruit_NeoPixel pixels(1, LED_PIN);
uint8_t rgbValues[7][3] = {
{ 255, 0, 0 }, { 255, 165, 0 }, { 255, 255, 0 }, { 0, 128, 0 }, { 0, 255, 255 }, { 0, 0, 255 }, { 128, 0, 128 }
};
int16_t randNumber;
int16_t brightness = 0;
int16_t fadeAmount = 10;
void toggleLED_nb(void) {
static bool toggle = true;
static auto lastToggle = millis(); // saved between calls
auto now = millis();
if (now - lastToggle > TOGGLE_PERIOD) {
if (toggle) {
pixels.setPixelColor(0, LED_STAND_BY_COLOR);
pixels.setBrightness(18);
pixels.show();
} else {
pixels.clear();
pixels.show();
}
toggle = !toggle;
lastToggle = now;
}
}
void readyLED() {
for (uint8_t i = 0; i < 3; i++) {
brightness = 0;
pixels.clear();
pixels.show();
delay(100);
for (uint8_t j = 0; j < (100 / fadeAmount); j++) {
pixels.setPixelColor(0, LED_READY_COLOR);
pixels.setBrightness(brightness);
pixels.show();
brightness = brightness + fadeAmount;
delay(80);
}
delay(1000);
}
brightness = 150;
pixels.setPixelColor(0, LED_READY_COLOR);
pixels.setBrightness(brightness);
pixels.show();
delay(3000);
}
void successLED() {
for (uint8_t i = 0; i < 8; i++) {
for (uint8_t j = 0; j < 7; j++) {
pixels.setPixelColor(0, pixels.Color(rgbValues[j][0], rgbValues[j][1], rgbValues[j][2]));
pixels.setBrightness(/*255 / 2*/ 18);
pixels.show();
delay(50);
}
}
}
void failureLED() {
while (0 < brightness) {
pixels.setPixelColor(0, LED_READY_COLOR);
pixels.setBrightness(brightness);
pixels.show();
brightness = brightness - fadeAmount;
delay(80);
}
pixels.clear();
pixels.show();
delay(200);
pixels.setPixelColor(0, LED_READY_COLOR);
pixels.setBrightness(10);
pixels.show();
delay(150);
}
void setup() {
pinMode(LED_POWER, OUTPUT);
digitalWrite(LED_POWER, HIGH);
pixels.begin();
// HW乱数生成(RP2350)
rp2040.hwrand32();
while (!BOOTSEL) {
toggleLED_nb();
delay(10);
}
// 抽選
randNumber = (int16_t)rp2040.hwrand32();
readyLED();
if (randNumber < 0) {
// おめでとう
successLED();
} else {
// 残念
failureLED();
}
pixels.clear();
pixels.show();
}
void loop() {
}
当選時
RP2350内部温度センサーの温度を7セグ(MAX7219)に表示する
RP2040-Zeroの記事に掲載しているスケッチをXIAO RP2350のピンに変更してスケッチを書き込みます。
ピンの定義を以下のように変更します。
#define LD_CS D7
#define LD_TX D10
#define LD_SCK D8
7セグ(MAX7219) | GPIO |
---|---|
VCC | 3.3V |
GND | GND |
DIN | D10 |
CS | D7 |
CLK | D8 |

ピクチャーフレーム


Raspberry Pi Pico 2の記事に掲載しているスケッチをXIAO RP2350のピンに変更してスケッチを書き込みます。
ピンの定義を以下のように変更しました。
// グラフィックボードのピン配置(XIAO用)
#define TFT_MISO -1
#define TFT_MOSI D10
#define TFT_SCLK D8
// #define TFT_CS 17 // Chip select control pin
#define TFT_DC D0 // Data Command control pin
#define TFT_RST D1 // Reset pin (could connect to RST pin)
// ST7789の場合バックライト(ピン)はプルアップされるのでコメント
// #define TFT_BL 22
LCD(1.3インチCSなしST7789) | GPIO |
---|---|
GND | GND |
VCC | 3.3V |
SCL | D8 |
SDA | D10 |
RES | D1 |
DC | D0 |
BLK | 未接続 |
スケッチを書き込む際にFlash Size: 16MB(Sketch: 15MB, FS:1MB)を選択してください。

フラッシュメモリが16MBあるような感じになっていますが、実際は2MBです。

スケッチ書き込み後、画像ファイルをアップロードします。
アップロード手順についてもRaspberry Pi Pico 2の記事をご参照ください。
デバッグについて
Raspberry Pi Pico/RP2040ボード(Arduino-Pico)(バージョン4.2.1)でRaspberry Pi Debug Probeが使用できました。
Raspberry Pi Debug Probeのファームウェアは最新にしています。
デバッグするにはXIAO拡張ボードを使用します。
SWDの配線はXIAO RP2040と同じです。

また、Raspberry Pi Picoをデバッグプローブにしてデバッグすることもできます。

サンプルプログラム (MicroPython)
OLEDにバッテリーの電圧を表示する

こちらのWikiのBattery & Power Managementのバッテリー電圧をOLEDに表示するように改修しました。
バッテリーを接続するためにXIAO拡張ボードを使用します。
from machine import Pin, ADC, I2C
from ssd1306 import SSD1306_I2C
import time
# Function to initialize the GPIO pin for enabling battery voltage reading
def init_gpio():
enable_pin = Pin(19, Pin.OUT)
enable_pin.value(1) # Set the pin to high to enable battery voltage reading
def main():
print("ADC Battery Example - GPIO29 (A3)")
# Initialize OLED (I2C pins: I2C1 SCL=7, SDA=6)
i2c = I2C(1, scl=Pin(7), sda=Pin(6))
oled = SSD1306_I2C(128, 64, i2c) # OLED resolution: 128x64
init_gpio() # Initialize the enable pin
adc = ADC(Pin(29)) # Initialize the ADC on GPIO29
conversion_factor = 3.3 / (65535) # Conversion factor for 16-bit ADC and 3.3V reference
while True:
result = adc.read_u16() # Read the ADC value
voltage = result * conversion_factor * 2 # Calculate the voltage, considering the voltage divider (factor of 2)
# Print to console
print("Raw value: 0x{:03x}, voltage: {:.2f} V".format(result, voltage))
# Display on OLED
oled.fill(0) # Clear the display
oled.text("Battery Voltage:", 0, 0)
oled.text("{:.2f} V".format(voltage), 0, 20)
oled.show()
time.sleep(0.5) # Delay for 500 milliseconds
if __name__ == '__main__':
main()
バッテリーで駆動すると以下のように表示されます。


なお、市販のバッテリーはマイコン用と極性が反対ですが、極性は入れ替えられます。
以下の記事をご参照ください。
最後に
XIAO RP2040と互換性はありそうです。
RP2350でE9に報告されている入力ピンの不具合について、XIAO RP2350でも同様の現象が発生することを確認しました。
この点は今のところ回避できなさそうですね。
RP2350 E9については以下の記事をご参照ください。
関連記事
当ブログのマイコン記事です。ぜひご覧ください。
コメント