Nano 33 BLE Senseをデータ入力に使う<BLE>⑨9軸慣性センサ<BLEペリフェラル>
ここまで、複数搭載されているセンサのうち、
- 温湿度センサの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 mode
version()=Arduino Bootloader (SAM-BA extended) 2.0 [Arduino:IKXYZ]
Connected at 921600 baud
identifyChip()=nRF52840-QIAA
write(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-QIAA
Version : Arduino Bootloader (SAM-BA extended) 2.0 [Arduino:IKXYZ]
Address : 0x0
Pages : 256
Page Size : 4096 bytes
Total Size : 1024KB
Planes : 1
Lock Regions : 0
Locked : none
Security : false
Erase flash
chipErase(addr=0)
Done in 0.001 seconds
Write 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 mode
version()=Arduino Bootloader (SAM-BA extended) 2.0 [Arduino:IKXYZ]
Connected at 921600 baud
identifyChip()=nRF52840-QIAA
write(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-QIAA
Version : Arduino Bootloader (SAM-BA extended) 2.0 [Arduino:IKXYZ]
Address : 0x0
Pages : 256
Page Size : 4096 bytes
Total Size : 1024KB
Planes : 1
Lock Regions : 0
Locked : none
Security : false
Erase flash
chipErase(addr=0)
Done in 0.000 seconds
Write 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
#include <Arduino_LSM9DS1.h>
#include <ArduinoBLE.h>
// LSM9DS1
// BLE Service
#define Nano33BLESense_Service7_UUID "F000AE00-0451-4000-B000-000000000000"
BLEService Nano33BLESense_Service7(Nano33BLESense_Service7_UUID);
// BLE Characteristic
#define LSM9DS1_Acceleration_Characteristic_UUID "F000AE01-0451-4000-B000-000000000000"
#define LSM9DS1_Gyroscope_Characteristic_UUID "F000AE02-0451-4000-B000-000000000000"
#define LSM9DS1_Magnetic_Characteristic_UUID "F000AE03-0451-4000-B000-000000000000"
BLEStringCharacteristic LSM9DS1_Acceleration(LSM9DS1_Acceleration_Characteristic_UUID, BLERead | BLENotify, 37);
BLEStringCharacteristic LSM9DS1_Gyroscope(LSM9DS1_Gyroscope_Characteristic_UUID, BLERead | BLENotify, 37);
BLEStringCharacteristic LSM9DS1_Magnetic(LSM9DS1_Magnetic_Characteristic_UUID, BLERead | BLENotify, 37);
// BLE Descriptor
#define LSM9DS1_Acceleration_Descriptor_UUID "2901"
#define LSM9DS1_Gyroscope_Descriptor_UUID "2901"
#define LSM9DS1_Magnetic_Descriptor_UUID "2901"
BLEDescriptor LSM9DS1_Acceleration_Descriptor(LSM9DS1_Acceleration_Descriptor_UUID, "Hz Acceleration in G's X Y Z");
BLEDescriptor LSM9DS1_Gyroscope_Descriptor(LSM9DS1_Gyroscope_Descriptor_UUID, "Hz Gyroscope in degrees/second X Y Z");
BLEDescriptor LSM9DS1_Magnetic_Descriptor(LSM9DS1_Magnetic_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 service6
BLE.setAdvertisedService(Nano33BLESense_Service7);
// add characteristic
Nano33BLESense_Service7.addCharacteristic(LSM9DS1_Acceleration);
Nano33BLESense_Service7.addCharacteristic(LSM9DS1_Gyroscope);
Nano33BLESense_Service7.addCharacteristic(LSM9DS1_Magnetic);
// add descriptor
LSM9DS1_Acceleration.addDescriptor(LSM9DS1_Acceleration_Descriptor);
LSM9DS1_Gyroscope.addDescriptor(LSM9DS1_Gyroscope_Descriptor);
LSM9DS1_Magnetic.addDescriptor(LSM9DS1_Magnetic_Descriptor);
// add service
BLE.addService(Nano33BLESense_Service7);
// 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_Acceleration.writeValue(String(xa)+","+String(ya)+","+String(za));
LSM9DS1_Gyroscope.writeValue(String(xg)+","+String(yg)+","+String(zg));
LSM9DS1_Magnetic.writeValue(String(xm)+","+String(ym)+","+String(zm));
}
RLS10で実行しているBLEセントラルの画面です。
Arduino IDEのメモリ関係の情報です。
最大983040バイトのフラッシュメモリのうち、スケッチが324104バイト(32%)を使っています。
最大262144バイトのRAMのうち、グローバル変数が70928バイト(27%)を使っていて、ローカル変数で191216バイト使うことができます。
Set binary mode
version()=Arduino Bootloader (SAM-BA extended) 2.0 [Arduino:IKXYZ]
Connected at 921600 baud
identifyChip()=nRF52840-QIAA
write(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-QIAA
Version : Arduino Bootloader (SAM-BA extended) 2.0 [Arduino:IKXYZ]
Address : 0x0
Pages : 256
Page Size : 4096 bytes
Total Size : 1024KB
Planes : 1
Lock Regions : 0
Locked : none
Security : false
Erase flash
chipErase(addr=0)
Done in 0.000 seconds
Write 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%)