Racing Robots Session

Dependencies:   MbedJSONValue m3pi

This is the library for the Racing Robots session. It supports the M3PI robot of Polulu.

It is based on the "Arduino" principle of the init and loop function.

Just add a main.cpp file which contains:

Racing Robots main file

#include "robot_logic.h"

void init()
{
   //put your initialization logic here
}

void loop()
{
    //put your robot control logic here    
}

Features include:

  1. Controlling the LEDS
  2. Move forward and backward
  3. Turn
  4. Read the sensor values
  5. Use a PID controller
Committer:
dwini
Date:
Mon Feb 23 12:24:31 2015 +0000
Revision:
0:c0ae66a0ec7a
Child:
2:356bb8d99326
Define interface of pololu for racing robots.

Who changed what in which revision?

UserRevisionLine numberNew contents of line
dwini 0:c0ae66a0ec7a 1 #include "robot_logic.h"
dwini 0:c0ae66a0ec7a 2
dwini 0:c0ae66a0ec7a 3 m3pi m3pi;
dwini 0:c0ae66a0ec7a 4
dwini 0:c0ae66a0ec7a 5 #define MAX_SPEED 1.0
dwini 0:c0ae66a0ec7a 6 #define MAX_TURN_SPEED 1.0
dwini 0:c0ae66a0ec7a 7
dwini 0:c0ae66a0ec7a 8 /*
dwini 0:c0ae66a0ec7a 9 * Drive the robot forward or backward.
dwini 0:c0ae66a0ec7a 10 *
dwini 0:c0ae66a0ec7a 11 * @speed The speed percentage with which to drive forward or backward.
dwini 0:c0ae66a0ec7a 12 * Can range from -100 (full throttle backward) to +100 (full throttle forward).
dwini 0:c0ae66a0ec7a 13 */
dwini 0:c0ae66a0ec7a 14 void drive(int speed) {
dwini 0:c0ae66a0ec7a 15 if (speed > 100 || speed < -100) {
dwini 0:c0ae66a0ec7a 16 printf("[ERROR] Drive speed out of range");
dwini 0:c0ae66a0ec7a 17 return;
dwini 0:c0ae66a0ec7a 18 }
dwini 0:c0ae66a0ec7a 19
dwini 0:c0ae66a0ec7a 20 if (speed == 0) {
dwini 0:c0ae66a0ec7a 21 m3pi.stop();
dwini 0:c0ae66a0ec7a 22 } else if (speed > 0) {
dwini 0:c0ae66a0ec7a 23 m3pi.forward(MAX_SPEED*speed/100.0);
dwini 0:c0ae66a0ec7a 24 } else if (speed < 0) {
dwini 0:c0ae66a0ec7a 25 m3pi.backward(MAX_SPEED*-speed/100.0);
dwini 0:c0ae66a0ec7a 26 }
dwini 0:c0ae66a0ec7a 27 }
dwini 0:c0ae66a0ec7a 28
dwini 0:c0ae66a0ec7a 29 /*
dwini 0:c0ae66a0ec7a 30 * Turn the robot left or right.
dwini 0:c0ae66a0ec7a 31 *
dwini 0:c0ae66a0ec7a 32 * @speed The speed percentage with which to turn the robot.
dwini 0:c0ae66a0ec7a 33 * Can range from -100 (full throttle left) to +100 (full throttle right).
dwini 0:c0ae66a0ec7a 34 */
dwini 0:c0ae66a0ec7a 35 void turn(int turnspeed) {
dwini 0:c0ae66a0ec7a 36 if (turnspeed > 100 || turnspeed < -100) {
dwini 0:c0ae66a0ec7a 37 printf("[ERROR] Turn speed out of range");
dwini 0:c0ae66a0ec7a 38 return;
dwini 0:c0ae66a0ec7a 39 }
dwini 0:c0ae66a0ec7a 40
dwini 0:c0ae66a0ec7a 41 if (turnspeed == 0) {
dwini 0:c0ae66a0ec7a 42 m3pi.stop();
dwini 0:c0ae66a0ec7a 43 } else if (turnspeed > 0) {
dwini 0:c0ae66a0ec7a 44 m3pi.right(MAX_TURN_SPEED*turnspeed/100.0);
dwini 0:c0ae66a0ec7a 45 } else if (turnspeed < 0) {
dwini 0:c0ae66a0ec7a 46 m3pi.left(MAX_TURN_SPEED*-turnspeed/100.0);
dwini 0:c0ae66a0ec7a 47 }
dwini 0:c0ae66a0ec7a 48 }
dwini 0:c0ae66a0ec7a 49
dwini 0:c0ae66a0ec7a 50 /*
dwini 0:c0ae66a0ec7a 51 * Stop the robot.
dwini 0:c0ae66a0ec7a 52 */
dwini 0:c0ae66a0ec7a 53 void stop(void) {
dwini 0:c0ae66a0ec7a 54 m3pi.stop();
dwini 0:c0ae66a0ec7a 55 }
dwini 0:c0ae66a0ec7a 56
dwini 0:c0ae66a0ec7a 57 /*
dwini 0:c0ae66a0ec7a 58 * Read the value from the line sensor. The returned value indicates the
dwini 0:c0ae66a0ec7a 59 * position of the line. The value ranges from -100 to +100 where -100 is
dwini 0:c0ae66a0ec7a 60 * fully left, +100 is fully right and 0 means the line is detected in the middle.
dwini 0:c0ae66a0ec7a 61 *
dwini 0:c0ae66a0ec7a 62 * @return The position of the line with a range of -100 to +100.
dwini 0:c0ae66a0ec7a 63 */
dwini 0:c0ae66a0ec7a 64 int line_sensor(void) {
dwini 0:c0ae66a0ec7a 65 // Get position of line [-1.0, +1.0]
dwini 0:c0ae66a0ec7a 66 float pos = m3pi.line_position();
dwini 0:c0ae66a0ec7a 67 return ((int)(pos * 100));
dwini 0:c0ae66a0ec7a 68 }
dwini 0:c0ae66a0ec7a 69
dwini 0:c0ae66a0ec7a 70
dwini 0:c0ae66a0ec7a 71
dwini 0:c0ae66a0ec7a 72 // Show drive speed and sensor data
dwini 0:c0ae66a0ec7a 73 void showStats(void) {
dwini 0:c0ae66a0ec7a 74 m3pi.cls(); // Clear display
dwini 0:c0ae66a0ec7a 75
dwini 0:c0ae66a0ec7a 76 // Display speed
dwini 0:c0ae66a0ec7a 77 m3pi.locate(0, 0);
dwini 0:c0ae66a0ec7a 78 // x The horizontal position, from 0 to 7
dwini 0:c0ae66a0ec7a 79 // y The vertical position, from 0 to 1
dwini 0:c0ae66a0ec7a 80 m3pi.printf("FOR 100%%");
dwini 0:c0ae66a0ec7a 81
dwini 0:c0ae66a0ec7a 82 // Display line
dwini 0:c0ae66a0ec7a 83 m3pi.locate(0, 1);
dwini 0:c0ae66a0ec7a 84 int line = line_sensor();
dwini 0:c0ae66a0ec7a 85 m3pi.printf("LINE %d", line);
dwini 0:c0ae66a0ec7a 86 }
dwini 0:c0ae66a0ec7a 87
dwini 0:c0ae66a0ec7a 88
dwini 0:c0ae66a0ec7a 89
dwini 0:c0ae66a0ec7a 90
dwini 0:c0ae66a0ec7a 91 /*
dwini 0:c0ae66a0ec7a 92 * Wait for an approximate number of milliseconds.
dwini 0:c0ae66a0ec7a 93 *
dwini 0:c0ae66a0ec7a 94 * @milliseconds The number of milliseconds to wait.
dwini 0:c0ae66a0ec7a 95 */
dwini 0:c0ae66a0ec7a 96 void doWait(int milliseconds) {
dwini 0:c0ae66a0ec7a 97 wait_ms(milliseconds);
dwini 0:c0ae66a0ec7a 98 }