Master Code (Doctor) pub

Dependencies:   mbed

Fork of Serial_Communication by Arthur Semjonov

Committer:
ArthurSemjonov
Date:
Wed Feb 19 16:14:10 2014 +0000
Revision:
1:0167f0cacae5
The Doctor (master) I2C

Who changed what in which revision?

UserRevisionLine numberNew contents of line
ArthurSemjonov 1:0167f0cacae5 1 #include "mbed.h"
ArthurSemjonov 1:0167f0cacae5 2 #include "TARDIS_ARCHIVE.h"
ArthurSemjonov 1:0167f0cacae5 3 DigitalOut l(LED1), l2(LED2), l3(LED3), l4(LED4);
ArthurSemjonov 1:0167f0cacae5 4 /********************************************************/
ArthurSemjonov 1:0167f0cacae5 5 AnalogIn pitch(p19); //Potentiometer sets up the pitch of the song
ArthurSemjonov 1:0167f0cacae5 6 AnalogIn tempo(p20); //Potentiometer to set tempo of the song
ArthurSemjonov 1:0167f0cacae5 7 DigitalIn joyUP(p15); //Play song of the Doctor (Master)
ArthurSemjonov 1:0167f0cacae5 8 DigitalIn joyDOWN(p12); //Play song of the Companion (Slave)
ArthurSemjonov 1:0167f0cacae5 9 DigitalIn joyMID(p14); //Stop playing either master or Slave song.
ArthurSemjonov 1:0167f0cacae5 10 PwmOut speaker(p26); //Speaker on the mbed
ArthurSemjonov 1:0167f0cacae5 11
ArthurSemjonov 1:0167f0cacae5 12 /*============SERIAL COMMUNICATION==============*/
ArthurSemjonov 1:0167f0cacae5 13 I2C doctor(p9, p10); //mosi/miso/sck of the Doctor
ArthurSemjonov 1:0167f0cacae5 14 /********************************************************/
ArthurSemjonov 1:0167f0cacae5 15 Serial pc(USBTX, USBRX);
ArthurSemjonov 1:0167f0cacae5 16 int send_note; //word we will send
ArthurSemjonov 1:0167f0cacae5 17 int rec_note; //value received from master
ArthurSemjonov 1:0167f0cacae5 18 const int addr = 0x42;
ArthurSemjonov 1:0167f0cacae5 19 const int stop = 0xFF;
ArthurSemjonov 1:0167f0cacae5 20 /************************************|I Am the Doctor|**********************************/
ArthurSemjonov 1:0167f0cacae5 21 float frequency[]= {D3, E3, F3, G3,
ArthurSemjonov 1:0167f0cacae5 22 F3 ,E3, D3, E3, D3
ArthurSemjonov 1:0167f0cacae5 23 };
ArthurSemjonov 1:0167f0cacae5 24 float beat[]= {.7,.7,.7,0.3,.7,.7,.7,0.3,0.3, 0.3};
ArthurSemjonov 1:0167f0cacae5 25 /***************************************************************************************/
ArthurSemjonov 1:0167f0cacae5 26 //
ArthurSemjonov 1:0167f0cacae5 27 int main()
ArthurSemjonov 1:0167f0cacae5 28 {
ArthurSemjonov 1:0167f0cacae5 29
ArthurSemjonov 1:0167f0cacae5 30 while(1) {
ArthurSemjonov 1:0167f0cacae5 31
ArthurSemjonov 1:0167f0cacae5 32 if (joyUP) {
ArthurSemjonov 1:0167f0cacae5 33 playTheDoctor();
ArthurSemjonov 1:0167f0cacae5 34 doctor.stop();
ArthurSemjonov 1:0167f0cacae5 35 wait(0.01);
ArthurSemjonov 1:0167f0cacae5 36 } else if (joyDOWN) {
ArthurSemjonov 1:0167f0cacae5 37
ArthurSemjonov 1:0167f0cacae5 38 playTheCompanion();
ArthurSemjonov 1:0167f0cacae5 39 wait(0.01);
ArthurSemjonov 1:0167f0cacae5 40 } else if (joyMID) {
ArthurSemjonov 1:0167f0cacae5 41 // pc.printf("\n\rMAIN PROGRAM OF THE DOCTOR INITIATED");
ArthurSemjonov 1:0167f0cacae5 42 //
ArthurSemjonov 1:0167f0cacae5 43 // doctor.start();
ArthurSemjonov 1:0167f0cacae5 44 // doctor.write(addr);
ArthurSemjonov 1:0167f0cacae5 45 // int j = frequency[4];
ArthurSemjonov 1:0167f0cacae5 46 // int k = doctor.write(F3);
ArthurSemjonov 1:0167f0cacae5 47 // pc.printf("\n\rHi = '%d'", j);
ArthurSemjonov 1:0167f0cacae5 48 // doctor.stop();
ArthurSemjonov 1:0167f0cacae5 49 songOfMyPeople(frequency, beat);
ArthurSemjonov 1:0167f0cacae5 50 // wait(2);
ArthurSemjonov 1:0167f0cacae5 51 }
ArthurSemjonov 1:0167f0cacae5 52 wait (0.01);
ArthurSemjonov 1:0167f0cacae5 53 }
ArthurSemjonov 1:0167f0cacae5 54 }
ArthurSemjonov 1:0167f0cacae5 55 //========================================================================================================================================
ArthurSemjonov 1:0167f0cacae5 56 //========================================================================================================================================
ArthurSemjonov 1:0167f0cacae5 57 //========================================================================================================================================
ArthurSemjonov 1:0167f0cacae5 58
ArthurSemjonov 1:0167f0cacae5 59 /*********************************************************************
ArthurSemjonov 1:0167f0cacae5 60 ******************************THE COMPANION***************************
ArthurSemjonov 1:0167f0cacae5 61 ********************************aka slave*****************************
ArthurSemjonov 1:0167f0cacae5 62 **********************************************************************/
ArthurSemjonov 1:0167f0cacae5 63
ArthurSemjonov 1:0167f0cacae5 64 void playTheCompanion()
ArthurSemjonov 1:0167f0cacae5 65 {
ArthurSemjonov 1:0167f0cacae5 66 doctor.start();
ArthurSemjonov 1:0167f0cacae5 67 //doctor.read(addr);
ArthurSemjonov 1:0167f0cacae5 68 doctor.write(addr|0x01);
ArthurSemjonov 1:0167f0cacae5 69 //send address, with R/W bit set to Read
ArthurSemjonov 1:0167f0cacae5 70 int prev=0;
ArthurSemjonov 1:0167f0cacae5 71 int cur;
ArthurSemjonov 1:0167f0cacae5 72 while(1) {
ArthurSemjonov 1:0167f0cacae5 73 rec_note = doctor.read(addr);
ArthurSemjonov 1:0167f0cacae5 74 cur = rec_note;
ArthurSemjonov 1:0167f0cacae5 75 if(rec_note==stop) {
ArthurSemjonov 1:0167f0cacae5 76 speaker = 0;
ArthurSemjonov 1:0167f0cacae5 77 //doctor.write(addr|0x00);
ArthurSemjonov 1:0167f0cacae5 78 doctor.stop();
ArthurSemjonov 1:0167f0cacae5 79 return;
ArthurSemjonov 1:0167f0cacae5 80 }
ArthurSemjonov 1:0167f0cacae5 81 if(cur!=prev) playTheCompanion(cur);
ArthurSemjonov 1:0167f0cacae5 82 prev = rec_note;
ArthurSemjonov 1:0167f0cacae5 83 //wait(0.01);
ArthurSemjonov 1:0167f0cacae5 84 if (joyMID) {
ArthurSemjonov 1:0167f0cacae5 85 speaker = 0; //reset speaker duty cycle
ArthurSemjonov 1:0167f0cacae5 86 doctor.write(stop);
ArthurSemjonov 1:0167f0cacae5 87 doctor.stop();
ArthurSemjonov 1:0167f0cacae5 88 wait(1); //delay for inferior humans
ArthurSemjonov 1:0167f0cacae5 89 return;
ArthurSemjonov 1:0167f0cacae5 90 } else if(joyUP) {
ArthurSemjonov 1:0167f0cacae5 91 speaker = 0; //read joyUp value.
ArthurSemjonov 1:0167f0cacae5 92 doctor.write(stop);
ArthurSemjonov 1:0167f0cacae5 93 doctor.stop();
ArthurSemjonov 1:0167f0cacae5 94 return;
ArthurSemjonov 1:0167f0cacae5 95
ArthurSemjonov 1:0167f0cacae5 96 }
ArthurSemjonov 1:0167f0cacae5 97 }
ArthurSemjonov 1:0167f0cacae5 98 //speaker = 0;
ArthurSemjonov 1:0167f0cacae5 99
ArthurSemjonov 1:0167f0cacae5 100 //return;
ArthurSemjonov 1:0167f0cacae5 101 }
ArthurSemjonov 1:0167f0cacae5 102
ArthurSemjonov 1:0167f0cacae5 103 /*********************************************************************
ArthurSemjonov 1:0167f0cacae5 104 ******************************THE DOCTOR******************************
ArthurSemjonov 1:0167f0cacae5 105 ********************************aka master****************************
ArthurSemjonov 1:0167f0cacae5 106 **********************************************************************/
ArthurSemjonov 1:0167f0cacae5 107
ArthurSemjonov 1:0167f0cacae5 108 void playTheDoctor()
ArthurSemjonov 1:0167f0cacae5 109 {
ArthurSemjonov 1:0167f0cacae5 110 doctor.start();
ArthurSemjonov 1:0167f0cacae5 111 doctor.write(addr);
ArthurSemjonov 1:0167f0cacae5 112 for (int i=0; i<=sizeof(frequency)/sizeof(int)-1; i++) {
ArthurSemjonov 1:0167f0cacae5 113 send_note = frequency[i];
ArthurSemjonov 1:0167f0cacae5 114 doctor.write(send_note);
ArthurSemjonov 1:0167f0cacae5 115 pc.printf("\n\rDoctor sent note = '%d", send_note);
ArthurSemjonov 1:0167f0cacae5 116 float value = lookupNoteFrq(frequency, i);
ArthurSemjonov 1:0167f0cacae5 117 speaker.period(1/(2*value)); // set PWM period
ArthurSemjonov 1:0167f0cacae5 118 speaker=0.5;
ArthurSemjonov 1:0167f0cacae5 119 wait(0.4*beat[i]);
ArthurSemjonov 1:0167f0cacae5 120
ArthurSemjonov 1:0167f0cacae5 121 if (joyMID) {
ArthurSemjonov 1:0167f0cacae5 122 pc.printf("\n\rDoctor song was interrupted by demo");
ArthurSemjonov 1:0167f0cacae5 123 speaker = 0; //reset speaker duty cycle
ArthurSemjonov 1:0167f0cacae5 124 doctor.stop();
ArthurSemjonov 1:0167f0cacae5 125 wait(2); //delay for inferior humans
ArthurSemjonov 1:0167f0cacae5 126 return;
ArthurSemjonov 1:0167f0cacae5 127 } else if(joyDOWN) {
ArthurSemjonov 1:0167f0cacae5 128 speaker = 0;
ArthurSemjonov 1:0167f0cacae5 129 doctor.stop();
ArthurSemjonov 1:0167f0cacae5 130 return;
ArthurSemjonov 1:0167f0cacae5 131 }
ArthurSemjonov 1:0167f0cacae5 132 }
ArthurSemjonov 1:0167f0cacae5 133 doctor.write(stop);
ArthurSemjonov 1:0167f0cacae5 134 doctor.stop();
ArthurSemjonov 1:0167f0cacae5 135 speaker=0;
ArthurSemjonov 1:0167f0cacae5 136 return;
ArthurSemjonov 1:0167f0cacae5 137 }
ArthurSemjonov 1:0167f0cacae5 138 /*===================================================================*/
ArthurSemjonov 1:0167f0cacae5 139 //===================Goon Squad of helper functions==================//
ArthurSemjonov 1:0167f0cacae5 140 void playTheCompanion(int k)
ArthurSemjonov 1:0167f0cacae5 141 {
ArthurSemjonov 1:0167f0cacae5 142 float frqNote = notes[k];
ArthurSemjonov 1:0167f0cacae5 143 pc.printf("\n\rNote I got = '%d", k);
ArthurSemjonov 1:0167f0cacae5 144 speaker.period(1/(2*frqNote)); // set PWM period
ArthurSemjonov 1:0167f0cacae5 145 speaker=0.5;
ArthurSemjonov 1:0167f0cacae5 146 return;
ArthurSemjonov 1:0167f0cacae5 147 }
ArthurSemjonov 1:0167f0cacae5 148
ArthurSemjonov 1:0167f0cacae5 149 /*====================Original Demo====================================*/
ArthurSemjonov 1:0167f0cacae5 150 void songOfMyPeople(float frequency[], float beat[])
ArthurSemjonov 1:0167f0cacae5 151
ArthurSemjonov 1:0167f0cacae5 152 {
ArthurSemjonov 1:0167f0cacae5 153 while(1) { //run infinetly unless interupted
ArthurSemjonov 1:0167f0cacae5 154 for (int i=0; i<=8; i++) {
ArthurSemjonov 1:0167f0cacae5 155 float value = lookupNoteFrq(frequency, i);
ArthurSemjonov 1:0167f0cacae5 156 speaker.period(1/(2*value)); // set PWM period
ArthurSemjonov 1:0167f0cacae5 157 speaker=0.5; // set duty cycle
ArthurSemjonov 1:0167f0cacae5 158 wait(0.4*beat[i]);
ArthurSemjonov 1:0167f0cacae5 159 if (joyMID) {
ArthurSemjonov 1:0167f0cacae5 160 speaker = 0; //reset speaker duty cycle
ArthurSemjonov 1:0167f0cacae5 161 wait(2); //delay for inferior humans
ArthurSemjonov 1:0167f0cacae5 162 return;
ArthurSemjonov 1:0167f0cacae5 163 }
ArthurSemjonov 1:0167f0cacae5 164 }
ArthurSemjonov 1:0167f0cacae5 165 speaker = 0;
ArthurSemjonov 1:0167f0cacae5 166 wait(0.25);
ArthurSemjonov 1:0167f0cacae5 167 }
ArthurSemjonov 1:0167f0cacae5 168 }
ArthurSemjonov 1:0167f0cacae5 169
ArthurSemjonov 1:0167f0cacae5 170 /*===================================================================*/
ArthurSemjonov 1:0167f0cacae5 171 float lookupNoteFrq(float frq[], int k)
ArthurSemjonov 1:0167f0cacae5 172 {
ArthurSemjonov 1:0167f0cacae5 173 int location_of_note = frequency[k];
ArthurSemjonov 1:0167f0cacae5 174 pc.printf("\n\rLocation of the note = '%d'", location_of_note);
ArthurSemjonov 1:0167f0cacae5 175
ArthurSemjonov 1:0167f0cacae5 176 float vNote = notes[location_of_note];
ArthurSemjonov 1:0167f0cacae5 177 pc.printf("\n\rFrq of the note = '%f'", vNote);
ArthurSemjonov 1:0167f0cacae5 178 return vNote;
ArthurSemjonov 1:0167f0cacae5 179 }