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

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?

UserRevisionLine numberNew 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 }