iOSのBLEコントローラアプリ「RCBController」とmbed HRM1017を接続し、RCサーボモータを操作するテストプログラムです。

Dependencies:   BLE_API Servo mbed nRF51822

Fork of BLE_RCBController2 by Junichi Katsu

Embed: (wiki syntax)

« Back to documentation index

Show/hide line numbers main.cpp Source File

main.cpp

00001 #include "mbed.h"
00002 #include "BLEDevice.h"
00003 #include "RCBController.h"
00004 #include "Servo.h"
00005 
00006 #define DBG 0
00007 
00008 BLEDevice  ble;
00009 Serial  pc(USBTX, USBRX);
00010 /* LEDs for indication: */
00011 DigitalOut  ConnectStateLed(LED1);
00012 PwmOut  ControllerStateLed(LED2);
00013 
00014 Servo servo1(P0_28), servo2(P0_29);
00015 
00016 /* RCBController Service */
00017 static const uint16_t RCBController_service_uuid = 0xFFF0;
00018 static const uint16_t RCBController_Characteristic_uuid = 0xFFF1;
00019 uint8_t RCBControllerPayload[10] = {0,};
00020 
00021 GattCharacteristic  ControllerChar (RCBController_Characteristic_uuid,RCBControllerPayload,10, 10,
00022                                 GattCharacteristic::BLE_GATT_CHAR_PROPERTIES_WRITE | 
00023                                 GattCharacteristic::BLE_GATT_CHAR_PROPERTIES_WRITE_WITHOUT_RESPONSE);
00024 GattCharacteristic *ControllerChars[] = {&ControllerChar};
00025 GattService         RCBControllerService(RCBController_service_uuid, ControllerChars, sizeof(ControllerChars) / sizeof(GattCharacteristic *));
00026 
00027 RCBController controller;
00028 
00029 void onConnected(Gap::Handle_t handle, const Gap::ConnectionParams_t *params)
00030 {
00031     ConnectStateLed = 0;
00032 #if DBG
00033     pc.printf("Connected\n\r");
00034 #endif
00035 }
00036 
00037 void onDisconnected(Gap::Handle_t handle, Gap::DisconnectionReason_t reason)
00038 {
00039     ble.startAdvertising();
00040     ConnectStateLed = 1;
00041 #if DBG
00042     pc.printf("Disconnected\n\r");
00043 #endif
00044 }
00045 
00046 
00047 // GattEvent
00048 void onDataWritten(uint16_t charHandle, const GattCharacteristicWriteCBParams *params)
00049 {
00050     if (charHandle == ControllerChar.getValueAttribute().getHandle()) {
00051         uint16_t bytesRead;
00052         ble.readCharacteristicValue(ControllerChar.getValueAttribute().getHandle(),RCBControllerPayload, &bytesRead);
00053         memcpy( &controller.data[0], RCBControllerPayload, sizeof(controller));
00054 #if DBG
00055 
00056         pc.printf("DATA:%02X %02X %d %d %d %d %d %d %d %02X\n\r",controller.data[0],controller.data[1],controller.data[2],controller.data[3],controller.data[4],
00057                                                                controller.data[5],controller.data[6],controller.data[7],controller.data[8],controller.data[9]);
00058 #endif
00059         ControllerStateLed = (float)controller.status.LeftAnalogLR / 255.0;     
00060         servo1 = (float)controller.status.LeftAnalogUD / 255.0;
00061         servo2 = (float)controller.status.LeftAnalogLR / 255.0;
00062     }
00063          
00064 }
00065 
00066 /**************************************************************************/
00067 /*!
00068     @brief  Program entry point
00069 */
00070 /**************************************************************************/
00071 int main(void)
00072 {
00073 #if DBG
00074         pc.printf("Start\n\r");
00075 #endif
00076     ConnectStateLed = 1;
00077     servo1.calibrate(0.001,180.0);
00078     servo2.calibrate(0.001,180.0);
00079     servo1 = 0.5;
00080     servo2 = 0.5;
00081     
00082     ble.init(); 
00083     ble.onConnection(onConnected);
00084     ble.onDisconnection(onDisconnected);
00085     ble.onDataWritten(onDataWritten);
00086     
00087     /* setup advertising */
00088     ble.accumulateAdvertisingPayload(GapAdvertisingData::BREDR_NOT_SUPPORTED);
00089     ble.setAdvertisingType(GapAdvertisingParams::ADV_CONNECTABLE_UNDIRECTED);
00090     ble.accumulateAdvertisingPayload(GapAdvertisingData::SHORTENED_LOCAL_NAME,
00091                                     (const uint8_t *)"mbed HRM1017", sizeof("mbed HRM1017") - 1);
00092     ble.accumulateAdvertisingPayload(GapAdvertisingData::COMPLETE_LIST_16BIT_SERVICE_IDS,
00093                                     (const uint8_t *)RCBController_service_uuid, sizeof(RCBController_service_uuid));
00094 
00095     ble.setAdvertisingInterval(160); /* 100ms; in multiples of 0.625ms. */
00096     ble.startAdvertising();
00097 
00098     ble.addService(RCBControllerService);
00099 
00100     while (true) {
00101         ble.waitForEvent();
00102     }
00103 }
00104