m3Dpi robot, based on the Pololu 3pi and m3pi. m3Dpi has multiple distance sensors, gyroscope, compass and accelerometer sensor to be fully aware of its environment. With the addition of xbee or nrf24n01 module it has wireless communication capabilities.

Dependencies:   m3Dpi mbed-rtos mbed MbedJSONValue

Committer:
sillevl
Date:
Wed Jan 20 17:21:31 2016 +0000
Revision:
14:06576ab99415
Parent:
13:d6374484b953
Child:
16:0043244f8a61
adding RTOS to manage tasks

Who changed what in which revision?

UserRevisionLine numberNew contents of line
sillevl 7:9068fc754a0b 1 #include "mbed.h"
sillevl 14:06576ab99415 2 #include "rtos.h"
sillevl 1:6f620263c9f8 3 #include "M3Dpi.h"
sillevl 7:9068fc754a0b 4 #include "jsonReporter.h"
sillevl 13:d6374484b953 5 #include "binaryReporter.h"
sillevl 6:414e1fea64f3 6
sillevl 14:06576ab99415 7 const char M3DPI_ID[] = "1234567890";
sillevl 6:414e1fea64f3 8
sillevl 7:9068fc754a0b 9 M3Dpi robot;
sillevl 7:9068fc754a0b 10 Serial pc(USBTX,USBRX);
sillevl 14:06576ab99415 11 Reporter* report = new JsonReporter(&pc, M3DPI_ID);
sillevl 11:ccb8653e285f 12
sillevl 11:ccb8653e285f 13 m3dpi::Distance distance;
sillevl 11:ccb8653e285f 14 m3dpi::Direction direction;
sillevl 11:ccb8653e285f 15 m3dpi::Rotation rotation;
sillevl 11:ccb8653e285f 16 m3dpi::Acceleration acceleration;
sillevl 6:414e1fea64f3 17
sillevl 6:414e1fea64f3 18
sillevl 6:414e1fea64f3 19 void setLeds(m3dpi::Distance distance)
sillevl 6:414e1fea64f3 20 {
sillevl 6:414e1fea64f3 21 int colors[8] = {distance.front, distance.front_right, distance.right, distance.back_right, distance.back, distance.back_left, distance.left, distance.front_left};
sillevl 6:414e1fea64f3 22 // shift distance value to get red colors
sillevl 6:414e1fea64f3 23 for(int i = 0; i < 8; i++){
sillevl 14:06576ab99415 24 colors[i] = ((~(colors[i]*2)) & 0xFF) << 16;
sillevl 6:414e1fea64f3 25 }
sillevl 6:414e1fea64f3 26 robot.setLeds(colors);
sillevl 6:414e1fea64f3 27 }
sillevl 6:414e1fea64f3 28
sillevl 14:06576ab99415 29 void read_sensors_task(void const *name)
sillevl 6:414e1fea64f3 30 {
sillevl 14:06576ab99415 31 //Timer t; t.start();
sillevl 7:9068fc754a0b 32 robot.setStatus(Color::GREEN);
sillevl 11:ccb8653e285f 33 ::distance = robot.getDistance();
sillevl 11:ccb8653e285f 34 direction = robot.getDirection();
sillevl 11:ccb8653e285f 35 rotation = robot.getRotation();
sillevl 11:ccb8653e285f 36 acceleration = robot.getAcceleration();
sillevl 11:ccb8653e285f 37 setLeds(::distance);
sillevl 11:ccb8653e285f 38 robot.setStatus(Color::BLACK);
sillevl 14:06576ab99415 39 //t.stop();pc.printf("*** Sensor acquisition time: %d us\r\n", t.read_us());
sillevl 14:06576ab99415 40 }
sillevl 14:06576ab99415 41
sillevl 14:06576ab99415 42 void report_task(void const *name)
sillevl 14:06576ab99415 43 {
sillevl 14:06576ab99415 44 //Timer t; t.start();
sillevl 14:06576ab99415 45 report->distance(::distance);
sillevl 14:06576ab99415 46 report->direction(direction);
sillevl 14:06576ab99415 47 report->rotation(rotation);
sillevl 14:06576ab99415 48 report->acceleration(acceleration);
sillevl 14:06576ab99415 49 //t.stop();pc.printf("*** Report time: %d us\r\n", t.read_us());
sillevl 14:06576ab99415 50 }
sillevl 14:06576ab99415 51
sillevl 14:06576ab99415 52 void receive_task(void const *name)
sillevl 14:06576ab99415 53 {
sillevl 14:06576ab99415 54
sillevl 14:06576ab99415 55 }
sillevl 14:06576ab99415 56
sillevl 14:06576ab99415 57 void idle_task(void const *name)
sillevl 14:06576ab99415 58 {
sillevl 14:06576ab99415 59
sillevl 6:414e1fea64f3 60 }
sillevl 0:ab0ce9ab81bf 61
sillevl 1:6f620263c9f8 62 int main()
sillevl 6:414e1fea64f3 63 {
sillevl 1:6f620263c9f8 64 pc.baud(115200);
sillevl 14:06576ab99415 65
sillevl 14:06576ab99415 66 RtosTimer read_sensors_timer(read_sensors_task, osTimerPeriodic);
sillevl 14:06576ab99415 67 read_sensors_timer.start(50);
sillevl 14:06576ab99415 68
sillevl 14:06576ab99415 69 RtosTimer report_timer(report_task, osTimerPeriodic);
sillevl 14:06576ab99415 70 report_timer.start(500);
sillevl 14:06576ab99415 71
sillevl 14:06576ab99415 72 Thread receive_thread(receive_task);
sillevl 14:06576ab99415 73 Thread idle_thread(idle_task, NULL, osPriorityLow);
sillevl 14:06576ab99415 74
sillevl 14:06576ab99415 75 Thread::wait(osWaitForever);
sillevl 0:ab0ce9ab81bf 76 }