RC-car remotely controlled from a computer. A demonstration of the power of Pytelemetry/telemetry. MIT Licensing.
Dependencies: BufferedSerial FRDM-TFC mbed telemetry
Example of the 'Telemetry' library, a portable communication library for embedded devices. The PC-side of this code is hosted a github.com/Overdrivr/telemetry-examples
This code uses the car from the Freescale Cup competition initially dedicated to be a line-following racing car, and turns it into a full-blown radio-controlled car.
It is using a Bluetooth serial module to provide wireless connectivity. See the repository at github.com/Overdrivr/telemetry-examples for complete instructions on wiring everthing together.
Repo : TO BE DONE
main.cpp@0:c5e974040f21, 2016-02-16 (annotated)
- Committer:
- Overdrivr
- Date:
- Tue Feb 16 20:33:33 2016 +0000
- Revision:
- 0:c5e974040f21
- Child:
- 1:5a07069e17b6
Initial commit
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
Overdrivr | 0:c5e974040f21 | 1 | #include "mbed.h" |
Overdrivr | 0:c5e974040f21 | 2 | #include "FRDM-TFC/TFC.h" |
Overdrivr | 0:c5e974040f21 | 3 | #include "telemetry/driver.hpp" |
Overdrivr | 0:c5e974040f21 | 4 | |
Overdrivr | 0:c5e974040f21 | 5 | DigitalOut led(LED1); |
Overdrivr | 0:c5e974040f21 | 6 | |
Overdrivr | 0:c5e974040f21 | 7 | struct TM_state { |
Overdrivr | 0:c5e974040f21 | 8 | float direction; |
Overdrivr | 0:c5e974040f21 | 9 | float throttle; |
Overdrivr | 0:c5e974040f21 | 10 | }; |
Overdrivr | 0:c5e974040f21 | 11 | |
Overdrivr | 0:c5e974040f21 | 12 | void process(TM_state* carState, TM_msg* msg); |
Overdrivr | 0:c5e974040f21 | 13 | |
Overdrivr | 0:c5e974040f21 | 14 | int main() |
Overdrivr | 0:c5e974040f21 | 15 | { |
Overdrivr | 0:c5e974040f21 | 16 | TM_state carState; |
Overdrivr | 0:c5e974040f21 | 17 | carState.direction = 0; |
Overdrivr | 0:c5e974040f21 | 18 | carState.throttle = 0; |
Overdrivr | 0:c5e974040f21 | 19 | Telemetry TM(&carState); |
Overdrivr | 0:c5e974040f21 | 20 | TM.sub(process); |
Overdrivr | 0:c5e974040f21 | 21 | |
Overdrivr | 0:c5e974040f21 | 22 | led = 1; |
Overdrivr | 0:c5e974040f21 | 23 | |
Overdrivr | 0:c5e974040f21 | 24 | TFC_Init(); |
Overdrivr | 0:c5e974040f21 | 25 | |
Overdrivr | 0:c5e974040f21 | 26 | Timer servo_timer; |
Overdrivr | 0:c5e974040f21 | 27 | Timer motor_timer; |
Overdrivr | 0:c5e974040f21 | 28 | Timer tm_timer; |
Overdrivr | 0:c5e974040f21 | 29 | Timer print_timer; |
Overdrivr | 0:c5e974040f21 | 30 | |
Overdrivr | 0:c5e974040f21 | 31 | servo_timer.start(); |
Overdrivr | 0:c5e974040f21 | 32 | motor_timer.start(); |
Overdrivr | 0:c5e974040f21 | 33 | tm_timer.start(); |
Overdrivr | 0:c5e974040f21 | 34 | print_timer.start(); |
Overdrivr | 0:c5e974040f21 | 35 | TFC_HBRIDGE_ENABLE; |
Overdrivr | 0:c5e974040f21 | 36 | for(;;) |
Overdrivr | 0:c5e974040f21 | 37 | { |
Overdrivr | 0:c5e974040f21 | 38 | // update telemetry |
Overdrivr | 0:c5e974040f21 | 39 | if(tm_timer.read_ms() > 50) |
Overdrivr | 0:c5e974040f21 | 40 | { |
Overdrivr | 0:c5e974040f21 | 41 | tm_timer.reset(); |
Overdrivr | 0:c5e974040f21 | 42 | TM.update(); |
Overdrivr | 0:c5e974040f21 | 43 | } |
Overdrivr | 0:c5e974040f21 | 44 | |
Overdrivr | 0:c5e974040f21 | 45 | // update servo control |
Overdrivr | 0:c5e974040f21 | 46 | if(servo_timer.read_ms() > 10) |
Overdrivr | 0:c5e974040f21 | 47 | { |
Overdrivr | 0:c5e974040f21 | 48 | servo_timer.reset(); |
Overdrivr | 0:c5e974040f21 | 49 | TFC_SetServo(0, carState.direction); |
Overdrivr | 0:c5e974040f21 | 50 | } |
Overdrivr | 0:c5e974040f21 | 51 | |
Overdrivr | 0:c5e974040f21 | 52 | // update motor control |
Overdrivr | 0:c5e974040f21 | 53 | if(motor_timer.read_ms() > 5) |
Overdrivr | 0:c5e974040f21 | 54 | { |
Overdrivr | 0:c5e974040f21 | 55 | motor_timer.reset(); |
Overdrivr | 0:c5e974040f21 | 56 | TFC_SetMotorPWM(carState.throttle , carState.throttle); |
Overdrivr | 0:c5e974040f21 | 57 | } |
Overdrivr | 0:c5e974040f21 | 58 | |
Overdrivr | 0:c5e974040f21 | 59 | // publish car state & blink a led |
Overdrivr | 0:c5e974040f21 | 60 | if(print_timer.read_ms() > 500) |
Overdrivr | 0:c5e974040f21 | 61 | { |
Overdrivr | 0:c5e974040f21 | 62 | print_timer.reset(); |
Overdrivr | 0:c5e974040f21 | 63 | TM.pub_f32("direction",carState.direction); |
Overdrivr | 0:c5e974040f21 | 64 | TM.pub_f32("throttle",carState.throttle); |
Overdrivr | 0:c5e974040f21 | 65 | led = (led == 0) ? 1 : 0; |
Overdrivr | 0:c5e974040f21 | 66 | } |
Overdrivr | 0:c5e974040f21 | 67 | } |
Overdrivr | 0:c5e974040f21 | 68 | } |
Overdrivr | 0:c5e974040f21 | 69 | |
Overdrivr | 0:c5e974040f21 | 70 | void process(TM_state* carState, TM_msg* msg) |
Overdrivr | 0:c5e974040f21 | 71 | { |
Overdrivr | 0:c5e974040f21 | 72 | float value = 0.f; |
Overdrivr | 0:c5e974040f21 | 73 | if(strcmp(msg->topic,"direction") == 0) |
Overdrivr | 0:c5e974040f21 | 74 | { |
Overdrivr | 0:c5e974040f21 | 75 | if(emplace_f32(msg,&value)) |
Overdrivr | 0:c5e974040f21 | 76 | { |
Overdrivr | 0:c5e974040f21 | 77 | if(value > 1.f) |
Overdrivr | 0:c5e974040f21 | 78 | value = 1.f; |
Overdrivr | 0:c5e974040f21 | 79 | if(value < -1.f) |
Overdrivr | 0:c5e974040f21 | 80 | value = -1.f; |
Overdrivr | 0:c5e974040f21 | 81 | carState->direction = value; |
Overdrivr | 0:c5e974040f21 | 82 | } |
Overdrivr | 0:c5e974040f21 | 83 | } |
Overdrivr | 0:c5e974040f21 | 84 | else if(strcmp(msg->topic,"throttle") == 0) |
Overdrivr | 0:c5e974040f21 | 85 | { |
Overdrivr | 0:c5e974040f21 | 86 | if(emplace_f32(msg,&value)) |
Overdrivr | 0:c5e974040f21 | 87 | { |
Overdrivr | 0:c5e974040f21 | 88 | if(value > 1.f) |
Overdrivr | 0:c5e974040f21 | 89 | value = 1.f; |
Overdrivr | 0:c5e974040f21 | 90 | if(value < -1.f) |
Overdrivr | 0:c5e974040f21 | 91 | value = -1.f; |
Overdrivr | 0:c5e974040f21 | 92 | carState->throttle = value; |
Overdrivr | 0:c5e974040f21 | 93 | } |
Overdrivr | 0:c5e974040f21 | 94 | } |
Overdrivr | 0:c5e974040f21 | 95 | } |