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:の中)をコメントアウトします。
エラーが出なくなりました。やったね
私は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_UPとKEY_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);
}
以上、加速度センサーとジャイロセンサーを使って遊んでみました。
おつかれさまー
