【サンプルコード付き】Bluetooth+6軸IMU+マイク搭載ボード"XIAO nRF52840 Sense"使ってみた

※本ページはプロモーションが含まれています

Seeed StudioのXIAO nRF52840 Senseを手に入れましたので、まずはIMUとマイクを使ってみました。
ラインナップや環境構築についてはこちらをご覧ください。

wiki.seeedstudio.com

XIAO nRF52840 Sense 主要スペック

1. 基本ハードウェア仕様

項目 内容
プロセッサ Nordic nRF52840 (ARM® Cortex™-M4F @64MHz)
ワイヤレス通信 Bluetooth 5.0, Zigbee, Thread, ANT, NFC(要別売アンテナ)
メモリ 1MB Flash / 256KB RAM
ストレージ 2MB QSPI Flash (オンボード)
インターフェース 1x UART, 1x I2C, 1x SPI, 1x NFC, 11x GPIO(PWM), 6x ADC
ボタン 1x リセットボタン
LED 1x 充電状態LED, 1x RGB LED

2. 内蔵センサー(Senseモデルのみ)

センサー種別 型番 / 詳細
6軸IMU (慣性計測装置) LSM6DS3TR-C (3軸加速度 + 3軸ジャイロ)
デジタルマイク PDMマイク (音声入力・騒音検知)

3. 電源・物理仕様

項目 内容
動作電圧 3.3V
入力電圧 (USB) 5V
入力電圧 (BAT) 3.7V (リチウムポリマー電池対応)
充電電流 50mA / 100mA (デフォルト50mA)
待機消費電力 < 5μA
サイズ 21mm x 17.5mm x 3.5mm

サイズイメージ

4.ピン配置

UART、I2C、SPIのペリフェラルが1つずつ載ってます。UARTはPCとのシリアル通信用に使われてますので、UARTのセンサーを使う際はご注意ください。

環境構築

環境はArduino IDEです。詳しくはこちら→Getting Started with Seeed Studio XIAO nRF52840 Series | Seeed Studio Wiki

1. ボードマネージャURLの登録

Arduino IDE[基本設定] (Preferences) を開き、「追加のボードマネージャのURL」に以下のURLを貼り付けます。

https://files.seeedstudio.com/arduino/package_seeeduino_boards_index.json

2. ボードパッケージのインストール

[ツール] > [ボード] > [ボードマネージャ] を開き、「Seeed nRF52」 で検索。

  • Seeed nRF52 Boards をインストールします。
  • ※インストールには数分かかる場合があります。

3. ボードとポートの選択

XIAOをPCに接続し、以下の設定を選択すれば完了です。

  • ボード: Seeed XIAO nRF52840 Sense
  • シリアルポート: 認識されたポート(COMx や /dev/cu.xxx)
💡 書き込みがうまくいかない時は? XIAOのUSB-Cポート横にある小さな「リセットボタン」を素早く2回押してください。
オレンジ色のLEDが点滅し、認識されるようになります。

サンプルコード

IMUとマイクを使ったコード例です。

#include <LSM6DS3.h>
#include <Wire.h>
#include <PDM.h>

// IMUのインスタンス作成 (I2C)
LSM6DS3 myIMU(I2C_MODE, 0x6A);

// PDMマイクの設定
short sampleBuffer[256];
volatile int samplesRead;

void setup() {
  Serial.begin(115200);
  while (!Serial);

  // 1. IMUの初期化
  if (myIMU.begin() != 0) {
    Serial.println("IMU error");
  } else {
    Serial.println("IMU OK!");
  }

  // 2. PDMマイクの初期化
  PDM.onReceive(onPDMdata);
  if (!PDM.begin(1, 16000)) { // モノラル, 16kHz
    Serial.println("PDM error");
  }
}

void loop() {
  // --- IMUデータの読み取り ---
  Serial.print("Accel [G]: ");
  Serial.print(myIMU.readFloatAccelX(), 2); Serial.print(", ");
  Serial.print(myIMU.readFloatAccelY(), 2); Serial.print(", ");
  Serial.print(myIMU.readFloatAccelZ(), 2);

  // --- マイクデータの読み取り (音量の簡易計算) ---
  int maxAmplitude = 0;
  if (samplesRead) {
    for (int i = 0; i < samplesRead; i++) {
      if (abs(sampleBuffer[i]) > maxAmplitude) {
        maxAmplitude = abs(sampleBuffer[i]);
      }
    }
    samplesRead = 0;
  }
  
  Serial.print(" | Mic Max: ");
  Serial.println(maxAmplitude);

  delay(200); // 読みやすさのために少し待機
}

// PDMデータ受信時のコールバック関数
void onPDMdata() {
  int bytesAvailable = PDM.available();
  PDM.read(sampleBuffer, bytesAvailable);
  samplesRead = bytesAvailable / 2;
}

動作画面

いい感じに動いています。Z軸が1.01くらいあるのは重力加速度です。
マイクの感度も良好で、多少周りが騒がしくても動作するんじゃないかという印象。

まとめ

このサイズで色々センサが入ってるの、使いやすくていいですね。
TinyMLやBLEも使っていきたいです。使ったらブログに書く予定ですので是非!