Play simple melodies with an Arduino and a piezo buzzer
Piezo buzzer background
Piezo buzzers are simple devices that are commonly used to produce beeps and sounds in many electronic gadgets, like alarm clocks, toys, pc boards, etc. They consume very little current and have high impedance, which means that you can safely connect them directly to a micro-controller pin.
Buzzers have a piezoelectric ceramic plate that generates electricity when a mechanical force is applied to it and vibrates (extend and shrink) when exposed to an electric field. The first property is often used to detect knocks and musical tones, while the second property is what we are going to use to play a simple tune from an Arduino micro-controller.
Piezo buzzers are different than the speakers found in phones, headphones and sound systems. Do not connect a speaker directly to an Arduino pin, like we will do with a piezo element later, or you risk to cause some damage to your board (and possibly the speaker too).
A piezo sounder requires a square wave to produce a sound. Different frequencies produce different tones. We can use the Arduino tone() function to generate these frequencies and play simple tunes.
Connect one of the piezo buzzer pins to ground and the other to digital Arduino Pin (I use pin D12 on my Arduino Uno). Simple!
Here is a link to the Arduino sketch from the demo video. Make sure that you place a copy of the “pitches.h” file in the same directory as the ArduinoTunes.ino sketch, or you will get a compile error from the Arduno IDE. The “pitches.h” file contains a mapping of the most common musical notes to their respective frequency.
In ArduinoTunes.ino we have one integer array with the notes of our melody (melody) and another array with the respective note durations (durations). A quarter note has a duration of 4, half note 2 etc. The tempo variable defines the tempo in beats per minute (BPM). In the example it is set to 120 beats per minute, which is the typical march tempo. After all, we are playing the Imperial March!
The playTune() function plays each note in our melody in sequence. I add a pause between the notes that is arbitrarily set to about 1.2 multiplied by the note duration.
A couple of notes:
- This code uses the delay function and is blocking. You will not be able to do much else with the Arduino, while the tune is playing.
- Due to the use of integer variables and the rounding in division, the duration of musical notes will be rounded down.
- You can only play one tone at any given time.
I do not have much musical knowledge, so it took me a while to code the beginning of the imperial march from this link. Simple tunes from old games, or ringtones work best. Just find a note sheet and code the two arrays with the notes and note durations.
If you have any ideas of how to improve this, please post in the comments below!
Arduino Tone Tutorial: