Uses the SRF02 UDS and displays distance in a variety of ways on the N5110 LCD.

Dependencies:   N5110WN PowerControl SRF02 mbed

Committer:
JakBlackburn
Date:
Fri May 08 09:08:25 2015 +0000
Revision:
11:2b3d646e3bfb
Parent:
6:a5cd7eb72264
updated docs

Who changed what in which revision?

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