ECE 4180 - Mid mini project, lab 4

Dependencies:   Motor Servo mbed

Files at this revision

API Documentation at this revision

Comitter:
ckabuloglu
Date:
Mon Mar 13 16:08:11 2017 +0000
Commit message:
intial commit

Changed in this revision

Motor.lib Show annotated file Show diff for this revision Revisions of this file
Servo.lib Show annotated file Show diff for this revision Revisions of this file
Speaker.h Show annotated file Show diff for this revision Revisions of this file
main.cpp Show annotated file Show diff for this revision Revisions of this file
mbed.bld Show annotated file Show diff for this revision Revisions of this file
diff -r 000000000000 -r d9d5943dfa45 Motor.lib
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Motor.lib	Mon Mar 13 16:08:11 2017 +0000
@@ -0,0 +1,1 @@
+http://developer.mbed.org/users/simon/code/Motor/#f265e441bcd9
diff -r 000000000000 -r d9d5943dfa45 Servo.lib
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Servo.lib	Mon Mar 13 16:08:11 2017 +0000
@@ -0,0 +1,1 @@
+http://developer.mbed.org/users/simon/code/Servo/#36b69a7ced07
diff -r 000000000000 -r d9d5943dfa45 Speaker.h
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Speaker.h	Mon Mar 13 16:08:11 2017 +0000
@@ -0,0 +1,52 @@
+class Speaker
+{
+public:
+    Speaker(PinName pin) : _pin(pin) {
+// _pin(pin) means pass pin to the Speaker Constructor
+// precompute 32 sample points on one sine wave cycle
+// used for continuous sine wave output later
+        for(int k=0; k<32; k++) {
+            Analog_out_data[k] = int (65536.0 * ((1.0 + sin((float(k)/32.0*6.28318530717959)))/2.0));
+            // scale the sine wave to 16-bits - as needed for AnalogOut write_u16 arg
+        }
+
+    }
+// class method to play a note based on AnalogOut class
+    void PlayNote(float frequency, float duration, float volume) {
+        // scale samples using current volume level arg
+        for(int k=0; k<32; k++) {
+            Analog_scaled_data[k] = Analog_out_data[k] * volume;
+        }
+        // reset to start of sample array
+        i=0;
+        // turn on timer interrupts to start sine wave output
+        Sample_Period.attach(this, &Speaker::Sample_timer_interrupt, 1.0/(frequency*32.0));
+        // play note for specified time
+        wait(duration);
+        // turns off timer interrupts
+        Sample_Period.detach();
+        // sets output to mid range - analog zero
+        this->_pin.write_u16(32768);
+
+    }
+private:
+// sets up specified pin for analog using AnalogOut class
+    AnalogOut _pin;
+    // set up a timer to be used for sample rate interrupts
+    Ticker Sample_Period;
+
+    //variables used by interrupt routine and PlayNote
+    volatile int i;
+    short unsigned Analog_out_data[32];
+    short unsigned Analog_scaled_data[32];
+
+// Interrupt routine
+// used to output next analog sample whenever a timer interrupt occurs
+    void Sample_timer_interrupt(void) {
+        // send next analog sample out to D to A
+        this->_pin.write_u16(Analog_scaled_data[i]);
+        // increment pointer and wrap around back to 0 at 32
+        i = (i+1) & 0x01F;
+    }
+};
+
diff -r 000000000000 -r d9d5943dfa45 main.cpp
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/main.cpp	Mon Mar 13 16:08:11 2017 +0000
@@ -0,0 +1,186 @@
+#include "mbed.h"
+#include "Motor.h"
+#include "Speaker.h"
+#include "Servo.h"
+
+DigitalOut led1(LED1);
+DigitalOut led2(LED2);
+DigitalOut led3(LED3);
+DigitalOut led4(LED4);
+
+Serial pc(USBTX, USBRX); // tx, rx
+
+DigitalIn safe(p9);
+
+Serial blue(p28,p27);
+
+Motor motor_left(p23, p6, p5);
+Motor motor_right(p24, p8, p7);
+
+DigitalOut trigger(p13);
+DigitalIn  echo(p14);
+
+Speaker mySpeaker(p18);
+
+Servo servo(p26);
+
+Timer sonar;
+
+void chooseLed(int num) {
+    if (num == 1) {
+        led1 = 1;
+        led2 = 0;
+        led3 = 0;
+        led4 = 0;
+    } else if (num == 2) {
+        led1 = 0;
+        led2 = 1;
+        led3 = 0;
+        led4 = 0;
+    } else if (num == 3) {
+        led1 = 0;
+        led2 = 0;
+        led3 = 1;
+        led4 = 0;
+    } else if (num == 4) {
+        led1 = 0;
+        led2 = 0;
+        led3 = 0;
+        led4 = 1;
+    }
+}
+
+
+int getSonar(int correction) {
+        int distance = 0;
+        trigger = 1;
+        sonar.reset();
+        wait_us(10.0);
+        trigger = 0;
+
+        while (echo==0) {};
+        sonar.start();
+        while (echo==1) {};
+
+        sonar.stop();
+
+        distance = (sonar.read_us() - correction) / 58.0;
+        return distance;
+}
+
+int main() {
+    bool tooClose = false;
+    sonar.reset();
+    sonar.start();
+
+    while (echo==2) {};
+    sonar.stop();
+    int correction = sonar.read_us();
+    int distance = -1;
+
+    char bnum=0;
+    char bhit=0;
+    
+    servo = 0.5;
+    
+    while(1) {
+        if (blue.getc()=='!') {
+            if (blue.getc()=='B') { //button data packet
+                bnum = blue.getc(); //button number
+                bhit = blue.getc(); //1=hit, 0=release
+                if ((bnum>='1')&&(bnum<='8')) { //checksum OK?
+                    chooseLed(2);
+                    pc.printf("%d",0);
+                    distance = getSonar(correction); // read sonar data
+//                    wait(0.1); // wait echo signal to disperse
+
+                    // check if the distance is too close, set the flag 'tooClose'
+                    if (distance > 20) {
+                        led3 = 0;
+                        led4 = 1;
+                        tooClose = false;    
+                    } else {
+                        led3 = 1;    
+                        led4 = 0;
+                        tooClose = true;
+                    }
+
+                    switch (bnum) {
+                        case '1': //button 1 - clockwise servo
+                            chooseLed(3);
+                            pc.printf("%d",6);
+                            if (bhit=='1') {
+                                servo = 1.0;
+                            } else {
+                                servo = 0.5;
+                            }
+                            break;
+                            
+                        case '2': //button 2 - counter clockwise servo
+                            chooseLed(4);
+                            pc.printf("%d",7);
+                            if (bhit=='1') {
+                                servo = 0;
+                            } else {
+                                servo = 0.5;
+                            }
+                            break;
+                            
+                        case '5': //button 5 up arrow - move forward
+                            chooseLed(1);
+                            pc.printf("%d",1);
+                            if (bhit=='1' && tooClose == 0) {
+                                motor_left.speed(1); 
+                                motor_right.speed(1);
+                                mySpeaker.PlayNote(440, 1.0, 0.2);
+                            } else if (tooClose == 1) {
+                                motor_left.speed(0);
+                                motor_right.speed(0);
+                                mySpeaker.PlayNote(880, 0.1, 1.0);
+                            } else {
+                                motor_left.speed(0);
+                                motor_right.speed(0);
+                            }
+                            break;
+                        case '6': //button 6 down arrow - move backward
+                            chooseLed(2);
+                            pc.printf("%d",2);
+                            if (bhit=='1') {
+                                motor_left.speed(-1); 
+                                motor_right.speed(-1);
+                                mySpeaker.PlayNote(600, 0.5, 0.6);
+                            } else {
+                                motor_left.speed(0);
+                                motor_right.speed(0);
+                            }
+                            break;
+                        case '7': //button 7 left arrow - rotate left
+                            chooseLed(3);
+                            pc.printf("%d",3);
+                            if (bhit=='1') {
+                                motor_left.speed(-1); 
+                                motor_right.speed(1);
+                            } else {
+                                motor_left.speed(0);
+                                motor_right.speed(0);
+                            }
+                            break;
+                        case '8': //button 8 right arrow - rotate right
+                            chooseLed(4);
+                            pc.printf("%d",4);
+                            if (bhit=='1') {
+                                motor_left.speed(1); 
+                                motor_right.speed(-1);
+                            } else {
+                                motor_left.speed(0);
+                                motor_right.speed(0);
+                            }
+                            break;
+                        default:
+                            break;
+                    }
+                }
+            }
+        }
+    }
+}
\ No newline at end of file
diff -r 000000000000 -r d9d5943dfa45 mbed.bld
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/mbed.bld	Mon Mar 13 16:08:11 2017 +0000
@@ -0,0 +1,1 @@
+http://mbed.org/users/mbed_official/code/mbed/builds/e1686b8d5b90
\ No newline at end of file