0
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

Seeed Studio XIAO nRF52849 Sense Plusで遊ぶ

Posted at

XIAO nRF52840 Sense Plusを買いました。

スイッチサイエンスで3029円。
https://www.switch-science.com/products/10469?srsltid=AfmBOopJEld7OO_iB7ViI6jA_MitC5kc1CiU-gMYFWTdQMnWfyXUo0Sg

秋月電子通商では旧バージョンのXIAO nRF52849 Senseのみの取り扱いですが、おそらくいつか追加されると思います。

XIAO nRF52849 Sense Plusは20個のGPIOと6軸IMU、Bluetooth 5.0、NFC、デジタルマイクを備えています。

環境はwin11,Arduino2.3.5です


導入は公式がwikiにまとめているのでそちらを参考にします。
https://wiki.seeedstudio.com/ja/XIAO_BLE/
また、今回は主にIMUを使うため、
https://wiki.seeedstudio.com/ja/XIAO-BLE-Sense-IMU-Usage/
も参考にします。
Seeed StudioはnRF52のボードライブラリを2つ出しています。
ただ、IMUのライブラリSeeed_Arduino_LSM6DS3 Libraryを使う際はボードライブラリSeeed nrf52 mbed-enabled Boards Libraryを強く推奨しています。

が、上記ボードライブラリではSense Plusに書き込んだ際、IMUがうまく機能しません。
しかし、Senseとして書き込んだ際には動作します。
さらに、非推奨のSeeed nrf52 Boards Libraryを使った際には動作します。

ボードマネージャー ボード設定 動作
Seeed nrf52 mbed-enabled Boards Library 2.9.3 Sense Plus 動作するがIMUの返り値が0
^ Sense 動作するがPlusの機能は使えない
Seeed nrf52 Boards Library 1.1.10 Sense Plus 動作するが非推奨
^ Sense 動作するがPlusの機能は使えない、かつ非推奨

まとめるとこんな感じ。
必要な機能に合わせて臨機応変に使い分けていく感じにします。


変な動作をするところがさらにもう一つ。
Seeed_Arduino_LSM6DS3 Libraryの公式スケッチ例を動かしているとエラーが出てしまいます。
なんか、SPIがどうたらこうたら...

今回、IMUセンサーとnRF52はI2Cで通信しているのでSPIに関する記述を消しても構わないでしょう(適当)
C:\Users\hp\Documents\Arduino\libraries
にあるLSM6DS3.cppの92行-129行(switch分のcase SPI_MODE:の中)をコメントアウトします。

エラーが出なくなりました。やったね

スクリーンショット 2025-09-12 064449.png

私はVSで書き加えましたが、メモ帳でも構いません。


ここまで来たらやっとプログラムを書くことができます。
とりあえず加速度センサーで読み取った値を三平方の定理で処理し、加速度の強さによってLEDを光らせるプログラムをかきます。
ボードマネージャーはSeeed nrf52 mbed-enabled Boards Library 2.9.3を使用します。

#include "LSM6DS3.h"
#include "Wire.h"

LSM6DS3 myIMU(I2C_MODE, 0x6A);

void setup(){

    pinMode(LED_RED,OUTPUT);
    pinMode(LED_BLUE,OUTPUT);
    pinMode(LED_GREEN,OUTPUT);

    Serial.begin(9600);
    while (!Serial);

    if (myIMU.begin() != 0) {
        //Serial.print("\nDevice Error.\n");
    } else {
        //Serial.print("\nDevice OK.\n");
    }
}

int16_t axisA[2];
int16_t gravitiesAccel =4105;
int16_t axisX, axisY, axisZ, axisD;

void loop(){

    axisX=myIMU.readRawAccelX();
    axisY=myIMU.readRawAccelY();
    axisZ=myIMU.readRawAccelZ();
    
    //三平方で加速度の絶対値をとる
    axisA[0]=sqrt(axisX*axisX+axisY*axisY+axisZ*axisZ);
    axisD=axisA[0]-axisA[1];
    axisA[1]=axisA[0];

    //offset用Serial
    if(Serial.available()){
        gravitiesAccel = Serial.parseInt();
    }

    //加速度によりLED点灯
    //Write:HIGH->LED:OFF,Write:LOW->LED:ON
    if(axisA[0]-gravitiesAccel>10000){
        digitalWrite(LED_GREEN,HIGH);
        if(axisA[0]-gravitiesAccel>20000){
            digitalWrite(LED_RED,LOW);
        }else{
            digitalWrite(LED_RED,HIGH);
            digitalWrite(LED_BLUE,LOW);
        }
    }else{
        digitalWrite(LED_BLUE,HIGH);
        digitalWrite(LED_GREEN,LOW);
    }

    //Serial
    Serial.print(axisA[0]-gravitiesAccel);
    Serial.print(" , ");
    Serial.print(10000);
    Serial.print(" , ");
    Serial.println(-10000);
    
    delay(1);
    
}

次は、ジャイロセンサーでヴォリュームを作ります。
Seeed nrf52 Boards Library 1.1.10の公式ライブラリのUSBKeyboard.hにHIDメッセージKEY_VOLUME_UPKEY_VOLUME_DOWNがあるのでこれを使います。
スイッチ(GPIO9)HIGHにしてる間だけ動きます。

#include "LSM6DS3.h"
#include "Wire.h"

LSM6DS3 myIMU(I2C_MODE, 0x6A);

#include "PluggableUSBHID.h"
#include "USBKeyboard.h"

USBKeyboard Keyboard;

void setup(){
    pinMode(9,INPUT);

    Serial.begin(9600);
    while (!Serial);

    if (myIMU.begin() != 0) {
        //Serial.print("\nDevice Error.\n");
    } else {
        //Serial.print("\nDevice OK.\n");
    }
}

int16_t LoatX=0 , GyroX;

void loop(){

    GyroX=myIMU.readRawGyroX();

    //ジャイロ積分
    if(digitalRead(9)){
        LoatX += GyroX/100;
    }else{
        LoatX = 0;
    }

    //ジャイロ100以上たまったらヴォリュームを動かす
    if(LoatX/100){
        if(LoatX<0){
            //Serial.println(t/100);
            for(int i=0;i<-LoatX/100;i++){
                Keyboard.media_control(KEY_VOLUME_UP);
            }
        }else{
            //Serial.println(t/100);
            for(int i=0;i< LoatX/100;i++){
                Keyboard.media_control(KEY_VOLUME_DOWN);
            }
        }
        LoatX =0;
    }

    /*Serial
        Serial.print(GyroX);
        Serial.print(" , ");
        Serial.println(LoatX);
    */

    delay(1);
}

以上、加速度センサーとジャイロセンサーを使って遊んでみました。
おつかれさまー

0
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?