Robot

Dependencies:   Servo mbed wav_header wave_player TextLCD RemoteIR

Committer:
dan_cuspi
Date:
Fri Jun 27 23:39:12 2014 +0000
Revision:
0:39f6dbb94f99
hola

Who changed what in which revision?

UserRevisionLine numberNew contents of line
dan_cuspi 0:39f6dbb94f99 1 class Speaker
dan_cuspi 0:39f6dbb94f99 2 {
dan_cuspi 0:39f6dbb94f99 3 public:
dan_cuspi 0:39f6dbb94f99 4 Speaker(PinName pin) : _pin(pin) {
dan_cuspi 0:39f6dbb94f99 5 // _pin(pin) means pass pin to the Speaker Constructor
dan_cuspi 0:39f6dbb94f99 6 // precompute 32 sample points on one sine wave cycle
dan_cuspi 0:39f6dbb94f99 7 // used for continuous sine wave output later
dan_cuspi 0:39f6dbb94f99 8 for(int k=0; k<32; k++) {
dan_cuspi 0:39f6dbb94f99 9 Analog_out_data[k] = int (65536.0 * ((1.0 + sin((float(k)/32.0*6.28318530717959)))/2.0));
dan_cuspi 0:39f6dbb94f99 10 // scale the sine wave to 16-bits - as needed for AnalogOut write_u16 arg
dan_cuspi 0:39f6dbb94f99 11 }
dan_cuspi 0:39f6dbb94f99 12
dan_cuspi 0:39f6dbb94f99 13 }
dan_cuspi 0:39f6dbb94f99 14 // class method to play a note based on AnalogOut class
dan_cuspi 0:39f6dbb94f99 15 void PlayNote(float frequency, float duration, float volume) {
dan_cuspi 0:39f6dbb94f99 16 // scale samples using current volume level arg
dan_cuspi 0:39f6dbb94f99 17 for(int k=0; k<32; k++) {
dan_cuspi 0:39f6dbb94f99 18 Analog_scaled_data[k] = Analog_out_data[k] * volume;
dan_cuspi 0:39f6dbb94f99 19 }
dan_cuspi 0:39f6dbb94f99 20 // reset to start of sample array
dan_cuspi 0:39f6dbb94f99 21 i=0;
dan_cuspi 0:39f6dbb94f99 22 // turn on timer interrupts to start sine wave output
dan_cuspi 0:39f6dbb94f99 23 Sample_Period.attach(this, &Speaker::Sample_timer_interrupt, 1.0/(frequency*32.0));
dan_cuspi 0:39f6dbb94f99 24 // play note for specified time
dan_cuspi 0:39f6dbb94f99 25 wait(duration);
dan_cuspi 0:39f6dbb94f99 26 // turns off timer interrupts
dan_cuspi 0:39f6dbb94f99 27 Sample_Period.detach();
dan_cuspi 0:39f6dbb94f99 28 // sets output to mid range - analog zero
dan_cuspi 0:39f6dbb94f99 29 this->_pin.write_u16(32768);
dan_cuspi 0:39f6dbb94f99 30
dan_cuspi 0:39f6dbb94f99 31 }
dan_cuspi 0:39f6dbb94f99 32 private:
dan_cuspi 0:39f6dbb94f99 33 // sets up specified pin for analog using AnalogOut class
dan_cuspi 0:39f6dbb94f99 34 AnalogOut _pin;
dan_cuspi 0:39f6dbb94f99 35 // set up a timer to be used for sample rate interrupts
dan_cuspi 0:39f6dbb94f99 36 Ticker Sample_Period;
dan_cuspi 0:39f6dbb94f99 37
dan_cuspi 0:39f6dbb94f99 38 //variables used by interrupt routine and PlayNote
dan_cuspi 0:39f6dbb94f99 39 volatile int i;
dan_cuspi 0:39f6dbb94f99 40 short unsigned Analog_out_data[32];
dan_cuspi 0:39f6dbb94f99 41 short unsigned Analog_scaled_data[32];
dan_cuspi 0:39f6dbb94f99 42
dan_cuspi 0:39f6dbb94f99 43 // Interrupt routine
dan_cuspi 0:39f6dbb94f99 44 // used to output next analog sample whenever a timer interrupt occurs
dan_cuspi 0:39f6dbb94f99 45 void Sample_timer_interrupt(void) {
dan_cuspi 0:39f6dbb94f99 46 // send next analog sample out to D to A
dan_cuspi 0:39f6dbb94f99 47 this->_pin.write_u16(Analog_scaled_data[i]);
dan_cuspi 0:39f6dbb94f99 48 // increment pointer and wrap around back to 0 at 32
dan_cuspi 0:39f6dbb94f99 49 i = (i+1) & 0x01F;
dan_cuspi 0:39f6dbb94f99 50 }
dan_cuspi 0:39f6dbb94f99 51 };
dan_cuspi 0:39f6dbb94f99 52