Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
Dependencies: m3piExpandedCommandSet mbed
main.cpp@1:5fc064b4c942, 2018-05-27 (annotated)
- Committer:
- kkillebrew
- Date:
- Sun May 27 22:06:26 2018 +0000
- Revision:
- 1:5fc064b4c942
- Parent:
- 0:25cb75cafbb8
- Child:
- 2:a73f6db7efef
Add command set for controlling m3pi via bluetooth.
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
kkillebrew | 0:25cb75cafbb8 | 1 | #include "mbed.h" |
kkillebrew | 0:25cb75cafbb8 | 2 | #include "m3pi.h" |
kkillebrew | 0:25cb75cafbb8 | 3 | |
kkillebrew | 0:25cb75cafbb8 | 4 | m3pi m3pi; |
kkillebrew | 0:25cb75cafbb8 | 5 | |
kkillebrew | 0:25cb75cafbb8 | 6 | Serial dev(p28,p27); |
kkillebrew | 0:25cb75cafbb8 | 7 | DigitalOut led1(LED1); |
kkillebrew | 0:25cb75cafbb8 | 8 | |
kkillebrew | 1:5fc064b4c942 | 9 | // default serial buffer length is 8 bytes |
kkillebrew | 0:25cb75cafbb8 | 10 | const int BUFF_LENGTH = 8; |
kkillebrew | 0:25cb75cafbb8 | 11 | |
kkillebrew | 0:25cb75cafbb8 | 12 | uint8_t rx_buf[BUFF_LENGTH]; |
kkillebrew | 0:25cb75cafbb8 | 13 | char str_buf[BUFF_LENGTH]; |
kkillebrew | 1:5fc064b4c942 | 14 | char battery[BUFF_LENGTH] = ""; |
kkillebrew | 1:5fc064b4c942 | 15 | char str[BUFF_LENGTH] = ""; |
kkillebrew | 1:5fc064b4c942 | 16 | |
kkillebrew | 1:5fc064b4c942 | 17 | /** |
kkillebrew | 1:5fc064b4c942 | 18 | * Receive commands in the form of a one-character leading command, |
kkillebrew | 1:5fc064b4c942 | 19 | * followed by two optional wheel speeds, if driving forwards or back. |
kkillebrew | 1:5fc064b4c942 | 20 | * Wheel speeds are unsigned integers in the range of 0 (stop) to 255. |
kkillebrew | 1:5fc064b4c942 | 21 | */ |
kkillebrew | 1:5fc064b4c942 | 22 | void process_cmd() { |
kkillebrew | 1:5fc064b4c942 | 23 | char cmd = (char)rx_buf[0]; |
kkillebrew | 1:5fc064b4c942 | 24 | int right = (int)rx_buf[1]; |
kkillebrew | 1:5fc064b4c942 | 25 | int left = (int)rx_buf[2]; |
kkillebrew | 1:5fc064b4c942 | 26 | |
kkillebrew | 1:5fc064b4c942 | 27 | switch(cmd) { |
kkillebrew | 1:5fc064b4c942 | 28 | case 'f': { |
kkillebrew | 1:5fc064b4c942 | 29 | // forward |
kkillebrew | 1:5fc064b4c942 | 30 | m3pi.left_motor(left); |
kkillebrew | 1:5fc064b4c942 | 31 | m3pi.right_motor(right); |
kkillebrew | 1:5fc064b4c942 | 32 | break; |
kkillebrew | 1:5fc064b4c942 | 33 | } case 'r': { |
kkillebrew | 1:5fc064b4c942 | 34 | // reverse |
kkillebrew | 1:5fc064b4c942 | 35 | m3pi.left_motor(-left); |
kkillebrew | 1:5fc064b4c942 | 36 | m3pi.right_motor(-right); |
kkillebrew | 1:5fc064b4c942 | 37 | break; |
kkillebrew | 1:5fc064b4c942 | 38 | } case 'b': { |
kkillebrew | 1:5fc064b4c942 | 39 | // return battery level as 8-character string repr of float |
kkillebrew | 1:5fc064b4c942 | 40 | sprintf(battery, "%f", m3pi.battery()); |
kkillebrew | 1:5fc064b4c942 | 41 | int len = strlen(battery); |
kkillebrew | 1:5fc064b4c942 | 42 | for (int i = 0; i < len; i++) { |
kkillebrew | 1:5fc064b4c942 | 43 | dev.putc(battery[i]); |
kkillebrew | 1:5fc064b4c942 | 44 | } |
kkillebrew | 1:5fc064b4c942 | 45 | break; |
kkillebrew | 1:5fc064b4c942 | 46 | } case 's': { |
kkillebrew | 1:5fc064b4c942 | 47 | m3pi.stop(); |
kkillebrew | 1:5fc064b4c942 | 48 | m3pi.printf("stop"); |
kkillebrew | 1:5fc064b4c942 | 49 | break; |
kkillebrew | 1:5fc064b4c942 | 50 | } case 'z': { |
kkillebrew | 1:5fc064b4c942 | 51 | // spin left |
kkillebrew | 1:5fc064b4c942 | 52 | m3pi.left(0.2); |
kkillebrew | 1:5fc064b4c942 | 53 | break; |
kkillebrew | 1:5fc064b4c942 | 54 | } case 'y': { |
kkillebrew | 1:5fc064b4c942 | 55 | // spin right |
kkillebrew | 1:5fc064b4c942 | 56 | m3pi.right(0.2); |
kkillebrew | 1:5fc064b4c942 | 57 | break; |
kkillebrew | 1:5fc064b4c942 | 58 | } default: { |
kkillebrew | 1:5fc064b4c942 | 59 | m3pi.stop(); |
kkillebrew | 1:5fc064b4c942 | 60 | m3pi.printf("?"); |
kkillebrew | 1:5fc064b4c942 | 61 | } |
kkillebrew | 1:5fc064b4c942 | 62 | } |
kkillebrew | 1:5fc064b4c942 | 63 | } |
kkillebrew | 0:25cb75cafbb8 | 64 | |
kkillebrew | 0:25cb75cafbb8 | 65 | void dev_recv() { |
kkillebrew | 0:25cb75cafbb8 | 66 | |
kkillebrew | 0:25cb75cafbb8 | 67 | // toggle the LED whenever a data transmission is received |
kkillebrew | 0:25cb75cafbb8 | 68 | led1 = !led1; |
kkillebrew | 0:25cb75cafbb8 | 69 | |
kkillebrew | 0:25cb75cafbb8 | 70 | int i = 0; |
kkillebrew | 0:25cb75cafbb8 | 71 | for (i=0; i < BUFF_LENGTH; i++) { |
kkillebrew | 0:25cb75cafbb8 | 72 | // let buffer empty if it's not ready to be read yet |
kkillebrew | 0:25cb75cafbb8 | 73 | if (!dev.readable()) { |
kkillebrew | 0:25cb75cafbb8 | 74 | wait(0.1f); |
kkillebrew | 0:25cb75cafbb8 | 75 | } |
kkillebrew | 0:25cb75cafbb8 | 76 | |
kkillebrew | 0:25cb75cafbb8 | 77 | // if still nothing to read after waiting, must have received |
kkillebrew | 0:25cb75cafbb8 | 78 | // less than BUFF_LENGTH bytes |
kkillebrew | 0:25cb75cafbb8 | 79 | if (!dev.readable()) { |
kkillebrew | 0:25cb75cafbb8 | 80 | break; |
kkillebrew | 0:25cb75cafbb8 | 81 | } |
kkillebrew | 0:25cb75cafbb8 | 82 | |
kkillebrew | 0:25cb75cafbb8 | 83 | uint8_t b = dev.getc(); |
kkillebrew | 0:25cb75cafbb8 | 84 | rx_buf[i] = b; |
kkillebrew | 0:25cb75cafbb8 | 85 | str_buf[i] = (char)b; |
kkillebrew | 0:25cb75cafbb8 | 86 | } |
kkillebrew | 0:25cb75cafbb8 | 87 | |
kkillebrew | 0:25cb75cafbb8 | 88 | m3pi.cls(); |
kkillebrew | 0:25cb75cafbb8 | 89 | m3pi.locate(0,0); |
kkillebrew | 0:25cb75cafbb8 | 90 | |
kkillebrew | 0:25cb75cafbb8 | 91 | // print the buffer contents as ASCII on the first line |
kkillebrew | 0:25cb75cafbb8 | 92 | m3pi.print(str_buf, i); |
kkillebrew | 0:25cb75cafbb8 | 93 | |
kkillebrew | 1:5fc064b4c942 | 94 | m3pi.locate(0, 1); |
kkillebrew | 1:5fc064b4c942 | 95 | |
kkillebrew | 1:5fc064b4c942 | 96 | /* |
kkillebrew | 0:25cb75cafbb8 | 97 | // print the buffer length on the second line |
kkillebrew | 0:25cb75cafbb8 | 98 | sprintf(str, "%d", i); |
kkillebrew | 0:25cb75cafbb8 | 99 | m3pi.printf(str); |
kkillebrew | 1:5fc064b4c942 | 100 | */ |
kkillebrew | 1:5fc064b4c942 | 101 | process_cmd(); |
kkillebrew | 0:25cb75cafbb8 | 102 | } |
kkillebrew | 0:25cb75cafbb8 | 103 | |
kkillebrew | 0:25cb75cafbb8 | 104 | int main() { |
kkillebrew | 0:25cb75cafbb8 | 105 | dev.baud(9600); |
kkillebrew | 1:5fc064b4c942 | 106 | // use CTS-only flow control |
kkillebrew | 1:5fc064b4c942 | 107 | dev.set_flow_control(Serial::CTS, p26); |
kkillebrew | 0:25cb75cafbb8 | 108 | dev.attach(&dev_recv, Serial::RxIrq); |
kkillebrew | 0:25cb75cafbb8 | 109 | m3pi.locate(0, 1); |
kkillebrew | 0:25cb75cafbb8 | 110 | m3pi.printf("BT LE"); |
kkillebrew | 0:25cb75cafbb8 | 111 | |
kkillebrew | 0:25cb75cafbb8 | 112 | while(1) { |
kkillebrew | 0:25cb75cafbb8 | 113 | sleep(); |
kkillebrew | 0:25cb75cafbb8 | 114 | } |
kkillebrew | 0:25cb75cafbb8 | 115 | } |