こんにちは、あろっちです。
Seeed Studio XIAO RP2350を入手したので試してみました。
本記事ではArduino(C/C++)で試してみます。
開発環境としてVSCodeを使うこともできます。
参考URL:
スペック (XIAO RP2040との比較)
製品 | XIAO RP2040 | XIAO RP2350 |
---|---|---|
プロセッサ | RP2040 | RP2350 |
デュアル Cortex-M0+ @ 133MHz | デュアル Cortex-M33 @ 150MHz、FPU | |
RAM | 264kB SRAM | 520kB SRAM |
フラッシュメモリ | 2MBオンボード | 2MB PSRAM |
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 |
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
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などシリアルポートから書き込みできない環境の場合、手動でスケッチを書き込みできます。
サンプルプログラム (Arduinoスケッチ)
LED Lチカ
XIAO RP2350のユーザLEDをLチカするスケッチです。
ユーザLEDは、HIGHで消灯、LOWで点灯となっています。※負論理
現在、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のピンに変更してスケッチを書き込みます。
ピンの定義を以下のように変更します。
#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のピンに変更してスケッチを書き込みます。
ピンの定義を以下のように変更しました。
// グラフィックボードのピン配置(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のファームウェアは最新(v2.0.1)にしています。
デバッグするにはXIAO拡張ボードを使用します。
SWDの配線はXIAO RP2040と同じです。
最後に
XIAO RP2040と互換性はありそうです。
RP2350にはE9で報告されている入力ピンの不具合があるため、XIAO RP2350でも同様の現象は発生することを確認しました。
この点は今のところ回避できなさそうですね。
RP2350 E9については以下の記事をご参照ください。
関連記事
当ブログのマイコン記事です。ぜひご覧ください。
コメント