Slave serial com

Dependencies:   mbed

Fork of Serial_Communication_Slave by Arthur Semjonov

Committer:
ArthurSemjonov
Date:
Wed Feb 26 15:59:47 2014 +0000
Revision:
3:7e34b54bde5a
Parent:
2:b7eee254a06e
companion;

Who changed what in which revision?

UserRevisionLine numberNew contents of line
ArthurSemjonov 2:b7eee254a06e 1 #include "mbed.h"
ArthurSemjonov 2:b7eee254a06e 2 #include "TARDIS_ARCHIVE.h"
ArthurSemjonov 2:b7eee254a06e 3
ArthurSemjonov 2:b7eee254a06e 4 /* @author: Arthur Semjonov
ArthurSemjonov 2:b7eee254a06e 5 * @author: Jonathan Pucceti
ArthurSemjonov 2:b7eee254a06e 6 */
ArthurSemjonov 2:b7eee254a06e 7 DigitalOut l(LED1), l2(LED2), l3(LED3), l4(LED4);
ArthurSemjonov 2:b7eee254a06e 8 /********************************************************/
ArthurSemjonov 2:b7eee254a06e 9 AnalogIn pitch(p19); //Potentiometer sets up the pitch of the song
ArthurSemjonov 2:b7eee254a06e 10 AnalogIn tempo(p20); //Potentiometer to set tempo of the song
ArthurSemjonov 2:b7eee254a06e 11 DigitalIn joyUP(p15); //Play song of the Doctor (Master)
ArthurSemjonov 2:b7eee254a06e 12 DigitalIn joyDOWN(p12); //Play song of the Companion (Slave)
ArthurSemjonov 2:b7eee254a06e 13 DigitalIn joyMID(p14); //Stop playing either master or Slave song.
ArthurSemjonov 2:b7eee254a06e 14 PwmOut speaker(p26); //Speaker on the mbed
ArthurSemjonov 2:b7eee254a06e 15
ArthurSemjonov 2:b7eee254a06e 16 /*============SERIAL COMMUNICATION==============*/
ArthurSemjonov 2:b7eee254a06e 17 I2CSlave companion(p9, p10); //mosi/miso/sck of the Slave
ArthurSemjonov 2:b7eee254a06e 18 /********************************************************/
ArthurSemjonov 2:b7eee254a06e 19 Serial pc(USBTX, USBRX);
ArthurSemjonov 2:b7eee254a06e 20 int send_note; //word we will send
ArthurSemjonov 2:b7eee254a06e 21 int rec_note; //value received from master
ArthurSemjonov 2:b7eee254a06e 22 const int addr = 0x42;
ArthurSemjonov 2:b7eee254a06e 23
ArthurSemjonov 2:b7eee254a06e 24 /************************************|Lost Woods|**********************************/
ArthurSemjonov 2:b7eee254a06e 25 float frequency[]= {F4,A4,B4,F4,A4,B4,F4,A4,B4,E5,D5,B4,C5,B4,G4,E4,D4,E4,G4,E4};
ArthurSemjonov 2:b7eee254a06e 26 float beat[]= {1,1,2,1,1,2,1,1,1,1,2,1,1,1,1,3,1,1,1,3};
ArthurSemjonov 2:b7eee254a06e 27 /***************************************************************************************/
ArthurSemjonov 2:b7eee254a06e 28
ArthurSemjonov 2:b7eee254a06e 29
ArthurSemjonov 2:b7eee254a06e 30 int main()
ArthurSemjonov 2:b7eee254a06e 31 {
ArthurSemjonov 2:b7eee254a06e 32 //l4=1;
ArthurSemjonov 2:b7eee254a06e 33 int k;
ArthurSemjonov 2:b7eee254a06e 34 companion.address(addr);
ArthurSemjonov 2:b7eee254a06e 35 while(1) {
ArthurSemjonov 2:b7eee254a06e 36 k = companion.receive();
ArthurSemjonov 2:b7eee254a06e 37 if(k==3) {
ArthurSemjonov 2:b7eee254a06e 38 //k = companion.receive();
ArthurSemjonov 2:b7eee254a06e 39 playTheDoctor();
ArthurSemjonov 2:b7eee254a06e 40 //companion.stop();
ArthurSemjonov 2:b7eee254a06e 41 } else if(k==1) {
ArthurSemjonov 2:b7eee254a06e 42 //k = companion.receive();
ArthurSemjonov 2:b7eee254a06e 43 pc.printf("\n\rI am playing companion");
ArthurSemjonov 2:b7eee254a06e 44
ArthurSemjonov 2:b7eee254a06e 45 playTheCompanion();
ArthurSemjonov 2:b7eee254a06e 46 pc.printf("\n\rStopped playing companion");
ArthurSemjonov 2:b7eee254a06e 47 companion.stop();
ArthurSemjonov 2:b7eee254a06e 48 }
ArthurSemjonov 2:b7eee254a06e 49 }
ArthurSemjonov 2:b7eee254a06e 50 }
ArthurSemjonov 2:b7eee254a06e 51 //========================================================================================================================================
ArthurSemjonov 2:b7eee254a06e 52 //========================================================================================================================================
ArthurSemjonov 2:b7eee254a06e 53 //========================================================================================================================================
ArthurSemjonov 2:b7eee254a06e 54
ArthurSemjonov 2:b7eee254a06e 55 /*********************************************************************
ArthurSemjonov 2:b7eee254a06e 56 ******************************THE COMPANION***************************
ArthurSemjonov 2:b7eee254a06e 57 ********************************aka slave*****************************
ArthurSemjonov 2:b7eee254a06e 58 **********************************************************************/
ArthurSemjonov 2:b7eee254a06e 59 /*TODO: 1) Figure out what stop() returns, if any
ArthurSemjonov 2:b7eee254a06e 60 2) Add print statements to see what is getting sent/received
ArthurSemjonov 2:b7eee254a06e 61 Bonus) Implement potentiameters for tempo and pitch */
ArthurSemjonov 2:b7eee254a06e 62
ArthurSemjonov 2:b7eee254a06e 63 void playTheCompanion()
ArthurSemjonov 2:b7eee254a06e 64 {
ArthurSemjonov 2:b7eee254a06e 65 pc.printf("\n\rEntering Companion song");
ArthurSemjonov 2:b7eee254a06e 66 //int l = companion.receive();
ArthurSemjonov 2:b7eee254a06e 67 for (int i=0; i<=sizeof(frequency)/sizeof(int)-1; i++) {
ArthurSemjonov 2:b7eee254a06e 68 send_note = frequency[i];
ArthurSemjonov 3:7e34b54bde5a 69 int check = companion.read();
ArthurSemjonov 2:b7eee254a06e 70 pc.printf("\n\rCheck line = '%d'", check);
ArthurSemjonov 2:b7eee254a06e 71 if (check == 0xFF) {
ArthurSemjonov 2:b7eee254a06e 72 speaker = 0;
ArthurSemjonov 2:b7eee254a06e 73 pc.printf("\n\rKicked out of the TARDIS");
ArthurSemjonov 2:b7eee254a06e 74 return;
ArthurSemjonov 2:b7eee254a06e 75 }
ArthurSemjonov 2:b7eee254a06e 76 int t = companion.write(send_note);
ArthurSemjonov 2:b7eee254a06e 77 pc.printf("\n\rSending = '%d'", send_note );
ArthurSemjonov 2:b7eee254a06e 78 //int t = companion.write(send_note);
ArthurSemjonov 2:b7eee254a06e 79
ArthurSemjonov 2:b7eee254a06e 80 float value = lookupNoteFrq(frequency, i);
ArthurSemjonov 2:b7eee254a06e 81 speaker.period(1/(2*value)); // set PWM period
ArthurSemjonov 2:b7eee254a06e 82 speaker=0.5;
ArthurSemjonov 2:b7eee254a06e 83 wait(0.4*beat[i]);
ArthurSemjonov 2:b7eee254a06e 84
ArthurSemjonov 2:b7eee254a06e 85 // if (joyMID) {
ArthurSemjonov 2:b7eee254a06e 86 // speaker = 0; //reset speaker duty cycle
ArthurSemjonov 2:b7eee254a06e 87 //
ArthurSemjonov 2:b7eee254a06e 88 // wait(2); //delay for inferior humans
ArthurSemjonov 2:b7eee254a06e 89 // return;
ArthurSemjonov 2:b7eee254a06e 90 // } else if(joyUP) {
ArthurSemjonov 2:b7eee254a06e 91 // speaker = 0;
ArthurSemjonov 2:b7eee254a06e 92 //
ArthurSemjonov 2:b7eee254a06e 93 // pc.printf("\n\rInterrupted Companion song by the Master song");
ArthurSemjonov 2:b7eee254a06e 94 // return;
ArthurSemjonov 2:b7eee254a06e 95 // }
ArthurSemjonov 2:b7eee254a06e 96 }
ArthurSemjonov 2:b7eee254a06e 97 companion.write(0xFF);
ArthurSemjonov 2:b7eee254a06e 98 speaker = 0;
ArthurSemjonov 2:b7eee254a06e 99
ArthurSemjonov 2:b7eee254a06e 100 pc.printf("\n\rExiting Companion song");
ArthurSemjonov 2:b7eee254a06e 101 return;
ArthurSemjonov 2:b7eee254a06e 102 }
ArthurSemjonov 2:b7eee254a06e 103
ArthurSemjonov 2:b7eee254a06e 104 /*********************************************************************
ArthurSemjonov 2:b7eee254a06e 105 ******************************THE DOCTOR******************************
ArthurSemjonov 2:b7eee254a06e 106 ********************************aka master****************************
ArthurSemjonov 2:b7eee254a06e 107 **********************************************************************/
ArthurSemjonov 3:7e34b54bde5a 108 /*TODO:
ArthurSemjonov 3:7e34b54bde5a 109
ArthurSemjonov 2:b7eee254a06e 110 3) Implement interrupts
ArthurSemjonov 2:b7eee254a06e 111 4) Stopping conditions
ArthurSemjonov 2:b7eee254a06e 112 Bonus) Potentiometers for pitch and tempo
ArthurSemjonov 2:b7eee254a06e 113 */
ArthurSemjonov 2:b7eee254a06e 114 void playTheDoctor()
ArthurSemjonov 2:b7eee254a06e 115 {
ArthurSemjonov 2:b7eee254a06e 116 int prev=0;
ArthurSemjonov 2:b7eee254a06e 117 int cur;
ArthurSemjonov 2:b7eee254a06e 118 pc.printf("\n\rEntering Doctors song\n\r=====================================");
ArthurSemjonov 2:b7eee254a06e 119 //speaker = 0.5;
ArthurSemjonov 2:b7eee254a06e 120 while (1) {
ArthurSemjonov 2:b7eee254a06e 121
ArthurSemjonov 2:b7eee254a06e 122 rec_note = companion.read();
ArthurSemjonov 2:b7eee254a06e 123 cur = rec_note;
ArthurSemjonov 2:b7eee254a06e 124 if(rec_note == 0xFF) {
ArthurSemjonov 2:b7eee254a06e 125 pc.printf("\n\rLeaveing the TARDIS :(, Doctor leaves for another couple of years >.>");
ArthurSemjonov 2:b7eee254a06e 126 companion.stop();
ArthurSemjonov 2:b7eee254a06e 127 speaker = 0;
ArthurSemjonov 2:b7eee254a06e 128 //rec_note=0xFF;
ArthurSemjonov 2:b7eee254a06e 129 wait(0.1);
ArthurSemjonov 2:b7eee254a06e 130 return;
ArthurSemjonov 2:b7eee254a06e 131 }
ArthurSemjonov 3:7e34b54bde5a 132
ArthurSemjonov 2:b7eee254a06e 133 if (cur != prev)playTheNote(rec_note);
ArthurSemjonov 2:b7eee254a06e 134 prev = cur;
ArthurSemjonov 3:7e34b54bde5a 135
ArthurSemjonov 2:b7eee254a06e 136 }
ArthurSemjonov 2:b7eee254a06e 137 }
ArthurSemjonov 2:b7eee254a06e 138 /*===================================================================*/
ArthurSemjonov 2:b7eee254a06e 139 //===================Goon Squad of helper functions==================//
ArthurSemjonov 2:b7eee254a06e 140 void playTheNote(int k)
ArthurSemjonov 2:b7eee254a06e 141 {
ArthurSemjonov 2:b7eee254a06e 142 float frqNote = notes[k];
ArthurSemjonov 2:b7eee254a06e 143 pc.printf("\n\rNote I got = '%d", k);
ArthurSemjonov 2:b7eee254a06e 144 speaker.period(1/(2*frqNote)); // set PWM period
ArthurSemjonov 2:b7eee254a06e 145 speaker=0.5;
ArthurSemjonov 2:b7eee254a06e 146 return;
ArthurSemjonov 2:b7eee254a06e 147 }
ArthurSemjonov 2:b7eee254a06e 148
ArthurSemjonov 2:b7eee254a06e 149 /*====================Original Demo====================================*/
ArthurSemjonov 2:b7eee254a06e 150 void songOfMyPeople(float frequency[], float beat[])
ArthurSemjonov 2:b7eee254a06e 151 {
ArthurSemjonov 2:b7eee254a06e 152 pc.printf("\n\rSong of my people");
ArthurSemjonov 2:b7eee254a06e 153 while(1) { //run infinetly unless interupted
ArthurSemjonov 2:b7eee254a06e 154 for (int i=0; i<=19; i++) {
ArthurSemjonov 2:b7eee254a06e 155 float value = lookupNoteFrq(frequency, i);
ArthurSemjonov 2:b7eee254a06e 156 speaker.period(1/(2*value)); // set PWM period
ArthurSemjonov 2:b7eee254a06e 157 speaker=0.5; // set duty cycle
ArthurSemjonov 2:b7eee254a06e 158 wait(0.4*beat[i]);
ArthurSemjonov 2:b7eee254a06e 159 if (joyMID) {
ArthurSemjonov 2:b7eee254a06e 160 speaker = 0; //reset speaker duty cycle
ArthurSemjonov 2:b7eee254a06e 161 wait(2); //delay for inferior humans
ArthurSemjonov 2:b7eee254a06e 162 return;
ArthurSemjonov 2:b7eee254a06e 163 }
ArthurSemjonov 2:b7eee254a06e 164 }
ArthurSemjonov 2:b7eee254a06e 165 speaker = 0;
ArthurSemjonov 2:b7eee254a06e 166 wait(0.25);
ArthurSemjonov 2:b7eee254a06e 167 }
ArthurSemjonov 2:b7eee254a06e 168 }
ArthurSemjonov 2:b7eee254a06e 169
ArthurSemjonov 2:b7eee254a06e 170 /*===================================================================*/
ArthurSemjonov 2:b7eee254a06e 171 float lookupNoteFrq(float frq[], int k)
ArthurSemjonov 2:b7eee254a06e 172 {
ArthurSemjonov 2:b7eee254a06e 173 int location_of_note = frequency[k];
ArthurSemjonov 2:b7eee254a06e 174 pc.printf("\n\rLocation of the note = '%d'", location_of_note);
ArthurSemjonov 2:b7eee254a06e 175
ArthurSemjonov 2:b7eee254a06e 176 float vNote = notes[location_of_note];
ArthurSemjonov 2:b7eee254a06e 177 pc.printf("\n\rFrq of the note = '%f'", vNote);
ArthurSemjonov 2:b7eee254a06e 178 return vNote;
ArthurSemjonov 2:b7eee254a06e 179 }