Arduino
pin 9
gnd
(ground) (-)
Piezo
Element
19
CIRC-06
18
CIRC-06
What We’re Doing:
.:Music:.
.:Piezo Elements:.
To this point we have controlled light, motion, and
electrons, Lets tackle sound next. But sound is an
analog phenomena, how will our digital Arduino cope?
We will once again rely on its incredible speed which will let
it mimic analog behavior. To do this, we will attach a piezo element to one of the
Arduino's digital pins. A piezo element makes a clicking sound each time it is pulsed
with current. If we pulse it at the right frequency (for example 440 times a second
to make the note middle A) these clicks will run together to produce notes. Lets get
to experimenting with it and get your Arduino playing 'Twinkle Twinkle Little Star'.
Can't Think While the
Melody is Playing.
Just pull up the piezo element
whilst you think, upload your
program then plug it back in.
Code
(no need to type everything in just)
Not Working?
(3 things to try)
More, More, More:
More details, where to buy more parts, where to ask more questions.
http://tinyurl.com/cpf6so
Making it Better
No Sound
Given the size and shape of the
piezo element it is easy to miss
the right holes on the
breadboard. Try double
checking its placement.
char names[] = { 'c', 'd', 'e', 'f', 'g', 'a', 'b',
Playing with the speed:
'C' };
The timing for each note is calculated based on variables,
int tones[] = { 1915, 1700, 1519, 1432, 1275, 1136,
as such we can tweak the sound of each note or the
1014, 956 };
timing. To change the speed of the melody you need to
Composing your own melodies:
The program is pre-set to play 'Twinkle Twinkle Little Star'
change only one line.
int tempo = 300; ---> int tempo = (new #)
however the way it is programmed makes changing the song
Change it to a larger number to slow the melody down,
easy. Each song is defined in one int and two arrays, the
int
or a smaller number to speed it up.
length
defines the number of notes, the first array
notes[]
Tuning the notes:
defines each note, and the second
beats[]
defines how long
If you are worried about the notes being a little out of
each note is played. Some Examples:
tune this can be fixed as well. The notes have been
Twinkle Twinkle Little Star
calculated based on a formula in the comment block at
int length = 15;
char notes[] = "ccggaagffeeddc ";
the top of the program. But to tune individual notes just
int beats[] = { 1, 1, 1, 1, 1, 1, 2, 1, 1, 1, 1,
adjust their values in the
tones[]
array up or down
1, 1, 2, 4 };
Happy Birthday (first line)
until they sound right. (each note is matched by its name
int length = 13;
char notes[] = "ccdcfeccdcgf ";
in the
names[] (
array ie. c = 1915 )
int beats[] = {1,1,1,1,1,2,1,1,1,1,1,2,4};
Tired of Twinkle Twinkle
Little Star?
The code is written so you can
easily add your own songs,
check out the code below to
get started.
/* Melody
* (cleft) 2005 D. Cuartielles for K3
*
* This example uses a piezo speaker to play melodies. It sends
digitalWrite(speakerPin, LOW);
* a square wave of the appropriate frequency to the piezo,
delayMicroseconds(tone);
* generating the corresponding tone.
}
*
}
* The calculation of the tones is made following the
* mathematical operation:
void playNote(char note, int duration) {
*
char names[] = { 'c', 'd', 'e', 'f', 'g', 'a', 'b', 'C' };
* timeHigh = period / 2 = 1 / (2 * toneFrequency)
int tones[] = { 1915, 1700, 1519, 1432, 1275, 1136, 1014, 956
*
};
* where the different tones are described as in the table:
// play the tone corresponding to the note name
*
for (int i = 0; i < 8; i++) {
* note frequency
period
timeHigh
if (names[i] == note) {
* c
261 Hz
3830
1915
playTone(tones[i], duration);
* d
294 Hz
3400
1700
}
* e
329 Hz
3038
1519
}
* f
349 Hz
2864
1432
}
* g
392 Hz
2550
1275
* a
440 Hz
2272
1136
void setup() {
* b
493 Hz
2028
1014
pinMode(speakerPin, OUTPUT);
* C
523 Hz
1912
956
}
*
* http://www.arduino.cc/en/Tutorial/Melody
void loop() {
*/
for (int i = 0; i < length; i++) {
if (notes[i] == ' ') {
int speakerPin = 9;
delay(beats[i] * tempo); // rest
} else {
int length = 15; // the number of notes
playNote(notes[i], beats[i] * tempo);
char notes[] = "ccggaagffeeddc "; // a space represents a rest
}
int beats[] = { 1, 1, 1, 1, 1, 1, 2, 1, 1, 1, 1, 1, 1, 2, 4 };
// pause between notes
int tempo = 300;
delay(tempo / 2); }
}
void playTone(int tone, int duration) {
for (long i = 0; i < duration * 1000L; i += tone * 2) {
digitalWrite(speakerPin, HIGH);
delayMicroseconds(tone);
The Circuit:
Wire
Piezo Element
x1
2 Pin Header
x4
CIRC-06
Breadboard sheet
x1
Parts:
Schematic:
File > Examples > Digital > Melody
(example from the great arduino.cc site check it out for other great ideas)
.:download:.
breadboard layout sheet
http://tinyurl.com/c94aml
.:view:.
assembling video
http://tinyurl.com/mnh33o
The Internet