Seeed Studio XIAO RP2350を試してみました【Arduino使用】

Raspberry Pi/電子工作
スポンサーリンク

こんにちは、あろっちです。

Seeed Studio XIAO RP2350を入手したので試してみました。

本記事ではArduino(C/C++)で試してみます。

開発環境としてVSCodeを使うこともできます。

参考URL:

XIAO RP2350 - Raspberry Pi RP2350, MicroPython-Ready, 19 GPIOs, Onboard RGB LED, Arm Cortex-M33 and Hazard3 RISC-V
The XIAO RP2350 packs the power of the Raspberry Pi RP2350 (switchable architecture of dual Arm Cortex-M33 cores running...
Getting Started with Seeed Studio XIAO RP2350(MicroPython) | Seeed Studio Wiki
XIAO RP2350, a cutting-edge microcontroller from Seeed Studio. It features a dual-core processor, increased SRAM and fla...
スポンサーリンク

スペック (XIAO RP2040との比較)

製品XIAO RP2040XIAO RP2350
プロセッサRP2040RP2350
デュアル Cortex-M0+ @ 133MHzデュアル Cortex-M33 @ 150MHz、FPU
RAM264kB SRAM520kB 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.8mm21×17.8mm

Seeed Studio XIAO RP2040については以下の記事をご参照ください。

ピン配列

LEDGPIO
ユーザーLED25
RGB LED_POWER23
RGB LED22

RGB LEDを使用するには

RGB LEDの電源であるGPIO23をHIGHに引き上げる必要があります。

  pinMode(23, OUTPUT);
  digitalWrite(23, HIGH);

画像ギャラリー

Seeed Studioお馴染みの袋に入っています
ピンヘッダー実装後
XIAO RP2040(左)とXIAO RP2350(右)

Seeed Studio XIAO RP2040については以下の記事をご参照ください。

USBマスストレージモード

BOOTボタンを押した状態で、リセットボタンを押すと、USBマスストレージモード(RP2350)になります。

USBマスストレージモードの時に、PCからMicroPythonやCircuitPythonのファームウェアなどがインストールできます。

MicroPython

MicroPython - Python for microcontrollers
MicroPython is a lean and efficient implementation of the Python 3 programming language that includes a small subset of ...

CircuitPython

CircuitPython - Seeed Studio XIAO RP22350 Download
The XIAO RP2350 packs the power of the Raspberry Pi RP2350 (switchable architecture of dual Arm Cortex-M33 cores running...

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
VCC3.3V
GNDGND
DIND10
CSD7
CLKD8

ピクチャーフレーム

1.3インチCSなしLCDを使っています

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
GNDGND
VCC3.3V
SCLD8
SDAD10
RESD1
DCD0
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)にしています。

参考URL:
https://www.raspberrypi.com/documentation/microcontrollers/debug-probe.html#updating-the-firmware-on-the-debug-probe

デバッグするにはXIAO拡張ボードを使用します。
SWDの配線はXIAO RP2040と同じです。

画像はXIAO RP2040ですがXIAO RP2350も同様に配線します

最後に

XIAO RP2040と互換性はありそうです。
RP2350にはE9で報告されている入力ピンの不具合があるため、XIAO RP2350でも同様の現象は発生することを確認しました。
この点は今のところ回避できなさそうですね。

RP2350 E9については以下の記事をご参照ください。

関連記事

当ブログのマイコン記事です。ぜひご覧ください。

コメント

タイトルとURLをコピーしました