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@3:add27c286be9, 2018-05-28 (annotated)
- Committer:
- kkillebrew
- Date:
- Mon May 28 18:26:42 2018 +0000
- Revision:
- 3:add27c286be9
- Parent:
- 2:a73f6db7efef
- Child:
- 4:bb9c8df5bef9
Slow spin speeds
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 | 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 | 3:add27c286be9 | 41 | // FIXME: this does not get sent as a singe byte, |
kkillebrew | 3:add27c286be9 | 42 | // but sometimes several |
kkillebrew | 2:a73f6db7efef | 43 | dev.puts(battery); |
kkillebrew | 1:5fc064b4c942 | 44 | break; |
kkillebrew | 1:5fc064b4c942 | 45 | } case 's': { |
kkillebrew | 1:5fc064b4c942 | 46 | m3pi.stop(); |
kkillebrew | 3:add27c286be9 | 47 | //m3pi.printf("stop"); |
kkillebrew | 1:5fc064b4c942 | 48 | break; |
kkillebrew | 1:5fc064b4c942 | 49 | } case 'z': { |
kkillebrew | 1:5fc064b4c942 | 50 | // spin left |
kkillebrew | 3:add27c286be9 | 51 | m3pi.left(0.1); |
kkillebrew | 1:5fc064b4c942 | 52 | break; |
kkillebrew | 1:5fc064b4c942 | 53 | } case 'y': { |
kkillebrew | 1:5fc064b4c942 | 54 | // spin right |
kkillebrew | 3:add27c286be9 | 55 | m3pi.right(0.1); |
kkillebrew | 1:5fc064b4c942 | 56 | break; |
kkillebrew | 1:5fc064b4c942 | 57 | } default: { |
kkillebrew | 1:5fc064b4c942 | 58 | m3pi.stop(); |
kkillebrew | 3:add27c286be9 | 59 | m3pi.cls(); |
kkillebrew | 3:add27c286be9 | 60 | m3pi.locate(0, 0); |
kkillebrew | 3:add27c286be9 | 61 | // print the buffer contents as ASCII on the first line |
kkillebrew | 3:add27c286be9 | 62 | m3pi.printf(str_buf); |
kkillebrew | 3:add27c286be9 | 63 | m3pi.locate(0, 1); |
kkillebrew | 1:5fc064b4c942 | 64 | m3pi.printf("?"); |
kkillebrew | 1:5fc064b4c942 | 65 | } |
kkillebrew | 1:5fc064b4c942 | 66 | } |
kkillebrew | 1:5fc064b4c942 | 67 | } |
kkillebrew | 0:25cb75cafbb8 | 68 | |
kkillebrew | 0:25cb75cafbb8 | 69 | void dev_recv() { |
kkillebrew | 0:25cb75cafbb8 | 70 | |
kkillebrew | 0:25cb75cafbb8 | 71 | // toggle the LED whenever a data transmission is received |
kkillebrew | 0:25cb75cafbb8 | 72 | led1 = !led1; |
kkillebrew | 0:25cb75cafbb8 | 73 | |
kkillebrew | 0:25cb75cafbb8 | 74 | int i = 0; |
kkillebrew | 0:25cb75cafbb8 | 75 | for (i=0; i < BUFF_LENGTH; i++) { |
kkillebrew | 0:25cb75cafbb8 | 76 | // let buffer empty if it's not ready to be read yet |
kkillebrew | 2:a73f6db7efef | 77 | int count = 0; |
kkillebrew | 2:a73f6db7efef | 78 | while (count <= 10) { |
kkillebrew | 2:a73f6db7efef | 79 | if (dev.readable()) |
kkillebrew | 2:a73f6db7efef | 80 | break; |
kkillebrew | 2:a73f6db7efef | 81 | wait(0.01f); |
kkillebrew | 2:a73f6db7efef | 82 | count++; |
kkillebrew | 0:25cb75cafbb8 | 83 | } |
kkillebrew | 0:25cb75cafbb8 | 84 | |
kkillebrew | 0:25cb75cafbb8 | 85 | // if still nothing to read after waiting, must have received |
kkillebrew | 0:25cb75cafbb8 | 86 | // less than BUFF_LENGTH bytes |
kkillebrew | 0:25cb75cafbb8 | 87 | if (!dev.readable()) { |
kkillebrew | 0:25cb75cafbb8 | 88 | break; |
kkillebrew | 0:25cb75cafbb8 | 89 | } |
kkillebrew | 0:25cb75cafbb8 | 90 | |
kkillebrew | 0:25cb75cafbb8 | 91 | uint8_t b = dev.getc(); |
kkillebrew | 0:25cb75cafbb8 | 92 | rx_buf[i] = b; |
kkillebrew | 0:25cb75cafbb8 | 93 | str_buf[i] = (char)b; |
kkillebrew | 0:25cb75cafbb8 | 94 | } |
kkillebrew | 0:25cb75cafbb8 | 95 | |
kkillebrew | 1:5fc064b4c942 | 96 | process_cmd(); |
kkillebrew | 0:25cb75cafbb8 | 97 | } |
kkillebrew | 0:25cb75cafbb8 | 98 | |
kkillebrew | 0:25cb75cafbb8 | 99 | int main() { |
kkillebrew | 0:25cb75cafbb8 | 100 | dev.baud(9600); |
kkillebrew | 1:5fc064b4c942 | 101 | // use CTS-only flow control |
kkillebrew | 1:5fc064b4c942 | 102 | dev.set_flow_control(Serial::CTS, p26); |
kkillebrew | 0:25cb75cafbb8 | 103 | dev.attach(&dev_recv, Serial::RxIrq); |
kkillebrew | 0:25cb75cafbb8 | 104 | m3pi.locate(0, 1); |
kkillebrew | 0:25cb75cafbb8 | 105 | m3pi.printf("BT LE"); |
kkillebrew | 0:25cb75cafbb8 | 106 | |
kkillebrew | 0:25cb75cafbb8 | 107 | while(1) { |
kkillebrew | 0:25cb75cafbb8 | 108 | sleep(); |
kkillebrew | 0:25cb75cafbb8 | 109 | } |
kkillebrew | 0:25cb75cafbb8 | 110 | } |