Nano 33 BLE Senseをデータ入力に使う<BLE>⑨9軸慣性センサ ...
Maybe your like
ここまで、複数搭載されているセンサのうち、
- 温湿度センサのHTS221 BLEペリフェラル BLEセントラル
- 近接センサ APDS9960 BLEペリフェラル BLEセントラル
- マイクMP34DT05 BLEペリフェラル BLEセントラル
- 気圧センサ LPS22HB BLEペリフェラル BLEセントラル
を扱いました。ここでは最後の9軸慣性センサ LSM9DS1を使います。
LSM9DS1は、3軸の加速度センサ、3軸のジャイロ・センサ、3軸の磁気(コンパス)センサを搭載しています。総合的にセンサの情報を使って、ロボットやゲーム機器の動きを検知するために使われるようです。
●LSM9DS1のおもなスペック
- 動作電圧 1.9~3.6V
- 電流 エコ・パワー・モード;1.9mA、ジャイロ・センサ通常動作時4.0mA
- インターフェース I2C(最大400kHz)、SPI(最大10MHz)
- 加速度:±2/±4/±6/±8/±16g
- ジャイロ・センサ:±245/±500/±2000dps
- 磁気センサ:±4/±8/±12/±16gauss
- 動作温度範囲 -40~85℃
●ライブラリのインストール
ライブラリ管理でLSM9DS1を入れて検索して出てきたArduino_LSM9DS1をインストールします。
ライブラリのインストールと同時に、三つのサンプル・スケッチもインストールされました。
![]()
●接続
USBケーブルで、PCと接続します。
●サンプルSimpleAccelerometer
実行します。
![]()
●サンプルSimpleGyroscope
実行します。
![]()
●サンプルSimpleMagnetometer
実行します。
![]()
●スケッチ-合成
三つのスケッチの値だけを得るように合体させます。
#include <Arduino_LSM9DS1.h> void setup() { Serial.begin(9600); while (!Serial); Serial.println("\nStarted\n"); if (!IMU.begin()) { Serial.println("Failed to initialize IMU!"); while (1); } Serial.print("Accelerometer sample rate = "); Serial.print(IMU.accelerationSampleRate()); Serial.println("Hz Acceleration in G's X\tY\tZ"); Serial.print("Gyroscope sample rate = "); Serial.print(IMU.gyroscopeSampleRate()); Serial.println("Hz Gyroscope in degrees/second X\tY\tZ"); Serial.print("Magnetic field sample rate = "); Serial.print(IMU.magneticFieldSampleRate()); Serial.println("uT Magnetic Field in uT X\tY\tZ"); } void loop() { float xa, ya, za, xg, yg, zg,xm, ym, zm; Serial.println(""); if (IMU.accelerationAvailable()) { IMU.readAcceleration(xa, ya, za); Serial.println("acceleration "+String(xa)+'\t'+String(ya)+'\t'+String(za)); } if (IMU.gyroscopeAvailable()) { IMU.readGyroscope(xg, yg, zg); Serial.println("gyroscope "+String(xg)+'\t'+String(yg)+'\t'+String(zg)); } if (IMU.magneticFieldAvailable()) { IMU.readMagneticField(xm, ym, zm); Serial.println("magneticField "+String(xm)+'\t'+String(ym)+'\t'+String(zm)); } delay(2000); }実行します。
![]()
●BLE部分を追加-その1
BLEペリフェラルのスケッチを追加します。9軸の値(実数)をそれぞれCharacteristicのUUIDを設定しているので、記述が大変です。
#include <Arduino_LSM9DS1.h> #include <ArduinoBLE.h> // LSM9DS1 // BLE Service #define Nano33BLESense_Service5_UUID "F000AC00-0451-4000-B000-000000000000" BLEService Nano33BLESense_Service5(Nano33BLESense_Service5_UUID); // BLE Characteristic #define LSM9DS1_AccelerationX_Characteristic_UUID "F000AC01-0451-4000-B000-000000000000" #define LSM9DS1_AccelerationY_Characteristic_UUID "F000AC02-0451-4000-B000-000000000000" #define LSM9DS1_AccelerationZ_Characteristic_UUID "F000AC03-0451-4000-B000-000000000000" #define LSM9DS1_GyroscopeX_Characteristic_UUID "F000AC04-0451-4000-B000-000000000000" #define LSM9DS1_GyroscopeY_Characteristic_UUID "F000AC05-0451-4000-B000-000000000000" #define LSM9DS1_GyroscopeZ_Characteristic_UUID "F000AC06-0451-4000-B000-000000000000" #define LSM9DS1_MagneticFieldX_Characteristic_UUID "F000AC07-0451-4000-B000-000000000000" #define LSM9DS1_MagneticFieldY_Characteristic_UUID "F000AC08-0451-4000-B000-000000000000" #define LSM9DS1_MagneticFieldZ_Characteristic_UUID "F000AC09-0451-4000-B000-000000000000" BLEFloatCharacteristic LSM9DS1_AccelerationX(LSM9DS1_AccelerationX_Characteristic_UUID, BLERead | BLENotify); BLEFloatCharacteristic LSM9DS1_AccelerationY(LSM9DS1_AccelerationY_Characteristic_UUID, BLERead | BLENotify); BLEFloatCharacteristic LSM9DS1_AccelerationZ(LSM9DS1_AccelerationZ_Characteristic_UUID, BLERead | BLENotify); BLEFloatCharacteristic LSM9DS1_GyroscopeX(LSM9DS1_GyroscopeX_Characteristic_UUID, BLERead | BLENotify); BLEFloatCharacteristic LSM9DS1_GyroscopeY(LSM9DS1_GyroscopeY_Characteristic_UUID, BLERead | BLENotify); BLEFloatCharacteristic LSM9DS1_GyroscopeZ(LSM9DS1_GyroscopeZ_Characteristic_UUID, BLERead | BLENotify); BLEFloatCharacteristic LSM9DS1_MagneticFieldX(LSM9DS1_MagneticFieldX_Characteristic_UUID, BLERead | BLENotify); BLEFloatCharacteristic LSM9DS1_MagneticFieldY(LSM9DS1_MagneticFieldY_Characteristic_UUID, BLERead | BLENotify); BLEFloatCharacteristic LSM9DS1_MagneticFieldZ(LSM9DS1_MagneticFieldZ_Characteristic_UUID, BLERead | BLENotify); // BLE Descriptor #define LSM9DS1_AccelerationX_Descriptor_UUID "2901" #define LSM9DS1_GyroscopeX_Descriptor_UUID "2901" #define LSM9DS1_MagneticFieldX_Descriptor_UUID "2901" BLEDescriptor LSM9DS1_AccelerationX_Descriptor(LSM9DS1_AccelerationX_Descriptor_UUID, "Hz Acceleration in G's X Y Z"); BLEDescriptor LSM9DS1_GyroscopeX_Descriptor(LSM9DS1_GyroscopeX_Descriptor_UUID, "Hz Gyroscope in degrees/second X Y Z"); BLEDescriptor LSM9DS1_MagneticFieldX_Descriptor(LSM9DS1_MagneticFieldX_Descriptor_UUID, "uT Magnetic Field in uT X Y Z"); #define localNAME "LSM9DS1" #define DeviceNAME "LSM9DS1_BLE" float previousMillis = 0; // last time value was checked, in ms void setup() { Serial.begin(9600); while (!Serial); Serial.println("\nStarted\n"); if (!IMU.begin()) { Serial.println("Failed to initialize IMU!"); while (1); } Serial.print("Accelerometer sample rate = "); Serial.print(IMU.accelerationSampleRate()); Serial.println("Hz Acceleration in G's X\tY\tZ"); Serial.print("Gyroscope sample rate = "); Serial.print(IMU.gyroscopeSampleRate()); Serial.println("Hz Gyroscope in degrees/second X\tY\tZ"); Serial.print("Magnetic field sample rate = "); Serial.print(IMU.magneticFieldSampleRate()); Serial.println("uT Magnetic Field in uT X\tY\tZ"); if (!BLE.begin()) { Serial.println("starting BLE failed!"); while (1); } BLE.setLocalName(localNAME); BLE.setDeviceName(DeviceNAME); //// set the service5 BLE.setAdvertisedService(Nano33BLESense_Service5); // add characteristic Nano33BLESense_Service5.addCharacteristic(LSM9DS1_AccelerationX); Nano33BLESense_Service5.addCharacteristic(LSM9DS1_AccelerationY); Nano33BLESense_Service5.addCharacteristic(LSM9DS1_AccelerationZ); Nano33BLESense_Service5.addCharacteristic(LSM9DS1_GyroscopeX); Nano33BLESense_Service5.addCharacteristic(LSM9DS1_GyroscopeY); Nano33BLESense_Service5.addCharacteristic(LSM9DS1_GyroscopeZ); Nano33BLESense_Service5.addCharacteristic(LSM9DS1_MagneticFieldX); Nano33BLESense_Service5.addCharacteristic(LSM9DS1_MagneticFieldY); Nano33BLESense_Service5.addCharacteristic(LSM9DS1_MagneticFieldZ); // add descriptor LSM9DS1_AccelerationX.addDescriptor(LSM9DS1_AccelerationX_Descriptor); LSM9DS1_GyroscopeX.addDescriptor(LSM9DS1_GyroscopeX_Descriptor); LSM9DS1_MagneticFieldX.addDescriptor(LSM9DS1_MagneticFieldX_Descriptor); // add service BLE.addService(Nano33BLESense_Service5); // start advertising BLE.advertise(); Serial.println("\nBluetooth device active, waiting for connections..."); } void loop() { // wait for a BLE central BLEDevice central = BLE.central(); // if a central is connected to the peripheral: if (central) { delay(100); Serial.print("\n Connected to central: "); // print the central's BT address: Serial.println(central.address()); // check data every 200ms // while the central is connected: while (central.connected()) { long currentMillis = millis(); // if 200ms have passed, check value: if (currentMillis - previousMillis >= 200) { previousMillis = currentMillis; updateValue(); delay(1000); } } // when the central disconnects Serial.print("Disconnected from central: "); Serial.println(central.address()); goto brout; } brout: ; } void updateValue() { float xa, ya, za, xg, yg, zg, xm, ym, zm; Serial.println(""); if (IMU.accelerationAvailable()) { IMU.readAcceleration(xa, ya, za); Serial.println("acceleration "+String(xa)+'\t'+String(ya)+'\t'+String(za)); } if (IMU.gyroscopeAvailable()) { IMU.readGyroscope(xg, yg, zg); Serial.println("gyroscope "+String(xg)+'\t'+String(yg)+'\t'+String(zg)); } if (IMU.magneticFieldAvailable()) { IMU.readMagneticField(xm, ym, zm); Serial.println("magneticField "+String(xm)+'\t'+String(ym)+'\t'+String(zm)); } // update characteristic LSM9DS1_AccelerationX.writeValue(xa); LSM9DS1_AccelerationY.writeValue(ya); LSM9DS1_AccelerationZ.writeValue(za); LSM9DS1_GyroscopeX.writeValue(xg); LSM9DS1_GyroscopeY.writeValue(yg); LSM9DS1_GyroscopeZ.writeValue(zg); LSM9DS1_MagneticFieldX.writeValue(xm); LSM9DS1_MagneticFieldY.writeValue(ym); LSM9DS1_MagneticFieldZ.writeValue(zm); }RLS10で実行しているBLEセントラルの画面です。実数はIEEE 754 binary32のフォーマットで送られてきます。
![]()
Arduino IDEのメモリ関係の情報です。
最大983040バイトのフラッシュメモリのうち、スケッチが324336バイト(32%)を使っています。最大262144バイトのRAMのうち、グローバル変数が71000バイト(27%)を使っていて、ローカル変数で191144バイト使うことができます。
Set binary modeversion()=Arduino Bootloader (SAM-BA extended) 2.0 [Arduino:IKXYZ]Connected at 921600 baudidentifyChip()=nRF52840-QIAAwrite(addr=0,size=0x34)writeWord(addr=0x30,value=0x400)writeWord(addr=0x20,value=0)version()=Arduino Bootloader (SAM-BA extended) 2.0 [Arduino:IKXYZ]Device : nRF52840-QIAAVersion : Arduino Bootloader (SAM-BA extended) 2.0 [Arduino:IKXYZ]Address : 0x0Pages : 256Page Size : 4096 bytesTotal Size : 1024KBPlanes : 1Lock Regions : 0Locked : noneSecurity : falseErase flashchipErase(addr=0)
Done in 0.001 secondsWrite 324344 bytes to flash (80 pages)。。。writeBuffer(scr_addr=0x34, dst_addr=0x4f000, size=0x1000)[==============================] 100% (80/80 pages)Done in 13.555 seconds
●BLE部分を追加-その2
BLEペリフェラルのスケッチを追加します。9軸の値を文字データにしました。二つのデータをカンマで区切りました。
- Accelerationのx、y
- AccelerationのzとGyroscopeのx
- Gyroscopeのy、z
- Magnetometerのx、y
- Magnetometerのz
CharacteristicのUUIDは、9から5へ減少しました。
#include <Arduino_LSM9DS1.h> #include <ArduinoBLE.h> // LSM9DS1 // BLE Service #define Nano33BLESense_Service6_UUID "F000AD00-0451-4000-B000-000000000000" BLEService Nano33BLESense_Service6(Nano33BLESense_Service6_UUID); // BLE Characteristic #define LSM9DS1_AXAY_Characteristic_UUID "F000AD01-0451-4000-B000-000000000000" #define LSM9DS1_AZGX_Characteristic_UUID "F000AD02-0451-4000-B000-000000000000" #define LSM9DS1_GYGZ_Characteristic_UUID "F000AD03-0451-4000-B000-000000000000" #define LSM9DS1_MXMY_Characteristic_UUID "F000AD04-0451-4000-B000-000000000000" #define LSM9DS1_MZ_Characteristic_UUID "F000AD05-0451-4000-B000-000000000000" BLEStringCharacteristic LSM9DS1_AXAY(LSM9DS1_AXAY_Characteristic_UUID, BLERead | BLENotify, 37); BLEStringCharacteristic LSM9DS1_AZGX(LSM9DS1_AZGX_Characteristic_UUID, BLERead | BLENotify, 37); BLEStringCharacteristic LSM9DS1_GYGZ(LSM9DS1_GYGZ_Characteristic_UUID, BLERead | BLENotify, 37); BLEStringCharacteristic LSM9DS1_MXMY(LSM9DS1_MXMY_Characteristic_UUID, BLERead | BLENotify, 37); BLEStringCharacteristic LSM9DS1_MZ(LSM9DS1_MZ_Characteristic_UUID, BLERead | BLENotify, 37); // BLE Descriptor #define LSM9DS1_AXAY_Descriptor_UUID "2901" #define LSM9DS1_AZGX_Descriptor_UUID "2901" #define LSM9DS1_MXMY_Descriptor_UUID "2901" #define LSM9DS1_MZ_Descriptor_UUID "2901" BLEDescriptor LSM9DS1_AXAY_Descriptor(LSM9DS1_AXAY_Descriptor_UUID, "Hz Acceleration in G's X Y"); BLEDescriptor LSM9DS1_AZGX_Descriptor(LSM9DS1_AZGX_Descriptor_UUID, "Hz Acceleration in G's Z, Gyroscope in degrees/second X"); BLEDescriptor LSM9DS1_GYGZ_Descriptor(LSM9DS1_MXMY_Descriptor_UUID, "Hz Gyroscope in degrees/second Y Z"); BLEDescriptor LSM9DS1_MXMY_Descriptor(LSM9DS1_MXMY_Descriptor_UUID, "uT Magnetic Field in uT X Y"); BLEDescriptor LSM9DS1_MZ_Descriptor(LSM9DS1_MZ_Descriptor_UUID, "uT Magnetic Field in uT Z"); #define localNAME "LSM9DS1" #define DeviceNAME "LSM9DS1_BLE" float previousMillis = 0; // last time value was checked, in ms void setup() { Serial.begin(9600); while (!Serial); Serial.println("\nStarted\n"); if (!IMU.begin()) { Serial.println("Failed to initialize IMU!"); while (1); } Serial.print("Accelerometer sample rate = "); Serial.print(IMU.accelerationSampleRate()); Serial.println("Hz Acceleration in G's X\tY\tZ"); Serial.print("Gyroscope sample rate = "); Serial.print(IMU.gyroscopeSampleRate()); Serial.println("Hz Gyroscope in degrees/second X\tY\tZ"); Serial.print("Magnetic field sample rate = "); Serial.print(IMU.magneticFieldSampleRate()); Serial.println("uT Magnetic Field in uT X\tY\tZ"); if (!BLE.begin()) { Serial.println("starting BLE failed!"); while (1); } BLE.setLocalName(localNAME); BLE.setDeviceName(DeviceNAME); //// set the service6 BLE.setAdvertisedService(Nano33BLESense_Service6); // add characteristic Nano33BLESense_Service6.addCharacteristic(LSM9DS1_AXAY); Nano33BLESense_Service6.addCharacteristic(LSM9DS1_AZGX); Nano33BLESense_Service6.addCharacteristic(LSM9DS1_GYGZ); Nano33BLESense_Service6.addCharacteristic(LSM9DS1_MXMY); Nano33BLESense_Service6.addCharacteristic(LSM9DS1_MZ); // add descriptor LSM9DS1_AXAY.addDescriptor(LSM9DS1_AXAY_Descriptor); LSM9DS1_AZGX.addDescriptor(LSM9DS1_AZGX_Descriptor); LSM9DS1_GYGZ.addDescriptor(LSM9DS1_MXMY_Descriptor); LSM9DS1_MXMY.addDescriptor(LSM9DS1_MXMY_Descriptor); LSM9DS1_MZ.addDescriptor(LSM9DS1_MZ_Descriptor); // add service BLE.addService(Nano33BLESense_Service6); // start advertising BLE.advertise(); Serial.println("\nBluetooth device active, waiting for connections..."); } void loop() { // wait for a BLE central BLEDevice central = BLE.central(); // if a central is connected to the peripheral: if (central) { delay(100); Serial.print("\n Connected to central: "); // print the central's BT address: Serial.println(central.address()); // check data every 200ms // while the central is connected: while (central.connected()) { long currentMillis = millis(); // if 200ms have passed, check value: if (currentMillis - previousMillis >= 200) { previousMillis = currentMillis; updateValue(); delay(1000); } } // when the central disconnects Serial.print("Disconnected from central: "); Serial.println(central.address()); goto brout; } brout: ; } void updateValue() { float xa, ya, za, xg, yg, zg, xm, ym, zm; Serial.println(""); if (IMU.accelerationAvailable()) { IMU.readAcceleration(xa, ya, za); Serial.println("acceleration "+String(xa)+'\t'+String(ya)+'\t'+String(za)); } if (IMU.gyroscopeAvailable()) { IMU.readGyroscope(xg, yg, zg); Serial.println("gyroscope "+String(xg)+'\t'+String(yg)+'\t'+String(zg)); } if (IMU.magneticFieldAvailable()) { IMU.readMagneticField(xm, ym, zm); Serial.println("magneticField "+String(xm)+'\t'+String(ym)+'\t'+String(zm)); } // update characteristic LSM9DS1_AXAY.writeValue(String(xa)+","+String(ya)); LSM9DS1_AZGX.writeValue(String(za)+","+String(xg)); LSM9DS1_GYGZ.writeValue(String(yg)+","+String(zg)); LSM9DS1_MXMY.writeValue(String(xm)+","+String(ym)); LSM9DS1_MZ.writeValue(String(zm)); }RLS10で実行しているBLEセントラルの画面です。どうも最大値は-xxx.xxが最大桁数のようです。x、y、zの値をまとめて送っても桁あふれはないように見えます。
![]()
Arduino IDEのメモリ関係の情報です。
最大983040バイトのフラッシュメモリのうち、スケッチが324384バイト(32%)を使っています。最大262144バイトのRAMのうち、グローバル変数が70976バイト(27%)を使っていて、ローカル変数で191168バイト使うことができます。
Set binary modeversion()=Arduino Bootloader (SAM-BA extended) 2.0 [Arduino:IKXYZ]Connected at 921600 baudidentifyChip()=nRF52840-QIAAwrite(addr=0,size=0x34)writeWord(addr=0x30,value=0x400)writeWord(addr=0x20,value=0)version()=Arduino Bootloader (SAM-BA extended) 2.0 [Arduino:IKXYZ]Device : nRF52840-QIAAVersion : Arduino Bootloader (SAM-BA extended) 2.0 [Arduino:IKXYZ]Address : 0x0Pages : 256Page Size : 4096 bytesTotal Size : 1024KBPlanes : 1Lock Regions : 0Locked : noneSecurity : falseErase flashchipErase(addr=0)
Done in 0.000 secondsWrite 324392 bytes to flash (80 pages)[ ] 0% (0/80 pages)write(addr=0x34,size=0x1000)。。。[==============================] 100% (80/80 pages)
●BLE部分を追加-その3
BLEペリフェラルのスケッチを追加します。9軸の値を文字データにしました。UUIDは三つになります。
- Accelerationのx、y、z
- Gyroscopeのx、y、z
- Magnetometerのx、y、z
RLS10で実行しているBLEセントラルの画面です。
![]()
Arduino IDEのメモリ関係の情報です。
最大983040バイトのフラッシュメモリのうち、スケッチが324104バイト(32%)を使っています。最大262144バイトのRAMのうち、グローバル変数が70928バイト(27%)を使っていて、ローカル変数で191216バイト使うことができます。
Set binary modeversion()=Arduino Bootloader (SAM-BA extended) 2.0 [Arduino:IKXYZ]Connected at 921600 baudidentifyChip()=nRF52840-QIAAwrite(addr=0,size=0x34)writeWord(addr=0x30,value=0x400)writeWord(addr=0x20,value=0)version()=Arduino Bootloader (SAM-BA extended) 2.0 [Arduino:IKXYZ]Device : nRF52840-QIAAVersion : Arduino Bootloader (SAM-BA extended) 2.0 [Arduino:IKXYZ]Address : 0x0Pages : 256Page Size : 4096 bytesTotal Size : 1024KBPlanes : 1Lock Regions : 0Locked : noneSecurity : falseErase flashchipErase(addr=0)
Done in 0.000 secondsWrite 324112 bytes to flash (80 pages)[ ] 0% (0/80 pages)write(addr=0x34,size=0x1000)。。。[==============================] 100% (80/80 pages)Done in 13.537 seconds
●メモリの使用量
UUIDが少ないほど、メモリの使用量は、わずかに減少しています。顕著ではありません。
- その1 フラッシュメモリ;324336バイト(32%)、RAM;71000バイト(27%)
- その2 フラッシュメモリ;324384バイト(32%)、RAM;70976バイト(27%)
- その3 フラッシュメモリ;324104バイト(32%)、RAM;70928バイト(27%)
Tag » Arduino Ble 33 Imu
-
Accessing Accelerometer Data On Nano 33 BLE
-
Accessing Gyroscope Data On Nano 33 BLE Sense
-
How To Use The Arduino Nano 33 BLE's Built-in IMU - Maker Pro
-
IMU | Arduino Nano 33 BLE Guide
-
Arduino Nano 33 BLE IMU LSM9DS1 - YouTube
-
Arduino BLE Accelerometer Tutorial For Beginners - RootSaid
-
Carte Arduino Nano 33 BLE ABX00034 - GoTronic
-
Arduino Nano 33 BLE With Headers - Kiwi Electronics
-
[PDF] Arduino And Arduino Nano 33 BLE Sense - UiO
-
Measure LSM9DS1 Sensor Outputs Using Nano 33 BLE Sense
-
Arduino Nano 33 BLE Sense Overview
-
ARDUINO ABX00031 Nano 33 BLE Sense Module User Manual
-
Tutorial 01: Accessing Sensor Values | Arduino Nano 33 BLE Sense ...
-
Arduino Nano 33 BLE, BT 5.0, Imu + Nina B306/nRF52840 ... - EBay