Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
Fork of speaker_demo_PWM by
Revision 1:2e6ea42675c7, committed 2014-10-21
- Comitter:
- 4180_1
- Date:
- Tue Oct 21 03:00:15 2014 +0000
- Parent:
- 0:b2fdf3770282
- Commit message:
- ver 1.0
Changed in this revision
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/SongPlayer.h Tue Oct 21 03:00:15 2014 +0000
@@ -0,0 +1,41 @@
+#include "mbed.h"
+// new class to play a note on Speaker based on PwmOut class
+class SongPlayer
+{
+public:
+ SongPlayer(PinName pin) : _pin(pin) {
+// _pin(pin) means pass pin to the constructor
+ }
+// class method to play a note based on PwmOut class
+ void PlaySong(float frequency[], float duration[], float volume=1.0) {
+ vol = volume;
+ notecount = 0;
+ _pin.period(1.0/frequency[notecount]);
+ _pin = volume/2.0;
+ noteduration.attach(this,&SongPlayer::nextnote, duration[notecount]);
+ // setup timer to interrupt for next note to play
+ frequencyptr = frequency;
+ durationptr = duration;
+ //returns after first note starts to play
+ }
+ void nextnote();
+private:
+ Timeout noteduration;
+ PwmOut _pin;
+ int notecount;
+ float vol;
+ float * frequencyptr;
+ float * durationptr;
+};
+//Interrupt Routine to play next note
+void SongPlayer::nextnote()
+{
+ _pin = 0.0;
+ notecount++; //setup next note in song
+ if (durationptr[notecount]!=0.0) {
+ _pin.period(1.0/frequencyptr[notecount]);
+ noteduration.attach(this,&SongPlayer::nextnote, durationptr[notecount]);
+ _pin = vol/2.0;
+ } else
+ _pin = 0.0; //turn off on last note
+}
\ No newline at end of file
--- a/Speaker.h Sun Jan 20 03:02:37 2013 +0000
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,19 +0,0 @@
-#include "mbed.h"
-// new class to play a note on Speaker based on PwmOut class
-class Speaker
-{
-public:
- Speaker(PinName pin) : _pin(pin) {
-// _pin(pin) means pass pin to the Speaker Constructor
- }
-// class method to play a note based on PwmOut class
- void PlayNote(float frequency, float duration, float volume) {
- _pin.period(1.0/frequency);
- _pin = volume/2.0;
- wait(duration);
- _pin = 0.0;
- }
-
-private:
- PwmOut _pin;
-};
\ No newline at end of file
--- a/main.cpp Sun Jan 20 03:02:37 2013 +0000
+++ b/main.cpp Tue Oct 21 03:00:15 2014 +0000
@@ -1,19 +1,32 @@
#include "mbed.h"
-#include "Speaker.h"
+#include "SongPlayer.h"
-// Speaker test program - euro police style siren now using new Speaker class method
+// Song test program - plays a song using PWM and timer interrupts
// for documentation see http://mbed.org/users/4180_1/notebook/using-a-speaker-for-audio-output/
-// can also be used to play a song, if you have the notes and durations
+// can be used to play a song, if you have the notes and durations
// for musical note frequencies see http://en.wikipedia.org/wiki/Piano_key_frequencies
+//Set up notes and durations for sample song to play
+// A 0.0 duration note at end terminates song play
+float note[18]= {1568.0,1396.9,1244.5,1244.5,1396.9,1568.0,1568.0,1568.0,1396.9,
+ 1244.5,1396.9,1568.0,1396.9,1244.5,1174.7,1244.5,1244.5, 0.0
+ };
+float duration[18]= {0.48,0.24,0.72,0.48,0.24,0.48,0.24,0.24,0.24,
+ 0.24,0.24,0.24,0.24,0.48,0.24,0.48,0.48, 0.0
+ };
+
+DigitalOut led1(LED1);
int main()
{
-// setup instance of new Speaker class, mySpeaker using pin 21
+// setup instance of new SongPlayer class, mySpeaker using pin 26
// the pin must be a PWM output pin
- Speaker mySpeaker(p21);
- // loops forever playing two notes on speaker
+ SongPlayer mySpeaker(p26);
+// Start song and return once playing starts
+ mySpeaker.PlaySong(note,duration);
+ // loops forever while song continues to play to end using interrupts
while(1) {
- mySpeaker.PlayNote(969.0,0.5,0.5);
- mySpeaker.PlayNote(800.0,0.5,0.5);
+ led1 = !led1;
+ wait(.1);
}
}
+

TPA2005D1 Class D Audio Amp
Audio Amplifier - PAM8302