This is a demo for controlling your ShieldBot using your mobile phone

Dependencies:   BLE_API ShieldBot_v12 mbed nRF51822

Fork of BLE_LoopbackUART by Bluetooth Low Energy

Committer:
Kevin_Lee
Date:
Tue Sep 15 13:42:59 2015 +0000
Revision:
12:900318ccf3ae
Parent:
10:633cec718bf4
This is a demo to control the ShieldBot using your mobile phone

Who changed what in which revision?

UserRevisionLine numberNew contents of line
Kevin_Lee 12:900318ccf3ae 1 /*
Kevin_Lee 12:900318ccf3ae 2 * main.cpp
Kevin_Lee 12:900318ccf3ae 3 * A Demo for ShieldBot
Kevin_Lee 12:900318ccf3ae 4 *
Kevin_Lee 12:900318ccf3ae 5 * Copyright (c) 2015 seeed technology inc.
Kevin_Lee 12:900318ccf3ae 6 * Author : Jiankai.li
Kevin_Lee 12:900318ccf3ae 7 * Create Time: Sep 2015
Kevin_Lee 12:900318ccf3ae 8 * Change Log :
yihui 0:e910d9bb040f 9 *
Kevin_Lee 12:900318ccf3ae 10 * The MIT License (MIT)
yihui 0:e910d9bb040f 11 *
Kevin_Lee 12:900318ccf3ae 12 * Permission is hereby granted, free of charge, to any person obtaining a copy
Kevin_Lee 12:900318ccf3ae 13 * of this software and associated documentation files (the "Software"), to deal
Kevin_Lee 12:900318ccf3ae 14 * in the Software without restriction, including without limitation the rights
Kevin_Lee 12:900318ccf3ae 15 * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
Kevin_Lee 12:900318ccf3ae 16 * copies of the Software, and to permit persons to whom the Software is
Kevin_Lee 12:900318ccf3ae 17 * furnished to do so, subject to the following conditions:
Kevin_Lee 12:900318ccf3ae 18 *
Kevin_Lee 12:900318ccf3ae 19 * The above copyright notice and this permission notice shall be included in
Kevin_Lee 12:900318ccf3ae 20 * all copies or substantial portions of the Software.
Kevin_Lee 12:900318ccf3ae 21 *
Kevin_Lee 12:900318ccf3ae 22 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
Kevin_Lee 12:900318ccf3ae 23 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
Kevin_Lee 12:900318ccf3ae 24 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
Kevin_Lee 12:900318ccf3ae 25 * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
Kevin_Lee 12:900318ccf3ae 26 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
Kevin_Lee 12:900318ccf3ae 27 * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
Kevin_Lee 12:900318ccf3ae 28 * THE SOFTWARE.
yihui 0:e910d9bb040f 29 */
yihui 0:e910d9bb040f 30
Kevin_Lee 12:900318ccf3ae 31
yihui 0:e910d9bb040f 32 #include "mbed.h"
Rohit Grover 2:e060367b9024 33 #include "BLEDevice.h"
yihui 0:e910d9bb040f 34
rgrover1 6:e0fc9072e853 35 #include "UARTService.h"
Kevin_Lee 12:900318ccf3ae 36 #include "ShieldBot_v12.h"
Kevin_Lee 12:900318ccf3ae 37 #define NEED_CONSOLE_OUTPUT 1 /* Set this if you need debug messages on the console;
Rohit Grover 2:e060367b9024 38 * it will have an impact on code-size and power consumption. */
yihui 0:e910d9bb040f 39
Rohit Grover 2:e060367b9024 40 #if NEED_CONSOLE_OUTPUT
rgrover1 6:e0fc9072e853 41 #define DEBUG(...) { printf(__VA_ARGS__); }
yihui 0:e910d9bb040f 42 #else
Rohit Grover 2:e060367b9024 43 #define DEBUG(...) /* nothing */
Rohit Grover 2:e060367b9024 44 #endif /* #if NEED_CONSOLE_OUTPUT */
yihui 0:e910d9bb040f 45
Rohit Grover 2:e060367b9024 46 BLEDevice ble;
Rohit Grover 2:e060367b9024 47 DigitalOut led1(LED1);
yihui 0:e910d9bb040f 48
rgrover1 6:e0fc9072e853 49 UARTService *uartServicePtr;
Kevin_Lee 12:900318ccf3ae 50 Shieldbot shieldbot = Shieldbot();
Kevin_Lee 12:900318ccf3ae 51
Kevin_Lee 12:900318ccf3ae 52 void turnLeft()
Kevin_Lee 12:900318ccf3ae 53 {
Kevin_Lee 12:900318ccf3ae 54 shieldbot.drive(-127,127); //turn left on a dime
Kevin_Lee 12:900318ccf3ae 55 wait(0.4);
Kevin_Lee 12:900318ccf3ae 56 shieldbot.stop();
Kevin_Lee 12:900318ccf3ae 57 }
Kevin_Lee 12:900318ccf3ae 58
Kevin_Lee 12:900318ccf3ae 59 void turnRight()
Kevin_Lee 12:900318ccf3ae 60 {
Kevin_Lee 12:900318ccf3ae 61 shieldbot.drive(127,-127); //turn left on a dime
Kevin_Lee 12:900318ccf3ae 62 wait(0.4);
Kevin_Lee 12:900318ccf3ae 63 shieldbot.stop();
Kevin_Lee 12:900318ccf3ae 64 }
Kevin_Lee 12:900318ccf3ae 65
Kevin_Lee 12:900318ccf3ae 66
Kevin_Lee 12:900318ccf3ae 67 void processPacket(uint8_t *packet)
Kevin_Lee 12:900318ccf3ae 68 {
Kevin_Lee 12:900318ccf3ae 69 static int16_t speed = 255;
Kevin_Lee 12:900318ccf3ae 70 uint8_t cmd = packet[0];
Kevin_Lee 12:900318ccf3ae 71 DEBUG("comand: %c\n\r", cmd);
Kevin_Lee 12:900318ccf3ae 72 switch(cmd) {
Kevin_Lee 12:900318ccf3ae 73 case 'a':
Kevin_Lee 12:900318ccf3ae 74 turnLeft();
Kevin_Lee 12:900318ccf3ae 75 break;
Kevin_Lee 12:900318ccf3ae 76 case 'd':
Kevin_Lee 12:900318ccf3ae 77 turnRight();
Kevin_Lee 12:900318ccf3ae 78 break;
Kevin_Lee 12:900318ccf3ae 79 case 's':
Kevin_Lee 12:900318ccf3ae 80 shieldbot.backward();
Kevin_Lee 12:900318ccf3ae 81 break;
Kevin_Lee 12:900318ccf3ae 82 case 'w':
Kevin_Lee 12:900318ccf3ae 83 shieldbot.forward();
Kevin_Lee 12:900318ccf3ae 84 break;
Kevin_Lee 12:900318ccf3ae 85 case ' ':
Kevin_Lee 12:900318ccf3ae 86 shieldbot.stop();
Kevin_Lee 12:900318ccf3ae 87 break;
Kevin_Lee 12:900318ccf3ae 88 case '-':
Kevin_Lee 12:900318ccf3ae 89 speed -= 50;
Kevin_Lee 12:900318ccf3ae 90 if(speed <= 5){
Kevin_Lee 12:900318ccf3ae 91 speed = 5;
Kevin_Lee 12:900318ccf3ae 92 }
Kevin_Lee 12:900318ccf3ae 93 shieldbot.setMaxSpeed(speed);
Kevin_Lee 12:900318ccf3ae 94 break;
Kevin_Lee 12:900318ccf3ae 95 case '+':
Kevin_Lee 12:900318ccf3ae 96 speed += 50;
Kevin_Lee 12:900318ccf3ae 97 if(speed >= 255) {
Kevin_Lee 12:900318ccf3ae 98 speed = 255;
Kevin_Lee 12:900318ccf3ae 99 }
Kevin_Lee 12:900318ccf3ae 100 shieldbot.setMaxSpeed(speed);
Kevin_Lee 12:900318ccf3ae 101 break;
Kevin_Lee 12:900318ccf3ae 102 default:
Kevin_Lee 12:900318ccf3ae 103 break;
Kevin_Lee 12:900318ccf3ae 104 }
Kevin_Lee 12:900318ccf3ae 105 }
yihui 0:e910d9bb040f 106
rgrover1 5:4bc41267a03a 107 void disconnectionCallback(Gap::Handle_t handle, Gap::DisconnectionReason_t reason)
yihui 0:e910d9bb040f 108 {
Rohit Grover 2:e060367b9024 109 DEBUG("Disconnected!\n\r");
Rohit Grover 2:e060367b9024 110 DEBUG("Restarting the advertising process\n\r");
Rohit Grover 2:e060367b9024 111 ble.startAdvertising();
Rohit Grover 2:e060367b9024 112 }
yihui 0:e910d9bb040f 113
rgrover1 6:e0fc9072e853 114 void onDataWritten(const GattCharacteristicWriteCBParams *params)
yihui 0:e910d9bb040f 115 {
rgrover1 6:e0fc9072e853 116 if ((uartServicePtr != NULL) && (params->charHandle == uartServicePtr->getTXCharacteristicHandle())) {
rgrover1 5:4bc41267a03a 117 uint16_t bytesRead = params->len;
rgrover1 5:4bc41267a03a 118 DEBUG("received %u bytes\n\r", bytesRead);
rgrover1 6:e0fc9072e853 119 ble.updateCharacteristicValue(uartServicePtr->getRXCharacteristicHandle(), params->data, bytesRead);
Kevin_Lee 12:900318ccf3ae 120 processPacket((uint8_t *)params->data);
yihui 0:e910d9bb040f 121 }
Rohit Grover 2:e060367b9024 122 }
yihui 0:e910d9bb040f 123
Rohit Grover 2:e060367b9024 124 void periodicCallback(void)
Rohit Grover 2:e060367b9024 125 {
rgrover1 6:e0fc9072e853 126 led1 = !led1;
Rohit Grover 2:e060367b9024 127 }
yihui 0:e910d9bb040f 128
yihui 0:e910d9bb040f 129 int main(void)
yihui 0:e910d9bb040f 130 {
Rohit Grover 2:e060367b9024 131 led1 = 1;
Rohit Grover 2:e060367b9024 132 Ticker ticker;
Rohit Grover 2:e060367b9024 133 ticker.attach(periodicCallback, 1);
yihui 0:e910d9bb040f 134
Rohit Grover 2:e060367b9024 135 DEBUG("Initialising the nRF51822\n\r");
Rohit Grover 2:e060367b9024 136 ble.init();
Rohit Grover 2:e060367b9024 137 ble.onDisconnection(disconnectionCallback);
Rohit Grover 2:e060367b9024 138 ble.onDataWritten(onDataWritten);
yihui 0:e910d9bb040f 139
Rohit Grover 2:e060367b9024 140 /* setup advertising */
Rohit Grover 2:e060367b9024 141 ble.accumulateAdvertisingPayload(GapAdvertisingData::BREDR_NOT_SUPPORTED);
Rohit Grover 2:e060367b9024 142 ble.setAdvertisingType(GapAdvertisingParams::ADV_CONNECTABLE_UNDIRECTED);
Rohit Grover 2:e060367b9024 143 ble.accumulateAdvertisingPayload(GapAdvertisingData::SHORTENED_LOCAL_NAME,
Kevin_Lee 12:900318ccf3ae 144 (const uint8_t *)"ShieldBot", sizeof("ShieldBot") - 1);
Rohit Grover 2:e060367b9024 145 ble.accumulateAdvertisingPayload(GapAdvertisingData::COMPLETE_LIST_128BIT_SERVICE_IDS,
rgrover1 6:e0fc9072e853 146 (const uint8_t *)UARTServiceUUID_reversed, sizeof(UARTServiceUUID_reversed));
yihui 0:e910d9bb040f 147
rgrover1 10:633cec718bf4 148 ble.setAdvertisingInterval(Gap::MSEC_TO_ADVERTISEMENT_DURATION_UNITS(1000));
Rohit Grover 2:e060367b9024 149 ble.startAdvertising();
yihui 0:e910d9bb040f 150
rgrover1 6:e0fc9072e853 151 UARTService uartService(ble);
rgrover1 6:e0fc9072e853 152 uartServicePtr = &uartService;
yihui 0:e910d9bb040f 153
Rohit Grover 2:e060367b9024 154 while (true) {
Rohit Grover 2:e060367b9024 155 ble.waitForEvent();
yihui 0:e910d9bb040f 156 }
yihui 0:e910d9bb040f 157 }