Nano 33 BLE Senseをデータ入力に使う<BLE>⑨9軸慣性センサ<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%)

前へ

Nano 33 BLE Senseをデータ入力に使う<BLE>⑧気圧センサ<BLEセントラル>

次へ

Nano 33 BLE Senseをデータ入力に使う<BLE>⑩9軸慣性センサ<BLEセントラル>