So-net無料ブログ作成

mbed HRM1017 で Heart Rate Profile をサポートしてみる(3) [mbed]

いよいよ、今回から mbed HRM1017 で Heart Rate Profile をサポートしてみたいと思います。前回の検討で、Heart Rate Profile は、Heart Rate Service と Device Information Service をサポートする必要があることが分かりました。


Services in Heart Rate Sensor.png


Heart Rate Service では、Heart Rate Measurement Characteristic とBody Sensor Location Characteristic の2つをサポートします。 mbed での宣言部は下記のようになります。

// Heart Rate Measurement Characteristic Setting
static uint8_t hrmCounter = 100;   // default value
static uint8_t bpm[2] = {0x00, hrmCounter};
GattCharacteristic  hrmChar(GattCharacteristic::UUID_HEART_RATE_MEASUREMENT_CHAR
                           ,bpm, sizeof(bpm) ,sizeof(bpm)
                           ,GattCharacteristic::BLE_GATT_CHAR_PROPERTIES_NOTIFY);

// Body Sensor Location Characteristic Setting
static uint8_t location = 0x05; /* Ear Lobe */
GattCharacteristic hrmLocation(GattCharacteristic::UUID_BODY_SENSOR_LOCATION_CHAR
                           ,(uint8_t *)&location ,sizeof(location) ,sizeof(location)
                           ,GattCharacteristic::BLE_GATT_CHAR_PROPERTIES_READ);

// Heart Rate Service Service
GattCharacteristic *hrmChars[] = {&hrmChar, &hrmLocation,};
GattService hrmService(GattService::UUID_HEART_RATE_SERVICE
                       ,hrmChars ,sizeof(hrmChars)/sizeof(GattCharacteristic *));



Device Information Service では、Device Information Service Characteristic をサポートします。

// Device Information Service Characteristic Setting
static uint8_t deviceName[] = {'H', 'R', 'M', '1', '0', '1', '7'};
GattCharacteristic deviceManufacturer(GattCharacteristic::UUID_MANUFACTURER_NAME_STRING_CHAR
                             ,(uint8_t *)deviceName ,sizeof(deviceName) ,sizeof(deviceName)
                             ,GattCharacteristic::BLE_GATT_CHAR_PROPERTIES_READ);

// Device Information Service
GattCharacteristic *devInfoChars[] = {&deviceManufacturer,};
GattService deviceInformationService(GattService::UUID_DEVICE_INFORMATION_SERVICE
                             ,devInfoChars ,sizeof(devInfoChars)/sizeof(GattCharacteristic *));



NORDIC の nRFToolbox では、Battery Level も表示するようになっていますので参考までに設定を載せておきます。(mbed HRM1017 のサンプルプログラムでも記載されています)

// Battery Level Characteristic Setting
static uint8_t batt = 100;
GattCharacteristic battLevel(GattCharacteristic::UUID_BATTERY_LEVEL_CHAR
                            ,(uint8_t *)&batt ,sizeof(batt) ,sizeof(batt)
                            ,GattCharacteristic::BLE_GATT_CHAR_PROPERTIES_NOTIFY);

// Battery Level Service             
GattCharacteristic *battChars[] = {&battLevel,};
GattService battService(GattService::UUID_BATTERY_SERVICE
                       ,battChars ,sizeof(battChars)/sizeof(GattCharacteristic *));



だいたいパターンはわかったと思います。次にサポートするサービスを Advertising パケットに組み込みます。Advertising とは Collector と接続するための仕組みで、Advertising パケットの中に自分がどのようなサービスを提供しているか記述する必要があります。

// service list
static uint16_t uuid16_list[] = {
    GattService::UUID_HEART_RATE_SERVICE
   ,GattService::UUID_BATTERY_SERVICE
   ,GattService::UUID_DEVICE_INFORMATION_SERVICE
};


BLEDevice ble;

// only BLE support, not support the classic bluetooth
ble.gap().accumulateAdvertisingPayload(GapAdvertisingData::BREDR_NOT_SUPPORTED  |   GapAdvertisingData::LE_GENERAL_DISCOVERABLE);

// registering the supported services
ble.gap().accumulateAdvertisingPayload(GapAdvertisingData::COMPLETE_LIST_16BIT_SERVICE_IDS , (uint8_t*)uuid16_list, sizeof(uuid16_list));

// the appearance is a heart rate sensor
ble.gap().accumulateAdvertisingPayload(GapAdvertisingData::GENERIC_HEART_RATE_SENSOR);

// registering the device name
ble.gap().accumulateAdvertisingPayload(GapAdvertisingData::COMPLETE_LOCAL_NAME , (uint8_t *)DEVICE_NAME, sizeof(DEVICE_NAME));

// setting as a connectable device to a collector
ble.gap().setAdvertisingType(GapAdvertisingParams::ADV_CONNECTABLE_UNDIRECTED);

// advertising interval is 100msec
ble.gap().setAdvertisingInterval(160); 
ble.gap().startAdvertising();


Advertising パケットの詳細については、こちらを参照ください。非常に参考になります。


BluetoothSMARTデバイスをmbed で開発する(4)
http://bril-tech.blogspot.jp/2014/06/bluetoothsmartmbed-4.html


今回作成した全コードは下記リポジトリにありますので参照ください。今回は心拍センサーは接続せずにランダム値を心拍データとして扱っています。


BLE_HeartRate
https://developer.mbed.org/users/YoshinoTaro/code/BLE_HeartRate/


それでは、nRFToolbox の Heart Rate Monitor でどう見えるか見てみましょう。


Heart Rate Monitor.png


おお、それらしく見えてますね!Device Information も Body Location も認識しているようです。

スマホと接続できると値を記録できるので、心拍計としての応用範囲がぐっと広がりますね。次はいよいよ心拍センサーを接続してみたいと思います!
(^_^)/~






mbed HRM1017

mbed HRM1017

  • 出版社/メーカー: スイッチサイエンス
  • メディア: Personal Computers



mbed LPC824

mbed LPC824

  • 出版社/メーカー: スイッチサイエンス
  • メディア: エレクトロニクス



mbed電子工作レシピ

mbed電子工作レシピ

  • 作者: 勝 純一
  • 出版社/メーカー: 翔泳社
  • 発売日: 2016/01/23
  • メディア: 大型本




nice!(35)  コメント(0)  トラックバック(0) 
共通テーマ:趣味・カルチャー

nice! 35

コメント 0

コメントを書く

お名前:
URL:
コメント:
画像認証:
下の画像に表示されている文字を入力してください。

トラックバック 0