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@4:bb9c8df5bef9, 2018-05-29 (annotated)
- Committer:
- kkillebrew
- Date:
- Tue May 29 14:29:12 2018 +0000
- Revision:
- 4:bb9c8df5bef9
- Parent:
- 3:add27c286be9
First published version.
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 | 2:a73f6db7efef | 6 | RawSerial 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 | 4:bb9c8df5bef9 | 11 | const int MAX_SPEED = 255; |
kkillebrew | 4:bb9c8df5bef9 | 12 | const int MIN_SPEED = -255; |
kkillebrew | 0:25cb75cafbb8 | 13 | |
kkillebrew | 0:25cb75cafbb8 | 14 | uint8_t rx_buf[BUFF_LENGTH]; |
kkillebrew | 0:25cb75cafbb8 | 15 | char str_buf[BUFF_LENGTH]; |
kkillebrew | 1:5fc064b4c942 | 16 | char battery[BUFF_LENGTH] = ""; |
kkillebrew | 1:5fc064b4c942 | 17 | char str[BUFF_LENGTH] = ""; |
kkillebrew | 1:5fc064b4c942 | 18 | |
kkillebrew | 4:bb9c8df5bef9 | 19 | void drive(int left, int right) { |
kkillebrew | 4:bb9c8df5bef9 | 20 | // bounds check speeds |
kkillebrew | 4:bb9c8df5bef9 | 21 | if (right > MIN_SPEED && right < MAX_SPEED && |
kkillebrew | 4:bb9c8df5bef9 | 22 | left > MIN_SPEED && left < MAX_SPEED) { |
kkillebrew | 4:bb9c8df5bef9 | 23 | |
kkillebrew | 4:bb9c8df5bef9 | 24 | m3pi.left_motor(left); |
kkillebrew | 4:bb9c8df5bef9 | 25 | m3pi.right_motor(right); |
kkillebrew | 4:bb9c8df5bef9 | 26 | } |
kkillebrew | 4:bb9c8df5bef9 | 27 | } |
kkillebrew | 4:bb9c8df5bef9 | 28 | |
kkillebrew | 1:5fc064b4c942 | 29 | /** |
kkillebrew | 1:5fc064b4c942 | 30 | * Receive commands in the form of a one-character leading command, |
kkillebrew | 1:5fc064b4c942 | 31 | * followed by two optional wheel speeds, if driving forwards or back. |
kkillebrew | 1:5fc064b4c942 | 32 | * Wheel speeds are unsigned integers in the range of 0 (stop) to 255. |
kkillebrew | 1:5fc064b4c942 | 33 | */ |
kkillebrew | 1:5fc064b4c942 | 34 | void process_cmd() { |
kkillebrew | 1:5fc064b4c942 | 35 | char cmd = (char)rx_buf[0]; |
kkillebrew | 1:5fc064b4c942 | 36 | int right = (int)rx_buf[1]; |
kkillebrew | 1:5fc064b4c942 | 37 | int left = (int)rx_buf[2]; |
kkillebrew | 1:5fc064b4c942 | 38 | |
kkillebrew | 1:5fc064b4c942 | 39 | switch(cmd) { |
kkillebrew | 1:5fc064b4c942 | 40 | case 'f': { |
kkillebrew | 1:5fc064b4c942 | 41 | // forward |
kkillebrew | 4:bb9c8df5bef9 | 42 | drive(left, right); |
kkillebrew | 1:5fc064b4c942 | 43 | break; |
kkillebrew | 1:5fc064b4c942 | 44 | } case 'r': { |
kkillebrew | 1:5fc064b4c942 | 45 | // reverse |
kkillebrew | 4:bb9c8df5bef9 | 46 | drive(-left, -right); |
kkillebrew | 1:5fc064b4c942 | 47 | break; |
kkillebrew | 1:5fc064b4c942 | 48 | } case 'b': { |
kkillebrew | 1:5fc064b4c942 | 49 | // return battery level as 8-character string repr of float |
kkillebrew | 1:5fc064b4c942 | 50 | sprintf(battery, "%f", m3pi.battery()); |
kkillebrew | 3:add27c286be9 | 51 | // FIXME: this does not get sent as a singe byte, |
kkillebrew | 3:add27c286be9 | 52 | // but sometimes several |
kkillebrew | 2:a73f6db7efef | 53 | dev.puts(battery); |
kkillebrew | 1:5fc064b4c942 | 54 | break; |
kkillebrew | 1:5fc064b4c942 | 55 | } case 's': { |
kkillebrew | 1:5fc064b4c942 | 56 | m3pi.stop(); |
kkillebrew | 3:add27c286be9 | 57 | //m3pi.printf("stop"); |
kkillebrew | 1:5fc064b4c942 | 58 | break; |
kkillebrew | 1:5fc064b4c942 | 59 | } case 'z': { |
kkillebrew | 1:5fc064b4c942 | 60 | // spin left |
kkillebrew | 3:add27c286be9 | 61 | m3pi.left(0.1); |
kkillebrew | 1:5fc064b4c942 | 62 | break; |
kkillebrew | 1:5fc064b4c942 | 63 | } case 'y': { |
kkillebrew | 1:5fc064b4c942 | 64 | // spin right |
kkillebrew | 3:add27c286be9 | 65 | m3pi.right(0.1); |
kkillebrew | 1:5fc064b4c942 | 66 | break; |
kkillebrew | 1:5fc064b4c942 | 67 | } default: { |
kkillebrew | 1:5fc064b4c942 | 68 | m3pi.stop(); |
kkillebrew | 3:add27c286be9 | 69 | m3pi.cls(); |
kkillebrew | 3:add27c286be9 | 70 | m3pi.locate(0, 0); |
kkillebrew | 3:add27c286be9 | 71 | // print the buffer contents as ASCII on the first line |
kkillebrew | 3:add27c286be9 | 72 | m3pi.printf(str_buf); |
kkillebrew | 3:add27c286be9 | 73 | m3pi.locate(0, 1); |
kkillebrew | 1:5fc064b4c942 | 74 | m3pi.printf("?"); |
kkillebrew | 1:5fc064b4c942 | 75 | } |
kkillebrew | 1:5fc064b4c942 | 76 | } |
kkillebrew | 1:5fc064b4c942 | 77 | } |
kkillebrew | 0:25cb75cafbb8 | 78 | |
kkillebrew | 0:25cb75cafbb8 | 79 | void dev_recv() { |
kkillebrew | 0:25cb75cafbb8 | 80 | |
kkillebrew | 0:25cb75cafbb8 | 81 | // toggle the LED whenever a data transmission is received |
kkillebrew | 0:25cb75cafbb8 | 82 | led1 = !led1; |
kkillebrew | 0:25cb75cafbb8 | 83 | |
kkillebrew | 0:25cb75cafbb8 | 84 | int i = 0; |
kkillebrew | 0:25cb75cafbb8 | 85 | for (i=0; i < BUFF_LENGTH; i++) { |
kkillebrew | 0:25cb75cafbb8 | 86 | // let buffer empty if it's not ready to be read yet |
kkillebrew | 2:a73f6db7efef | 87 | int count = 0; |
kkillebrew | 2:a73f6db7efef | 88 | while (count <= 10) { |
kkillebrew | 2:a73f6db7efef | 89 | if (dev.readable()) |
kkillebrew | 2:a73f6db7efef | 90 | break; |
kkillebrew | 2:a73f6db7efef | 91 | wait(0.01f); |
kkillebrew | 2:a73f6db7efef | 92 | count++; |
kkillebrew | 0:25cb75cafbb8 | 93 | } |
kkillebrew | 0:25cb75cafbb8 | 94 | |
kkillebrew | 0:25cb75cafbb8 | 95 | // if still nothing to read after waiting, must have received |
kkillebrew | 0:25cb75cafbb8 | 96 | // less than BUFF_LENGTH bytes |
kkillebrew | 0:25cb75cafbb8 | 97 | if (!dev.readable()) { |
kkillebrew | 0:25cb75cafbb8 | 98 | break; |
kkillebrew | 0:25cb75cafbb8 | 99 | } |
kkillebrew | 0:25cb75cafbb8 | 100 | |
kkillebrew | 0:25cb75cafbb8 | 101 | uint8_t b = dev.getc(); |
kkillebrew | 0:25cb75cafbb8 | 102 | rx_buf[i] = b; |
kkillebrew | 0:25cb75cafbb8 | 103 | str_buf[i] = (char)b; |
kkillebrew | 0:25cb75cafbb8 | 104 | } |
kkillebrew | 0:25cb75cafbb8 | 105 | |
kkillebrew | 1:5fc064b4c942 | 106 | process_cmd(); |
kkillebrew | 0:25cb75cafbb8 | 107 | } |
kkillebrew | 0:25cb75cafbb8 | 108 | |
kkillebrew | 0:25cb75cafbb8 | 109 | int main() { |
kkillebrew | 0:25cb75cafbb8 | 110 | dev.baud(9600); |
kkillebrew | 1:5fc064b4c942 | 111 | // use CTS-only flow control |
kkillebrew | 1:5fc064b4c942 | 112 | dev.set_flow_control(Serial::CTS, p26); |
kkillebrew | 0:25cb75cafbb8 | 113 | dev.attach(&dev_recv, Serial::RxIrq); |
kkillebrew | 0:25cb75cafbb8 | 114 | m3pi.locate(0, 1); |
kkillebrew | 0:25cb75cafbb8 | 115 | m3pi.printf("BT LE"); |
kkillebrew | 0:25cb75cafbb8 | 116 | |
kkillebrew | 0:25cb75cafbb8 | 117 | while(1) { |
kkillebrew | 0:25cb75cafbb8 | 118 | sleep(); |
kkillebrew | 0:25cb75cafbb8 | 119 | } |
kkillebrew | 0:25cb75cafbb8 | 120 | } |