![](/media/cache/img/default_profile.jpg.50x50_q85.jpg)
ECE 4180 - Mid mini project, lab 4
Dependencies: Motor Servo mbed
Revision 0:d9d5943dfa45, committed 2017-03-13
- Comitter:
- ckabuloglu
- Date:
- Mon Mar 13 16:08:11 2017 +0000
- Commit message:
- intial commit
Changed in this revision
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