A safe using the mbed, dc motor, solenoid, and more!

Dependencies:   4DGL-uLCD-SE DebounceIn Motordriver PinDetect SDFileSystem mbed-rtos mbed

Committer:
adamlawrence
Date:
Fri Apr 29 20:01:29 2016 +0000
Revision:
0:6b5c0ae5acc6
initial commit;

Who changed what in which revision?

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