Initial Release
Dependencies: MCP23S17 Motor SDFileSystem mbed-rtos mbed wave_player
main.cpp
- Committer:
- EngineerGuy1GT
- Date:
- 2017-12-06
- Revision:
- 0:5be0a1cce3f6
File content as of revision 0:5be0a1cce3f6:
#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); }