Initial Release
Dependencies: MCP23S17 Motor SDFileSystem mbed-rtos mbed wave_player
Revision 0:5be0a1cce3f6, committed 2017-12-06
- Comitter:
- EngineerGuy1GT
- Date:
- Wed Dec 06 16:34:32 2017 +0000
- Commit message:
- Initial Release
Changed in this revision
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/MCP23S17.lib Wed Dec 06 16:34:32 2017 +0000 @@ -0,0 +1,1 @@ +http://mbed.org/users/romilly/code/MCP23S17/#068b1e8909bb
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/Motor.lib Wed Dec 06 16:34:32 2017 +0000 @@ -0,0 +1,1 @@ +http://mbed.org/users/simon/code/Motor/#f265e441bcd9
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/SDFileSystem.lib Wed Dec 06 16:34:32 2017 +0000 @@ -0,0 +1,1 @@ +https://os.mbed.com/users/EngineerGuy1GT/code/SDFileSystem/#26b0d4560351
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/SongPlayer.h Wed Dec 06 16:34:32 2017 +0000
@@ -0,0 +1,41 @@
+#include "mbed.h"
+// new class to play a note on Speaker based on PwmOut class
+class SongPlayer
+{
+public:
+ SongPlayer(PinName pin) : _pin(pin) {
+// _pin(pin) means pass pin to the constructor
+ }
+// class method to play a note based on PwmOut class
+ void PlaySong(float frequency[], float duration[], float volume=1.0) {
+ vol = volume;
+ notecount = 0;
+ _pin.period(1.0/frequency[notecount]);
+ _pin = volume/2.0;
+ noteduration.attach(this,&SongPlayer::nextnote, duration[notecount]);
+ // setup timer to interrupt for next note to play
+ frequencyptr = frequency;
+ durationptr = duration;
+ //returns after first note starts to play
+ }
+ void nextnote();
+private:
+ Timeout noteduration;
+ PwmOut _pin;
+ int notecount;
+ float vol;
+ float * frequencyptr;
+ float * durationptr;
+};
+//Interrupt Routine to play next note
+void SongPlayer::nextnote()
+{
+ _pin = 0.0;
+ notecount++; //setup next note in song
+ if (durationptr[notecount]!=0.0) {
+ _pin.period(1.0/frequencyptr[notecount]);
+ noteduration.attach(this,&SongPlayer::nextnote, durationptr[notecount]);
+ _pin = vol/2.0;
+ } else
+ _pin = 0.0; //turn off on last note
+}
\ No newline at end of file
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/Speaker.h Wed Dec 06 16:34:32 2017 +0000
@@ -0,0 +1,19 @@
+#include "mbed.h"
+// a new class to play a note on Speaker based on PwmOut class
+class Speaker
+{
+public:
+ Speaker(PinName pin) : _pin(pin) {
+// _pin(pin) means pass pin to the Speaker Constructor
+ }
+// class method to play a note based on PwmOut class
+ void PlayNote(float frequency, float duration, float volume) {
+ _pin.period(1.0/frequency);
+ _pin = volume/2.0;
+ wait(duration);
+ _pin = 0.0;
+ }
+
+private:
+ PwmOut _pin;
+};
\ No newline at end of file
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/main.cpp Wed Dec 06 16:34:32 2017 +0000
@@ -0,0 +1,318 @@
+#include "mbed.h"
+#include "rtos.h"
+#include "Motor.h"
+#include "SDFileSystem.h"
+#include "wave_player.h"
+#include "SongPlayer.h"
+#include "Speaker.h"
+#include "MCP23S17.h"
+#include "mbed.h"
+
+Serial pc(USBTX, USBRX);
+
+//ZIGBEE (XBEE)
+Serial xbee(p9, p10);
+DigitalOut xbee_rst(p8);
+
+//DC MOTORS
+Motor motor_left(p26, p30, p29); // pwm, fwd, rev
+Motor motor_right(p23, p25, p24); // pwm, fwd, rev
+
+//SD CARD
+SDFileSystem sd(p11, p12, p13, p14, "sd"); // (MOSI,MISO,SCLK,CS,NAME)
+
+// I/O EXPANDER
+SPI IO_spi(p5, p6, p7); //MOSI(SI), MISO(SO), SCLK(SCK)
+DigitalOut IO_rst(p15);
+
+//Speaker
+AnalogOut DACout(p18);
+wave_player waver(&DACout);
+FILE *wave_file;
+
+//LED Signals
+DigitalOut brake_sig(p20);
+DigitalOut left_turn_sig(p22);
+DigitalOut right_turn_sig(p21);
+
+//Mutex Lock
+Mutex mutex;
+
+//Threads
+Thread motor_thread;
+Thread speaker_thread;
+Thread RGB_LED_bar_thread;
+
+volatile float left_speed;
+volatile float right_speed;
+volatile float old_left;
+volatile float old_right;
+volatile char RX_char;
+
+float get_left_speed(char input)
+{
+ switch(input)
+ {
+ case 'f':
+ return 1.0;
+ case 'm':
+ return 0.66;
+ case 's':
+ return 0.33;
+ case 'n':
+ return 0;
+ case 'r':
+ return -0.33;
+ case 'l':
+ return -0.66;
+ case 'e':
+ return -1.0;
+ default:
+ return old_left;
+ }
+}
+
+float get_right_speed(char input)
+{
+ switch(input)
+ {
+ case 'F':
+ return 1.0;
+ case 'M':
+ return 0.66;
+ case 'S':
+ return 0.33;
+ case 'N':
+ return 0;
+ case 'R':
+ return -0.33;
+ case 'L':
+ return -0.66;
+ case 'E':
+ return -1.0;
+ default:
+ return old_right;
+ }
+}
+
+void control_motors()
+{
+ // reset the Zigbee (at least 200ns)
+ xbee_rst = 0;
+ wait_ms(1);
+ xbee_rst = 1;
+ wait_ms(1);
+ pc.printf("ZIGBEE COMMUNICATION SETUP COMPLETE\n\r");
+
+ while(1)
+ {
+ if(xbee.readable())
+ {
+ RX_char = xbee.getc();
+ //pc.printf("receiving... %c\n\r", RX_char);
+ pc.putc(RX_char);
+
+ left_speed = get_left_speed(RX_char);
+ old_left = left_speed;
+ right_speed = get_right_speed(RX_char);
+ old_right = right_speed;
+
+ //Signal and Brake Control
+ if((left_speed == 0) && (right_speed == 0))
+ {
+ brake_sig = 1;
+ left_turn_sig = 0;
+ right_turn_sig = 0;
+ }
+
+ else if(left_speed > right_speed)
+
+ {
+ brake_sig = 0;
+ left_turn_sig = ! left_turn_sig;
+ right_turn_sig = 0;
+ }
+
+ else if(left_speed < right_speed)
+ {
+ brake_sig = 0;
+ right_turn_sig = ! right_turn_sig;
+ left_turn_sig = 0;
+ }
+
+ else
+ {
+ brake_sig = 0;
+ left_turn_sig = 0;
+ right_turn_sig = 0;
+ }
+
+ motor_left.speed(left_speed);
+ motor_right.speed(right_speed);
+ }
+ }
+}
+
+void speaker()
+{
+ //Mount the filesystem
+ //sd.mount();
+ //wave_file=fopen("/sd/wavfiles/police_siren.wav","r");
+ //waver.play(wave_file);
+ //Thread::wait(31000); //wait 31 seconds
+ while(1)
+ {
+ if (RX_char == 'w')
+ {
+ wave_file=fopen("/sd/wavfiles/police_siren.wav","r");
+ waver.play(wave_file);
+ fclose(wave_file);
+ Thread::wait(31000); //wait 31 seconds
+ }
+ Thread::wait(500); //wait 500ms
+ }
+}
+
+
+void RGB_LED_bar()
+{
+ //Device Opcode Defined:
+ // 0 1 0 0 A2 A1 A0 0
+
+ //chipR --> Red
+ //chipG --> Green
+ //chipB --> Blue
+
+ //MCP23S17 ChipR
+ // A0, A1, A2 of MCP23S17 chip0 are tied to ground on the breadboard, so the 8-bit address for writes is 0x40
+ // This is referred to as the opcode in the device datasheet
+ //A2=0 A1=0 A0=0
+ char OpcodeR = 0x40;
+ // Next create a MCP23S17
+ // mbed p16 is connected to ~chipSelect on the MCP23S17
+ MCP23S17 chipR = MCP23S17(IO_spi, p16, OpcodeR);
+
+ //MCP23S17 ChipG
+ //A2=0 A1=0 A0=1
+ char OpcodeG = 0x42;
+ // Next create a MCP23S17
+ // mbed p17 is connected to ~chipSelect on the MCP23S17
+ MCP23S17 chipG = MCP23S17(IO_spi, p17, OpcodeG);
+
+ //MCP23S17 ChipB
+ //A2=0 A1=1 A0=0
+ char OpcodeB = 0x44;
+ // Next create a MCP23S17
+ // mbed p19 is connected to ~chipSelect on the MCP23S17
+ MCP23S17 chipB = MCP23S17(IO_spi, p19, OpcodeB);
+
+ IO_rst = 0;
+ wait_us(10);
+ IO_rst = 1;
+
+ //0x00 = 'input' 0xFF = 'output'
+ //Set all 8 Port A bits to output direction
+ chipR.direction(PORT_A, 0x00);
+ chipG.direction(PORT_A, 0x00);
+ chipB.direction(PORT_A, 0x00);
+ //Set all 8 Port B bits to output direction
+ chipR.direction(PORT_B, 0x00);
+ chipG.direction(PORT_B, 0x00);
+ chipB.direction(PORT_B, 0x00);
+
+ int init_wait = 500;
+ mutex.lock();
+ chipR.write(PORT_A, 0xFF);
+ chipR.write(PORT_B, 0xFF);
+ mutex.unlock();
+ Thread::wait(init_wait);
+ mutex.lock();
+ chipG.write(PORT_A, 0xFF);
+ chipG.write(PORT_B, 0xFF);
+ mutex.unlock();
+ Thread::wait(init_wait);
+ mutex.lock();
+ chipB.write(PORT_A, 0xFF);
+ chipB.write(PORT_B, 0xFF);
+ mutex.unlock();
+ Thread::wait(init_wait);
+ mutex.lock();
+ chipR.write(PORT_A, 0x00);
+ chipR.write(PORT_B, 0x00);
+ mutex.unlock();
+ Thread::wait(init_wait);
+ mutex.lock();
+ chipG.write(PORT_A, 0x00);
+ chipG.write(PORT_B, 0x00);
+ mutex.unlock();
+ Thread::wait(init_wait);
+ mutex.lock();
+ chipB.write(PORT_A, 0x00);
+ chipB.write(PORT_B, 0x00);
+ mutex.unlock();
+ Thread::wait(init_wait);
+
+ bool flag = 0;
+ volatile int redA_i = 0b10000000;
+ volatile int greenA_i = 0b10000000;
+ volatile int redB_i = 0b00000001;
+ volatile int greenB_i = 0b00000001;
+ volatile int redA;
+ volatile int redB;
+ volatile int greenA;
+ volatile int greenB;
+ volatile int blueA = 0b11111111;
+ volatile int blueB = 0b11111111;
+
+
+ while(1)
+ {
+ //2-PART CYCLON SWEEP (LED LIGHTING EFFECT)
+ mutex.lock();
+ if (flag == 0)
+ {
+ redA_i = redA_i>>1;
+ greenA_i = greenA_i>>1;
+ redB_i = redB_i<<1;
+ greenB_i = greenB_i<<1;
+ if (redA_i == 0b00000001)
+ {
+ flag = 1;
+ }
+ }
+ else if (flag == 1)
+ {
+ redA_i = redA_i<<1;
+ greenA_i = greenA_i<<1;
+ redB_i = redB_i>>1;
+ greenB_i = greenB_i>>1;
+ if (redA_i == 0b10000000)
+ {
+ flag = 0;
+ }
+ }
+ redA = redA_i ^ 0b11111111; //XOR
+ greenA = greenA_i ^ 0b11111111; //XOR
+ redB = redB_i ^ 0b11111111; //XOR
+ greenB = greenB_i ^ 0b11111111; //XOR
+ chipR.write(PORT_A, redA);
+ chipR.write(PORT_B, redB);
+ chipG.write(PORT_A, greenA);
+ chipG.write(PORT_B, greenB);
+ chipB.write(PORT_A, blueA);
+ chipB.write(PORT_B, blueB);
+ mutex.unlock();
+ Thread::wait(100);
+ }
+}
+
+
+int main()
+{
+
+ // Start Threads
+ motor_thread.start(control_motors);
+ speaker_thread.start(speaker);
+ RGB_LED_bar_thread.start(RGB_LED_bar);
+
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/mbed-rtos.lib Wed Dec 06 16:34:32 2017 +0000 @@ -0,0 +1,1 @@ +http://mbed.org/users/mbed_official/code/mbed-rtos/#5713cbbdb706
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/mbed.bld Wed Dec 06 16:34:32 2017 +0000 @@ -0,0 +1,1 @@ +https://os.mbed.com/users/mbed_official/code/mbed/builds/e7ca05fa8600 \ No newline at end of file
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/wave_player.lib Wed Dec 06 16:34:32 2017 +0000 @@ -0,0 +1,1 @@ +http://os.mbed.com/users/sravet/code/wave_player/#acc3e18e77ad