【これは旧バージョンです】 AndroidのBLEラジコンプロポアプリ「BLEPropo」と接続し、RCサーボとDCモータを制御するプログラムです。 mbed HRM1017で動作を確認しています。 BLEPropo → https://github.com/lipoyang/BLEPropo

Dependencies:   BLE_API mbed

Fork of BLE_RCBController2 by Junichi Katsu

BLEを使ったAndroid用ラジコンプロポアプリ「BLEPropo」に対応するmbed HRM1017用ファームウェアです。
BLEPropoは、GitHubにて公開中。
https://github.com/lipoyang/BLEPropo
/media/uploads/lipoyang/blepropo_ui.png
ラジコンは、mbed HRM1017とRCサーボやDCモータを組み合わせて作ります。
/media/uploads/lipoyang/ble_wiring.png

Committer:
lipoyang
Date:
Thu Sep 11 14:02:31 2014 +0000
Revision:
6:1b978b32118c
Parent:
5:572c91221792
Child:
7:6115339996eb
2nd test version

Who changed what in which revision?

UserRevisionLine numberNew contents of line
jksoft 0:8c643bfe55b7 1 #include "mbed.h"
jksoft 1:48f6e08a3ac2 2 #include "BLEDevice.h"
jksoft 0:8c643bfe55b7 3
jksoft 1:48f6e08a3ac2 4 #define DBG 1
jksoft 0:8c643bfe55b7 5
lipoyang 5:572c91221792 6 // BLE device object
jksoft 1:48f6e08a3ac2 7 BLEDevice ble;
jksoft 0:8c643bfe55b7 8
lipoyang 5:572c91221792 9 // BluePropo service UUID
lipoyang 5:572c91221792 10 //static const uint16_t UUID_BLUEPROPO = 0xFFF0;
lipoyang 5:572c91221792 11 static const uint8_t UUID_BLUEPROPO[] =
lipoyang 5:572c91221792 12 { 0xc4, 0x9d, 0xfd, 0x1b, 0x86, 0x04, 0x41, 0xd2, 0x89, 0x43, 0x13, 0x6f, 0x21, 0x4d, 0xd0, 0xbf };
lipoyang 5:572c91221792 13
lipoyang 5:572c91221792 14 // BluePropo::Stick characteristic UUID
lipoyang 5:572c91221792 15 //static const uint16_t UUID_BLUEPROPO_STICK = 0xFFF1;
lipoyang 5:572c91221792 16 static const uint8_t UUID_BLUEPROPO_STICK[] =
lipoyang 5:572c91221792 17 { 0x74, 0x25, 0xfb, 0xa0, 0x72, 0x15, 0x41, 0x36, 0xaa, 0x3f, 0x07, 0x2a, 0xa0, 0x7d, 0x93, 0x54 };
jksoft 0:8c643bfe55b7 18
lipoyang 5:572c91221792 19 // BluePropo::Stick data structure
lipoyang 5:572c91221792 20 union StickData
lipoyang 5:572c91221792 21 {
lipoyang 5:572c91221792 22 struct {
lipoyang 5:572c91221792 23 // F(-128)<- 0 ->B(+127)
lipoyang 5:572c91221792 24 signed char fb;
lipoyang 5:572c91221792 25 // L(-128)<- 0 ->R(+127)
lipoyang 5:572c91221792 26 signed char lr;
lipoyang 5:572c91221792 27 }value;
lipoyang 5:572c91221792 28 unsigned char bytes[2];
lipoyang 5:572c91221792 29 };
lipoyang 5:572c91221792 30 StickData stickData;
jksoft 1:48f6e08a3ac2 31
lipoyang 5:572c91221792 32 // buffer for BluePropo payload
lipoyang 5:572c91221792 33 uint8_t payload[10] = {0,};
lipoyang 5:572c91221792 34
lipoyang 5:572c91221792 35 // BluePropo::Stick characteristic
lipoyang 5:572c91221792 36 GattCharacteristic charStick (UUID_BLUEPROPO_STICK, payload, 2, 2,
jksoft 0:8c643bfe55b7 37 GattCharacteristic::BLE_GATT_CHAR_PROPERTIES_WRITE |
jksoft 0:8c643bfe55b7 38 GattCharacteristic::BLE_GATT_CHAR_PROPERTIES_WRITE_WITHOUT_RESPONSE);
lipoyang 5:572c91221792 39 // BluePropo characteristics set
lipoyang 5:572c91221792 40 GattCharacteristic *chars[] = {&charStick};
lipoyang 5:572c91221792 41 // BluePropo service
lipoyang 5:572c91221792 42 GattService serviceBluePropo(UUID_BLUEPROPO, chars, sizeof(chars) / sizeof(GattCharacteristic *));
lipoyang 5:572c91221792 43
lipoyang 5:572c91221792 44 // USB COM port for Debug
lipoyang 5:572c91221792 45 Serial pc(USBTX, USBRX);
lipoyang 5:572c91221792 46
lipoyang 5:572c91221792 47 // pin asign
lipoyang 5:572c91221792 48 DigitalOut tb6612_ain1(P0_28);
lipoyang 5:572c91221792 49 DigitalOut tb6612_ain2(P0_29);
lipoyang 6:1b978b32118c 50 //PwmOut tb6612_pwma(P0_30);
lipoyang 6:1b978b32118c 51 //PwmOut servo_pwm (P0_12);
lipoyang 6:1b978b32118c 52 PwmOut servo_pwm (P0_30);
jksoft 0:8c643bfe55b7 53
lipoyang 5:572c91221792 54 // DC motor driver (TB6612)
lipoyang 5:572c91221792 55 void motor (float speed)
lipoyang 5:572c91221792 56 {
lipoyang 5:572c91221792 57 if (speed > 0) {
lipoyang 5:572c91221792 58 // CW
lipoyang 6:1b978b32118c 59 //tb6612_pwma = speed;
lipoyang 5:572c91221792 60 tb6612_ain1 = 1;
lipoyang 5:572c91221792 61 tb6612_ain2 = 0;
lipoyang 5:572c91221792 62 } else
lipoyang 5:572c91221792 63 if (speed < 0) {
lipoyang 5:572c91221792 64 // CCW
lipoyang 6:1b978b32118c 65 //tb6612_pwma = - speed;
lipoyang 5:572c91221792 66 tb6612_ain1 = 0;
lipoyang 5:572c91221792 67 tb6612_ain2 = 1;
lipoyang 5:572c91221792 68 } else {
lipoyang 5:572c91221792 69 // stop
lipoyang 6:1b978b32118c 70 //tb6612_pwma = 1;
lipoyang 5:572c91221792 71 tb6612_ain1 = 0;
lipoyang 5:572c91221792 72 tb6612_ain2 = 0;
lipoyang 5:572c91221792 73 // // break
lipoyang 5:572c91221792 74 // tb6612_pwma = 1;
lipoyang 5:572c91221792 75 // tb6612_ain1 = 1;
lipoyang 5:572c91221792 76 // tb6612_ain2 = 1;
lipoyang 5:572c91221792 77 }
lipoyang 5:572c91221792 78 }
jksoft 0:8c643bfe55b7 79
lipoyang 5:572c91221792 80 // RC servo
lipoyang 5:572c91221792 81 void servo (float deg)
lipoyang 5:572c91221792 82 {
lipoyang 5:572c91221792 83 servo_pwm.pulsewidth_us(1500 + (int)(500.0 * deg));
lipoyang 5:572c91221792 84 }
lipoyang 5:572c91221792 85
lipoyang 5:572c91221792 86 // BLE onConnection handler
jksoft 1:48f6e08a3ac2 87 void onConnected(uint16_t h)
jksoft 0:8c643bfe55b7 88 {
jksoft 0:8c643bfe55b7 89 #if DBG
jksoft 1:48f6e08a3ac2 90 pc.printf("Connected\n\r");
jksoft 0:8c643bfe55b7 91 #endif
jksoft 1:48f6e08a3ac2 92 }
jksoft 0:8c643bfe55b7 93
lipoyang 5:572c91221792 94 // BLE onDisconnection handler
jksoft 1:48f6e08a3ac2 95 void onDisconnected(uint16_t h)
jksoft 1:48f6e08a3ac2 96 {
jksoft 1:48f6e08a3ac2 97 ble.startAdvertising();
jksoft 0:8c643bfe55b7 98 #if DBG
jksoft 1:48f6e08a3ac2 99 pc.printf("Disconnected\n\r");
jksoft 0:8c643bfe55b7 100 #endif
jksoft 1:48f6e08a3ac2 101 }
jksoft 1:48f6e08a3ac2 102
lipoyang 5:572c91221792 103 // BLE onDataWritten handler (Gatt event)
jksoft 1:48f6e08a3ac2 104 void onDataWritten(uint16_t charHandle)
jksoft 0:8c643bfe55b7 105 {
lipoyang 5:572c91221792 106 if (charHandle == charStick.getHandle()) {
jksoft 1:48f6e08a3ac2 107 uint16_t bytesRead;
lipoyang 5:572c91221792 108 ble.readCharacteristicValue(charStick.getHandle(),payload, &bytesRead);
lipoyang 5:572c91221792 109 memcpy( &stickData.bytes[0], payload, sizeof(stickData));
jksoft 0:8c643bfe55b7 110 #if DBG
jksoft 1:48f6e08a3ac2 111
lipoyang 5:572c91221792 112 pc.printf("DATA:%02X %02X\n\r",stickData.bytes[0],stickData.bytes[1]);
jksoft 0:8c643bfe55b7 113 #endif
lipoyang 5:572c91221792 114 float m = (float)stickData.value.fb / 128.0;
lipoyang 5:572c91221792 115 motor(m);
lipoyang 5:572c91221792 116 float s = 0.5 + (float)stickData.value.lr /256.0;
lipoyang 5:572c91221792 117 if(s<0) s=0;
lipoyang 6:1b978b32118c 118 //servo(s);
jksoft 1:48f6e08a3ac2 119 }
jksoft 0:8c643bfe55b7 120
jksoft 1:48f6e08a3ac2 121 }
jksoft 0:8c643bfe55b7 122
lipoyang 5:572c91221792 123 // Program entry point
jksoft 0:8c643bfe55b7 124 int main(void)
jksoft 0:8c643bfe55b7 125 {
jksoft 0:8c643bfe55b7 126 #if DBG
jksoft 0:8c643bfe55b7 127 pc.printf("Start\n\r");
jksoft 0:8c643bfe55b7 128 #endif
lipoyang 5:572c91221792 129 // initialize servo & motor
lipoyang 5:572c91221792 130 servo_pwm.period_ms(20);
lipoyang 5:572c91221792 131 servo(0.5);
lipoyang 5:572c91221792 132 motor(0);
jksoft 1:48f6e08a3ac2 133
lipoyang 5:572c91221792 134 // initialize BLE
jksoft 2:dd85fdc18224 135 ble.init();
jksoft 1:48f6e08a3ac2 136 ble.onConnection(onConnected);
jksoft 1:48f6e08a3ac2 137 ble.onDisconnection(onDisconnected);
jksoft 1:48f6e08a3ac2 138 ble.onDataWritten(onDataWritten);
lipoyang 5:572c91221792 139 // setup advertising
jksoft 1:48f6e08a3ac2 140 ble.accumulateAdvertisingPayload(GapAdvertisingData::BREDR_NOT_SUPPORTED);
jksoft 1:48f6e08a3ac2 141 ble.setAdvertisingType(GapAdvertisingParams::ADV_CONNECTABLE_UNDIRECTED);
jksoft 1:48f6e08a3ac2 142 ble.accumulateAdvertisingPayload(GapAdvertisingData::SHORTENED_LOCAL_NAME,
lipoyang 5:572c91221792 143 (const uint8_t *)"MiniSteer HRM1017", sizeof("MiniSteer HRM1017") - 1);
jksoft 1:48f6e08a3ac2 144 ble.accumulateAdvertisingPayload(GapAdvertisingData::COMPLETE_LIST_16BIT_SERVICE_IDS,
lipoyang 5:572c91221792 145 (const uint8_t *)UUID_BLUEPROPO, sizeof(UUID_BLUEPROPO));
jksoft 1:48f6e08a3ac2 146 ble.setAdvertisingInterval(160); /* 100ms; in multiples of 0.625ms. */
jksoft 1:48f6e08a3ac2 147 ble.startAdvertising();
lipoyang 6:1b978b32118c 148 ///ble.addService(serviceBluePropo);
jksoft 0:8c643bfe55b7 149
lipoyang 5:572c91221792 150 // main loop (wait for BLE event)
jksoft 1:48f6e08a3ac2 151 while (true) {
lipoyang 6:1b978b32118c 152 //ble.waitForEvent();
jksoft 0:8c643bfe55b7 153 }
jksoft 0:8c643bfe55b7 154 }