BLE Nano - HMC5883 communication sample
Dependencies: BLE_API mbed nRF51822
Diff: main.cpp
- Revision:
- 0:31c9498472f6
- Child:
- 1:aa93d2588721
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/main.cpp Sun Oct 11 03:07:55 2015 +0000 @@ -0,0 +1,136 @@ +#include "mbed.h" +#include "BLE.h" + +BLEDevice ble; + +/** サービス・キャラクタリスティックの定義 **/ +// サービスのUUID +const uint8_t uuid_service1_a[16] = {0x2c,0x81,0x00,0x01,0x29,0x49,0x42,0xe2,0x83,0x68,0x75,0x64,0x6a,0xb7,0xe1,0x34}; + // キャラクタリスティックのUUID +const uint8_t uuid_char1_a[16] = {0x2c,0x81,0x00,0x02,0x29,0x49,0x42,0xe2,0x83,0x68,0x75,0x64,0x6a,0xb7,0xe1,0x34}; +const UUID uuid_service1(uuid_service1_a); +const UUID uuid_char1(uuid_char1_a); +const int char1_len = 12; //キャラクタリスティック長さ +uint8_t char1_val[char1_len] = {0}; +GattCharacteristic char1 ( uuid_char1, //UUID + (uint8_t *)char1_val, //初期値 + char1_len, //初期データ長 + char1_len, //最大データ長 + GattCharacteristic::BLE_GATT_CHAR_PROPERTIES_READ); //プロパティ +GattCharacteristic *characteristics[] = {&char1, }; +int char_num = sizeof(characteristics) / sizeof(GattCharacteristic *); +GattService service1( uuid_service1, //UUID + characteristics, //キャラクタリスティックの集合 + char_num ); //キャラクタリスティック数 + +/** 地磁気センサ HMC5883L I2C通信用変数定義 **/ +I2C i2c(p10, p8); // I2C設定。SDAにポート10、SCLにポート8 +DigitalOut ctrlPin1(p28); //センサ1 ON/OFF制御ポート +DigitalOut ctrlPin2(p29); //センサ2 ON/OFF制御ポート + +const int i2cAddr = 0x3C; // HCM5883 I2C Address + +/* 指定番号のセンサを有効にする */ +void enableSensor(int number){ + if (number==1){ + ctrlPin1 = 1; + ctrlPin2 = 0; + }else{ + ctrlPin1 = 0; + ctrlPin2 = 1; + } +} + +/* センサを初期化する */ +void initSensor(int number){ + // 有効センサの指定 + enableSensor(number); + + // Continuous-Measurement モードに設定 + char cmd[2]; + cmd[0] = 0x02; // モードレジスタのアドレスを指定 + cmd[1] = 0x00; // モードレジスタに書き込む値を指定。Continuous-Measurement モードは0x00。 + i2c.write(i2cAddr, cmd, 2); // コマンド送信 +} + +/* センサ値を取得する */ +void readSensor(uint8_t* buf, int number){ + // 有効センサの指定 + enableSensor(number); + + // センサ値取得 + char cmd[1]; + cmd[0] = 0x3; //センサ値取得用レジスタのアドレスを指定 + i2c.write(i2cAddr, cmd, 1); //コマンド送信 + i2c.read(i2cAddr | 1, (char*)buf, 6); //6バイト分データ(X,Z,Y軸の順に各2バイト)を読み取る + +} + +/* BLE接続切断時のコールバック */ +void disconnectionCallback(Gap::Handle_t handle, Gap::DisconnectionReason_t reason){ + ble.startAdvertising(); +} + +/* BLE接続時のコールバック */ +void onConnectionCallback(const Gap::ConnectionCallbackParams_t *params){ +} + +/* BLE READ要求受信時のコールバック */ +void onDataReadCallback(const GattReadCallbackParams *eventDataP){ +} + + +/* タイマーによるコールバック関数 */ +void periodicCallback(void){ + // 2つのセンサ値を取得 + readSensor(&(char1_val[0]), 1); + readSensor(&(char1_val[6]), 2); + // キャラクタリスティック値の更新 + GattAttribute::Handle_t handle = + char1.getValueAttribute().getHandle(); + ble.updateCharacteristicValue( + handle, //対象のキャラクタリスティックのハンドル + (uint8_t *)&char1_val,//更新後のデータ + sizeof(char1_val)); //データ長 +} + +/* main */ +int main(void){ + + // I2C初期化 + initSensor(1); + initSensor(2); + + /* BLE初期化 */ + ble.init(); + ble.onConnection(onConnectionCallback); + ble.onDisconnection(disconnectionCallback); + ble.onDataRead(onDataReadCallback); + + /* アドバタイズ設定 */ + //Centralからのアドバタイズメントパケットの受信可否の設定 + ble.accumulateAdvertisingPayload(GapAdvertisingData::BREDR_NOT_SUPPORTED | GapAdvertisingData::LE_GENERAL_DISCOVERABLE); + // パケットに含めるデバイス名称設定 + const char device_name[] = "BLE Nano"; + ble.accumulateAdvertisingPayload( GapAdvertisingData::COMPLETE_LOCAL_NAME, (uint8_t *)device_name, sizeof(device_name)); + // Centralからの接続可を示す設定 + ble.setAdvertisingType(GapAdvertisingParams::ADV_CONNECTABLE_UNDIRECTED); + // アドバタイズ間隔設定。 0.625msの倍数を指定する。ここでは100ms. + ble.setAdvertisingInterval(160); + //アドバタイズ開始 + ble.startAdvertising(); + + /* サービス登録 */ + ble.addService(service1); + + /* タイマー設定 */ + Ticker ticker; + ticker.attach( + periodicCallback, //コールバックされる関数 + 1 ); //コールバック間隔[秒] + + /* メインループ*/ + while (true) { + ble.waitForEvent(); + } +} \ No newline at end of file