Code for controlling mbed hardware (LED's, motors), as well as code for the Raspberry Pi to run a Support Vector Machine that identifies objects using the Pi camera

Dependencies:   mbed Motordriver mbed-rtos PololuLedStrip

Revision:
0:e0dbd261724a
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/mbed/main.cpp	Thu Dec 05 20:34:10 2019 -0500
@@ -0,0 +1,341 @@
+#include "mbed.h"
+#include "rtos.h"
+#include "motordriver.h"
+#include "PololuLedStrip.h"
+// Connect mbed to Pi USB
+Serial  pi(USBTX, USBRX);
+
+Serial blue(p9, p10);
+
+// Set up motors
+Motor L(p24, p23, p22, 1); // pwmA, fwd, rev, can brake 
+Motor R(p21, p8, p7, 1); // pwmB, fwd, rev, can brake
+
+PololuLedStrip ledStrip(p5);
+
+// for LED strip
+Timer timer;
+
+volatile bool disco_mode = false;
+volatile bool tornado_mode = false;
+volatile bool autonomous_mode = false;
+
+#define LED_COUNT 82
+rgb_color colors[LED_COUNT];
+
+
+// Converts a color from the HSV representation to RGB.
+rgb_color hsvToRgb(float h, float s, float v)
+{
+    int i = floor(h * 6);
+    float f = h * 6 - i;
+    float p = v * (1 - s);
+    float q = v * (1 - f * s);
+    float t = v * (1 - (1 - f) * s);
+    float r = 0, g = 0, b = 0;
+    switch(i % 6){
+        case 0: r = v; g = t; b = p; break;
+        case 1: r = q; g = v; b = p; break;
+        case 2: r = p; g = v; b = t; break;
+        case 3: r = p; g = q; b = v; break;
+        case 4: r = t; g = p; b = v; break;
+        case 5: r = v; g = p; b = q; break;
+    }
+    return (rgb_color){r * 255, g * 255, b * 255};
+}
+
+#define TIME_SLICE 5.0f
+
+// LEDs for debugging
+
+// Invalid character was read
+DigitalOut led1(LED1);
+
+// Detected tornado
+DigitalOut led2(LED2);
+DigitalOut led3(LED3);
+
+// Detected disco_ball
+DigitalOut led4(LED4);
+
+
+void forward()
+{
+    L.speed(0.5);
+    R.speed(0.5);
+    wait(TIME_SLICE/10);
+    L.coast();
+    R.coast();
+}
+
+void backward()
+{
+    L.speed(-0.5);
+    R.speed(-0.5);
+    wait(TIME_SLICE/10);
+    L.coast();
+    R.coast();
+}
+
+void left()
+{
+    L.speed(-0.5);
+    R.speed(0.5);
+    wait(TIME_SLICE/10);
+    L.coast();
+    R.coast();
+}
+
+void right()
+{
+    L.speed(0.5);
+    R.speed(-0.5);
+    wait(TIME_SLICE/10);
+    L.coast();
+    R.coast();
+}
+
+void stop()
+{
+    L.stop(0);
+    R.stop(0);
+}
+
+void led_strip()
+{
+    timer.start();
+    
+    while(1)
+    {
+        if (disco_mode)
+        {
+            // Update the colors array.
+            uint32_t time = timer.read_ms();       
+            for(int i = 0; i < LED_COUNT; i++)
+            {
+                uint8_t phase = (time >> 4) - (i << 2);
+                colors[i] = hsvToRgb(phase / 256.0, 1.0, 0.25);
+            }
+        
+            // Send the colors to the LED strip.
+            ledStrip.write(colors, LED_COUNT);
+        }
+        else if (tornado_mode)
+        {
+            rgb_color temp;
+            temp.red = 64;
+            temp.green = 64;
+            temp.blue = 0;
+            for (int i = 0; i < LED_COUNT; i++)
+            {
+                colors[i] = temp;
+            }
+            ledStrip.write(colors, LED_COUNT);
+        }
+        else
+        {
+            rgb_color temp;
+            temp.red = 64;
+            temp.green = 0;
+            temp.blue = 0;
+            for (int i = 0; i < LED_COUNT; i++)
+            {
+                if (i == LED_COUNT/2)
+                {
+                    temp.red = 0;
+                    temp.green = 64;
+                }
+                colors[i] = temp;
+            }
+            ledStrip.write(colors, LED_COUNT);
+        }
+    }
+}
+
+void detected_tornado()
+{
+    tornado_mode = true;
+    for (int i = 0; i < 10; i++)
+    {
+        left();
+        wait(0.5);
+    }
+    stop();
+    tornado_mode = false;
+}
+
+void detected_disco_ball()
+{
+    led4 = 1;
+    disco_mode = true;
+    left();
+    left();
+    right();
+    right();
+    left();
+    left();
+    right();
+    right();
+    forward();
+    backward();
+    disco_mode = false;
+    
+}
+
+void execute(char c)
+{
+    switch (c) 
+    {
+        case 'f':
+            forward();
+            break;
+        case 'b':
+            backward();
+            break;
+        case 'l':
+            left();
+            break; 
+        case 'r':
+            right();
+            break; 
+        case 't':
+            detected_tornado();
+            break;        
+        case 'd':
+            detected_disco_ball();
+            break;
+        case 's':
+            stop();
+            break; 
+        default:
+            // invalid character
+            led1 = 1;
+            break;
+    }       
+}   
+
+int main()
+{
+    led1 = 0;
+    led2 = 0;
+    led3 = 0;
+    led4 = 0;
+    pi.baud(9600);
+    char bnum, bhit;
+    
+    Thread t1;
+    t1.start(led_strip);
+    
+    while(1) {
+        // pi commands are read first
+        if(pi.readable()) {
+            char c = pi.getc();
+            if (c != 'n')
+                execute(c);
+                switch (c)
+                {
+                    case 'd':
+                    case 't':
+                        pi.putc('f');
+                        autonomous_mode = false;
+                        break;
+                    default:
+                        pi.putc(c);
+                        break;
+                }
+        }
+
+        // bluetooth commands are read later
+        if (!blue.readable()) continue;
+        if (blue.getc()=='!') {
+            if (blue.getc()=='B') { //button data packet
+                bnum = blue.getc(); //button number
+                bhit = blue.getc(); //1=hit, 0=release
+                if (blue.getc()==char(~('!' + 'B' + bnum + bhit))) { //checksum OK?
+                    //myled = bnum - '0'; //current button number will appear on LEDs
+                    switch (bnum) {
+                        case '1': //number button 1
+                            if (bhit=='1') {
+                                autonomous_mode = !autonomous_mode;
+                                if (!autonomous_mode)
+                                {
+                                    pi.putc('f');
+                                }
+                                else
+                                {
+                                    pi.putc('a');
+                                }
+                                //add hit code here
+                            }
+                            break;
+                        case '2': //number button 2
+                            if (bhit=='1') {
+                                // execute('t');
+                                // add hit code here
+                            } else {
+                                //add release code here
+                            }
+                            break;
+                        case '3': //number button 3
+                            if (bhit=='1') {
+                                //add hit code here
+                            } else {
+                                //add release code here
+                            }
+                            break;
+                        case '4': //number button 4
+                            if (bhit=='1') {
+                                //add hit code here
+                            } else {
+                                //add release code here
+                            }
+                            break;
+                        case '5': //button 5 up arrow
+                            if (bhit=='1') {
+                                //add hit code here
+                                forward();
+                            } else {
+                                //add release code here
+                                stop();
+                            }
+                            break;
+                        case '6': //button 6 down arrow
+                            if (bhit=='1') {
+                                //add hit code here
+                                backward();
+                            } else {
+                                //add release code here
+                                stop();
+                            }
+                            break;
+                        case '7': //button 7 left arrow
+                            if (bhit=='1') {
+                                //add hit code here
+                                left();
+                            } else {
+                                //add release code here
+                                stop();
+                            }
+                            break;
+                        case '8': //button 8 right arrow
+                            if (bhit=='1') 
+                            {
+                                //add hit code here
+                                right();
+                            } 
+                            else 
+                            {
+                                //add release code here
+                                stop();
+                            }
+                            break;
+                        default:
+                            // stop();
+                            break;
+                    }
+                }
+            }
+        }
+    }
+   
+}