PRを含みます

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

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

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

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

Seeed Studio XIAO RP2040は、MCUにRP2040を搭載したXIAOで、Seeeduino XIAOとピン配置/形状に互換性があるのが特徴です。
フラッシュメモリの容量(2MB)などRaspberry Pi Picoに近いスペックに見受けられます。

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

Raspberry Pi Pico/RP2040/RP2350ボード(Arduino-Pico) Ver.1.13.2より正式にSeeed XIAO RP2040ボードがサポートされました。

本記事はこのボードの使用を前提にしています。

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

参考URL:

Seeed Studio XIAO RP2040 - Supports Arduino, MicroPython and CircuitPython
XIAO RP2040 is a compact, Arduino-compatible dev board based on Raspberry Pi RP2040. As the smallest Raspberry Pi Pico b...
Getting Started with Seeed Studio XIAO RP2040 | Seeed Studio Wiki
Overview

他のRP2040搭載Seeeduino XIAO互換のマイコンに、Adafruit QT Py RP2040がありますが、こちらは、フラッシュメモリ8MB、QTコネクタ搭載という特徴があります。

Adafruit QT Py RP2040については記事にしていますので、よろしければご覧ください。

Seeed Studio XIAO RP2350の記事を書きました。

Raspberry Pi Pico Wの記事を書きました。ぜひご覧ください。

RP2040搭載ボードまとめ記事(参考サイト)

Seeed XIAO BLE nRF52840 / Sense(参考サイト)

Seeed Studio XIAO ESP32C3(参考サイト)

スポンサーリンク

スペック

  • Seeeduino XIAO互換のピン配置/形状
  • USB Type-C
  • ユーザLED(RGB 3色)、RGB LED、電源LED
  • リセットボタン
  • ブートローダーセレクトボタン
  • ソフトウェアは、Arduino、MicroPython、CircuitPythonをサポート
MCURP2040 デュアルコア ARM Cortex M0+プロセッサ、最大動作周波数 133 MHz
フラッシュ
メモリ
2MB
GPIO11
・11xディジタル&PWM, 4xアナログ対応(12bit ADC)
サイズ20×17.5×3.5mm
左からSeeeduino XIAO、Adafruit QT Py、Seeed XIAO RP2040、Adafruit QT Py RP2040、Adafruit QT Py ESP32-S2、Seeed XIAO BLE Sense

現在のXIAOシリーズの正式名称について

ピン配列

GPIOのピン番号は、FRONTのMicropythonで示された番号(Pxx)です。

LEDGPIO(ピン番号)
LED(赤, TX)17
LED(緑, RX)16
LED(青, ユーザLED)25
RGB LED_POWER11
RGB LED12

XIAO RP2040 回路図

RGB LEDを使用するには

RGB LEDを使用する場合、電源であるGPIO11をHIGHに引き上げる必要があります。

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

Seeed XIAO RP2040ボードには、RGB LED用の定数(NEOPIXEL_POWER)が定義されていて、この定数を使って次のようにHIGHにできます。

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

画像ギャラリー

1 x XIAO RP2040
2 x ピンヘッダ 7ピン

初回起動はこんな感じです。

ピンヘッダー実装後

他のXIAO系ボードと並べてみました。

左からSeeeduino XIAO、Adafruit QT Py、Seeed XIAO RP2040、Adafruit QT Py RP2040、Adafruit QT Py ESP32-S2、Seeed XIAO BLE Sense

現在のXIAOシリーズの正式名称について

USBマスストレージモード

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

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

XIAO RP2040 with MicroPython

MicroPython | Seeed Studio Wiki
Seeed Studio XIAO RP2040 with MicroPython

XIAO RP2040 with CircuitPython

CircuitPython | Seeed Studio Wiki
Seeed Studio XIAO RP2040 with CircuitPython

MicroPythonでPicoインベーダーを再現するとこんな感じです。

XIAO 拡張ボードとGroveのボリュームを使っています。
電源にはリチウムイオンバッテリーを使ってみました。

Picoインベーダーについては以下の記事をご覧ください。

Arduinoボード設定

  • Arduino IDEにボードを追加
    ※実施済みの場合、この手順は不要です。

事前にRaspberry Pi Pico/RP2040/RP2350ボード(Arduino-Pico)を追加します。
追加方法は、以下の記事をご覧ください。

  • Raspberry Pi Pico/RP2040/RP2350ボード(Arduino-Pico)のインストール

[ツール] > [ボード] > [ボードマネージャ]をクリックし、検索ボックスに「rp2040」と入力し、[Raspberry Pi RP2040 Boards(バージョン1.13.2以降)]をインストールします。

  • ボードの選択

[ツール] > [ボード] > [Raspberry Pi RP2040 Boards(Ver)※] > [Seeed XIAO RP2040]を選択します。
※(Ver)の表示はArduino IDE 1系のみ

バージョン2.4.0より前は、ボード名のスペルが「XAIO」です。
バージョン2.4.0以降では正しい「XIAO」に修正されています。

  • シリアルポートの選択

[ツール] > [シリアルポート]からXIAO RP2040が接続されているシリアルポートを選択します。

Chromebookなどシリアルポートから書き込みできない場合、手動でスケッチを書き込みできます。

サンプルプログラム(Arduinoスケッチ)

公式WikiサイトにArduinoの情報やサンプルスケッチがあります。

Arduino | Seeed Studio Wiki
Seeed Studio XIAO RP2040 with Arduino

また、Arduino IDEにスケッチ例([ファイル] > [スケッチ例] > [Seeed XIAO RP2040用のスケッチ例])があります。

RGB LEDを試してみました

上記のXIAO RP2040 Wikiに掲載されているRGB LEDのスケッチを試してみました。

LEDをLチカしてみる

XIAO RP2040のユーザLEDはRGB3色あります。それぞれの色をLチカするスケッチを書いてみました。
ポイントとして、ユーザLEDは、HIGHで消灯LOWで点灯となっています。※負論理

#define LED_COUNT 3
#define LED_RED 17
#define LED_GREEN 16
#define LED_BLUE 25

#define COLOR_REPEAT 2

uint8_t led[LED_COUNT] = {LED_RED, LED_GREEN, LED_BLUE};
uint8_t repeatCount = 0, ledCount = 0;

void setup()
{
  for (int i = 0; i < LED_COUNT; i++)
  {
    pinMode(led[i], OUTPUT);
    digitalWrite(led[i], HIGH); // LEDをOFFにする(HIGHでOFF)
  }
}

void loop()
{
  digitalWrite(led[ledCount], LOW);  // LOWでON
  delay(1000);                       // wait for a second
  digitalWrite(led[ledCount], HIGH); // HIGHでOFF
  delay(1000);                       // wait for a second

  repeatCount++;
  if (repeatCount >= COLOR_REPEAT)
  {
    repeatCount = 0;
    ledCount++;
    if (ledCount >= LED_COUNT)
    {
      ledCount = 0;
    }
  }
}

一撃入魂

BOOTボタンを押すと、1/2でRGB LEDがレインボーに光るというスケッチです。

後述の「XIAO 拡張ボードを試してみました」に掲載のスケッチを以下のように修正します。

117行目(入力ボタンをBOOTボタンになるよう修正します。)

//  while (digitalRead(BTN) == HIGH)
  while (!BOOTSEL)
  {

以下、落選時と当選時の流れです。

QT Py RP2040のサンプルスケッチを試してみる

RGB LEDのピン番号は、QT Py RP2040のNeoPixelと同じということが分かりました。
ということで、試しにQT Py RP2040の以下の記事のサンプルスケッチを動かしてみます。

RGB LED Lチカ

「NeoPixelをLチカしてみる」に掲載しているスケッチを書き込みました。

このようにLチカできました。スケッチの修正は不要でした。

レインボー

「NeoPixelをレインボーに光らせてみる」に掲載のスケッチを書き込みました。

こちらもスケッチの修正は不要でした。

眩しいですね。

PWMでオーディオ再生してみました (ブレッドボード使用編)

後述の「PWMでオーディオ再生してみました」のtypewriterをブレッドボードで再現してみました。

ブザーは圧電スピーカー(秋月電子)を使用しています。

OLEDは0.96インチ I2C

PWMオーディオ出力ピンはA3(GPIO29)です。

ライブラリについては以下の記事をご覧ください。

XIAO 拡張ボードを試してみました

XIAO RP2040はXIAO 拡張ボードという便利なボードが使えます。

  • OLEDディスプレイ
  • RTC
  • 拡張可能なメモリスペース
  • パッシブブザー
  • ユーザーボタン
  • Groveコネクタ
  • オンボードバッテリー管理チップなど

なにか試したい時によく使うボードですね。

使用例

PWMでオーディオ再生してみました

PWMオーディオライブラリを作ってみました。

ダウンロード&インストール方法は以下の記事をご参照ください。

スケッチ例 nt_se

スケッチ例はそのまま書き込みます。

こんな感じで再生されます。

スケッチ例 typewriter

スケッチ例はそのまま書き込みます。

キーボードショートカット(USB HIDキーボードデバイス)を再現してみました

ボタン(D1)を押すとWindowsデスクトップ表示がされるUSBキーボードを作成してみました。

#include <Keyboard.h>

#define BTN D1
#define LED LED_BUILTIN

void setup()
{
  pinMode(BTN, INPUT_PULLUP);
  pinMode(LED, OUTPUT);

  Keyboard.begin();
}

void loop()
{
  if (digitalRead(BTN) == LOW)
  {
    digitalWrite(LED, HIGH);

    //Windowsキー(KEY_LEFT_GUI)+'D'の同時押しを再現
    Keyboard.press(KEY_LEFT_GUI);
    delay(10);           //Windowsキー押下後ウエイト
    Keyboard.write('d'); //※大文字'D'はではなく、小文字の'd'を送信

    Keyboard.releaseAll();

    while (digitalRead(BTN) == LOW); //ボタンがリリースされるまで待機

    digitalWrite(LED, LOW);
  }
  delay(10);
}

一撃入魂

ボタン(D1)を押すと、1/2でレインボーに光るというスケッチです。

ルール
チャンスは1回、ボタン押下時に抽選

ということで、今回のスケッチは、あえてボタン入力の受付は1回のみとしてみました。
再チャレンジしたい場合は、リセットボタンを押してみてください。

RGB LEDの状態について

ボタン入力受付は、白点滅
抽選演出は、赤で表現
抽選結果は、当選時 > レインボー、落選時 > フェードアウト

動画は、落選時の流れです。

後述のボタン製作のところに当選時の動画を掲載しています。

#include <Adafruit_NeoPixel.h>

#define BTN D1

#define LED_POWER 11
#define LED_PIN 12

#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(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(BTN, INPUT_PULLUP);
  pinMode(LED_POWER, OUTPUT);

  digitalWrite(LED_POWER, HIGH);
  pixels.begin();
  while (digitalRead(BTN) == HIGH)
  {
    toggleLED_nb();
    delay(10);
  }

  // 抽選
  randomSeed(analogRead(A0));
  randNumber = (int16_t)random(0xffff + 1);

  readyLED();

  if (randNumber < 0)
  {
    // おめでとう
    successLED();
  }
  else
  {
    // 残念
    failureLED();
  }

  pixels.clear();
  pixels.show();
}

void loop()
{
}

デバッガーを使う

拡張ボードを使うとSWD(Serial Wire Debug)でデバッグできます。

Raspberry Pi Debug ProbeをSWDに配線

以下の記事を参照してください。

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

バッテリーで動かしてみました

拡張ボードに搭載のOLEDディスプレイとSPIのTFT(IPS) 1.54インチディスプレイを同時に表示するスケッチをバッテリーで動かしてみました。

バッテリーは、コネクタがJST PH 2.0のリチウムイオンバッテリーが使用できます。
XIAO 拡張ボードは、充電にも対応しています。

XIAO拡張ボードのバッテリーコネクタではなく、電圧変換モジュールを使ってTFT 4.0インチ(ILI9486)のベンチマーク(LovyanGFXのスケッチ例 > test > TFT_graphicstest_PDQ)をバッテリーで動かしてみました。

単三乾電池2本

リチウムイオンバッテリー

電圧変換モジュールの製作については以下の記事をご覧ください。

パッシブブザーでメロディを鳴らしてみる

スケッチ例から[rp2040] > [ToneHappyBirthday]を選択します。

ブザーのピンをA3に書き換えて、スケッチを書き込みます。

// pin_buzzer should be defined by the supported variant e.g CPlay Bluefruit or CLUE.
// Otherwise please define the pin you would like to use for tone output
#ifndef PIN_BUZZER
#define PIN_BUZZER    A3
#endif

QT Py RP2040の記事に掲載している「パッシブブザーでメロディを鳴らしてみる」のスケッチも試してみました。

こちらもメロディー再生できました。

ボタンを製作してみました

タクトスイッチを組み込んだボタンを製作してみました。

製作過程については、以下の記事にまとめてみました。

ガチャポンボタンで手元スイッチを作る(参考サイト)

キーボードショートカット(USB HIDキーボードデバイス)を再現してみました

本記事に掲載のボタンを押すとWindowsデスクトップ表示がされるUSBキーボードのスケッチをこのボタンに組み込んであるXIAO RP2040に書き込んで動かしてみました。

一撃入魂

本記事に掲載の一撃入魂スケッチをこのボタンで動かしてみました。

このボタンでは、直接リセットボタンを押せないため、ガチの1回抽選を再現できたのではないでしょうか。

最後に

USB HIDデバイス(例: マウスやキーボード)の製作、XIAO 拡張ボードを使ったラピッドプロトタイピングなどいろいろと応用できそうですよね。

RP2040搭載ボードの中では比較的安価なのも嬉しいポイントですね。

ということで、お気に入りのマイコンがまた一つ増えました。

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

コメント

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