Acrob005: Rozdiel medzi revíziami
Zo stránky SensorWiki
Bez shrnutí editace |
|||
(7 medziľahlých úprav od rovnakého používateľa nie je zobrazených.) | |||
Riadok 1: | Riadok 1: | ||
[[Acrob004|< Previous]] | [[Acrob|Home]] | [[Acrob006|Next >]] | |||
== Make Music == | == Make Music == | ||
Riadok 11: | Riadok 14: | ||
void setup() | void setup() | ||
{ | { | ||
// Example 1: tone of specified frequency and duration | // Example 1: tone of specified frequency and duration | ||
Riadok 16: | Riadok 20: | ||
delay(500); //small pause | delay(500); //small pause | ||
// Example 2: tone of specified frequency without duration | |||
tone(SPEAKER, | tone(SPEAKER, 2000); // 2kHz, forever | ||
delay(1000); | delay(1000); | ||
noTone(SPEAKER); // turn off sound. | noTone(SPEAKER); // turn off sound. | ||
Riadok 33: | Riadok 39: | ||
=== How it works === | === How it works === | ||
First, notice that we don't have anything in the loop section. This is OK, as we need just one tone, not | |||
eternal noisemaking board. | |||
At the first line we define symbolic name for the pin to which is the speaker connected. It makes life easier. | |||
For generating tones there is a command (not surprisingly) <TT>tone</TT> Its first parameter is name of the pin where the sound should be sent. Second parameter is a frequency in [Hz] of the tone and (optional) third parameter is the length of the tone. Following example plays tone of the frequency | |||
4000 Hz (4kHz) for period of 1 second. | |||
tone(SPEAKER, 4000, 1000); // 4kHz, 1 sec. | |||
It is not necessary to specify the length of the tone, then it sounds until another command changes its state. The example below does the same as the previous one. | |||
tone(SPEAKER, 2000); // 2kHz, forever | |||
delay(1000); | |||
noTone(SPEAKER); // turn off sound. | |||
The main (and important) difference is, that here the processor is stalled for 1 second whereas in the first example the sound is generated independently and after the sound start the processor continues with another commands. | |||
'''But how the piezospeaker works?''' | |||
See http://www.sonitron.be/site/contentpage.php?primid=15 | |||
=== Your turn === | |||
Try to examine loudness of the speaker at the different frequencies. Did You notice the change? | |||
=== Why robot needs to play music? === | |||
Microprocessor needs to be RESET before it starts its normal operation. This means that the processor will be setuped into the defined initial state. RESET signal is coming from various sources. One of them is the RESET button on Your board. So You can initialize the processor anytime You find it dead-locked. Another RESET signal comes from the programming interface. When You download new program to the board, it is also initialized before your program starts. | |||
And last, but not least, there is also Power-Up reset system. There is a subcircuit in the internal processor system designed to watch the actual voltage level at the power pins. This prevents to start processor operation during the unstable power-up phase. The operation starts when the power supply is high enough to ensure proper operation of the processor. | |||
This also means, that when Your processor is operated from the batteries and suddenly the battery voltage decreases (e.g when motors require more power and | |||
batteries are weak), this also generates the RESET signal. This is unfortunately not visible so You can sometimes find Your robot behaviour very strange. | |||
To solve this problem it is a good idea to add single beep in setup() part of your programm. In the case Your batteries are too weak, you can be sure that Your robot will get into the RESET condition very often (e.g. during the motor start). So when You listen sudden beep during your robot operation, it's likely time to change (or recharge) batteries. | |||
'''And why there is a label on the speaker?''' (Remove seal after washing) | |||
See http://www.sonitron.be/site/subpage.php?primid=7&hid=8 | |||
=== Advanced example === | |||
Following example shows more sound effects. It comes from the http://www.arduino.cc/en/Tutorial/Melody | |||
with just one minor (but important) change: the pinnumber is 4, not 9. | |||
<source lang="cpp"> | |||
#define SPEAKER_Pin 4 | |||
int length = 15; // the number of notes | |||
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 }; | |||
int tempo = 300; | |||
void playTone(int tone, int duration) | |||
{ | |||
for (long i = 0; i < duration * 1000L; i += tone * 2) | |||
{ | |||
digitalWrite(SPEAKER_Pin, HIGH); | |||
delayMicroseconds(tone); | |||
digitalWrite(SPEAKER_Pin, LOW); | |||
delayMicroseconds(tone); | |||
} | |||
} | } | ||
void playNote(char note, int duration) | |||
{ | |||
char names[] = { 'c', 'd', 'e', 'f', 'g', 'a', 'b', 'C' }; | |||
int tones[] = { 1915, 1700, 1519, 1432, 1275, 1136, 1014, 956 }; | |||
void playNote(char note, int duration) { | |||
char names[] = { 'c', 'd', 'e', 'f', 'g', 'a', 'b', 'C' }; | |||
// play the tone corresponding to the note name | // play the tone corresponding to the note name | ||
Riadok 226: | Riadok 117: | ||
} | } | ||
void setup() { | |||
pinMode( | |||
void setup() | |||
{ | |||
pinMode(SPEAKER_Pin, OUTPUT); | |||
} | } | ||
void loop() { | |||
void loop() | |||
{ | |||
for (int i = 0; i < length; i++) { | for (int i = 0; i < length; i++) { | ||
if (notes[i] == ' ') { | if (notes[i] == ' ') { | ||
Riadok 239: | Riadok 135: | ||
// pause between notes | // pause between notes | ||
delay(tempo / 2); | delay(tempo / 2); | ||
} | } | ||
} | } | ||
Riadok 245: | Riadok 141: | ||
</source> | </source> | ||
[[Acrob004|< Previous]] | [[Acrob|Home]] | [[Acrob006|Next >]] | [[Acrob004|< Previous]] | [[Acrob|Home]] | [[Acrob006|Next >]] |
Aktuálna revízia z 12:05, 12. jún 2010
< Previous | Home | Next >
Make Music
Speaker is a small electronic device which can make sounds if appropriate driven. Lets connect the speaker to the Arduino pin D4 (see schematic diagram and connection diagram below) and program it to make few tones.
#define SPEAKER 4 // Piezospeaker connected to pin 4
void setup()
{
// Example 1: tone of specified frequency and duration
tone(SPEAKER, 4000, 1000); // 4kHz, 1 sec.
delay(500); //small pause
// Example 2: tone of specified frequency without duration
tone(SPEAKER, 2000); // 2kHz, forever
delay(1000);
noTone(SPEAKER); // turn off sound.
}
void loop()
{
/* do nothing */
}
For more details about the tone command see the Reference
How it works
First, notice that we don't have anything in the loop section. This is OK, as we need just one tone, not eternal noisemaking board.
At the first line we define symbolic name for the pin to which is the speaker connected. It makes life easier. For generating tones there is a command (not surprisingly) tone Its first parameter is name of the pin where the sound should be sent. Second parameter is a frequency in [Hz] of the tone and (optional) third parameter is the length of the tone. Following example plays tone of the frequency 4000 Hz (4kHz) for period of 1 second.
tone(SPEAKER, 4000, 1000); // 4kHz, 1 sec.
It is not necessary to specify the length of the tone, then it sounds until another command changes its state. The example below does the same as the previous one.
tone(SPEAKER, 2000); // 2kHz, forever delay(1000); noTone(SPEAKER); // turn off sound.
The main (and important) difference is, that here the processor is stalled for 1 second whereas in the first example the sound is generated independently and after the sound start the processor continues with another commands.
But how the piezospeaker works?
See http://www.sonitron.be/site/contentpage.php?primid=15
Your turn
Try to examine loudness of the speaker at the different frequencies. Did You notice the change?
Why robot needs to play music?
Microprocessor needs to be RESET before it starts its normal operation. This means that the processor will be setuped into the defined initial state. RESET signal is coming from various sources. One of them is the RESET button on Your board. So You can initialize the processor anytime You find it dead-locked. Another RESET signal comes from the programming interface. When You download new program to the board, it is also initialized before your program starts.
And last, but not least, there is also Power-Up reset system. There is a subcircuit in the internal processor system designed to watch the actual voltage level at the power pins. This prevents to start processor operation during the unstable power-up phase. The operation starts when the power supply is high enough to ensure proper operation of the processor.
This also means, that when Your processor is operated from the batteries and suddenly the battery voltage decreases (e.g when motors require more power and batteries are weak), this also generates the RESET signal. This is unfortunately not visible so You can sometimes find Your robot behaviour very strange.
To solve this problem it is a good idea to add single beep in setup() part of your programm. In the case Your batteries are too weak, you can be sure that Your robot will get into the RESET condition very often (e.g. during the motor start). So when You listen sudden beep during your robot operation, it's likely time to change (or recharge) batteries.
And why there is a label on the speaker? (Remove seal after washing)
See http://www.sonitron.be/site/subpage.php?primid=7&hid=8
Advanced example
Following example shows more sound effects. It comes from the http://www.arduino.cc/en/Tutorial/Melody with just one minor (but important) change: the pinnumber is 4, not 9.
#define SPEAKER_Pin 4
int length = 15; // the number of notes
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 };
int tempo = 300;
void playTone(int tone, int duration)
{
for (long i = 0; i < duration * 1000L; i += tone * 2)
{
digitalWrite(SPEAKER_Pin, HIGH);
delayMicroseconds(tone);
digitalWrite(SPEAKER_Pin, LOW);
delayMicroseconds(tone);
}
}
void playNote(char note, int duration)
{
char names[] = { 'c', 'd', 'e', 'f', 'g', 'a', 'b', 'C' };
int tones[] = { 1915, 1700, 1519, 1432, 1275, 1136, 1014, 956 };
// play the tone corresponding to the note name
for (int i = 0; i < 8; i++) {
if (names[i] == note) {
playTone(tones[i], duration);
}
}
}
void setup()
{
pinMode(SPEAKER_Pin, OUTPUT);
}
void loop()
{
for (int i = 0; i < length; i++) {
if (notes[i] == ' ') {
delay(beats[i] * tempo); // rest
} else {
playNote(notes[i], beats[i] * tempo);
}
// pause between notes
delay(tempo / 2);
}
}
< Previous | Home | Next >