Operácie

Acrob005: Rozdiel medzi revíziami

Z SensorWiki

(Advanced example)
(Advanced example)
Riadok 37: Riadok 37:
 
=== Advanced example ===
 
=== Advanced example ===
  
Following example shows more sound effects. It comes from the  http://www.arduino.cc/en/Tutorial/PlayMelody
+
Following example shows more sound effects. It comes from the  http://www.arduino.cc/en/Tutorial/Melody
with just one minor (but important) change: variable <TT>tone</TT> is renamed to <TT>note</TT> as the name tone
+
with just one minor (but important) change: the pinnumber is 4, not 9.  
makes collision with the same command.  
 
 
 
 
 
 
 
  
 
<source lang="cpp">
 
<source lang="cpp">
/* Play Melody
 
* -----------
 
*
 
* Program to play a simple melody
 
*
 
* Tones are created by quickly pulsing a speaker on and off
 
*  using PWM, to create signature frequencies.
 
*
 
* Each note has a frequency, created by varying the period of
 
*  vibration, measured in microseconds. We'll use pulse-width
 
*  modulation (PWM) to create that vibration.
 
  
* We calculate the pulse-width to be half the period; we pulse
+
#define SPEAKER_Pin 4
*  the speaker HIGH for 'pulse-width' microseconds, then LOW
 
*  for 'pulse-width' microseconds.
 
*  This pulsing creates a vibration of the desired frequency.
 
*
 
* (cleft) 2005 D. Cuartielles for K3
 
* Refactoring and comments 2006 clay.shirky@nyu.edu
 
* See NOTES in comments at end for possible improvements
 
*/
 
  
// TONES  ==========================================
+
  int length = 15;                                              // the number of notes
// Start by defining the relationship between
+
char notes[] = "ccggaagffeeddc ";                              // a space represents a rest
//       note, period, &  frequency.
+
  int beats[] = { 1, 1, 1, 1, 1, 1, 2, 1, 1, 1, 1, 1, 1, 2, 4 };
#define  c    3830    // 261 Hz
+
  int tempo = 300;
#define  d    3400    // 294 Hz
 
#define  e    3038    // 329 Hz
 
#define  f    2864    // 349 Hz
 
#define  g    2550    // 392 Hz
 
#define  a     2272    // 440 Hz
 
#define b    2028    // 493 Hz
 
#define  C    1912    // 523 Hz
 
// Define a special note, 'R', to represent a rest
 
#define  R    0
 
  
// SETUP ============================================
+
void playTone(int tone, int duration)  
// Set up speaker on a PWM pin (digital 9, 10 or 11)
+
{
int speakerOut = 9;
+
  for (long i = 0; i < duration * 1000L; i += tone * 2)
// Do we want debugging on serial out? 1 for yes, 0 for no
+
  {
int DEBUG = 1;
+
    digitalWrite(speakerPin, HIGH);
 
+
    delayMicroseconds(tone);
void setup() {
+
    digitalWrite(speakerPin, LOW);
  pinMode(speakerOut, OUTPUT);
+
    delayMicroseconds(tone);
  if (DEBUG) {
+
  }
    Serial.begin(9600); // Set serial out if we want debugging
 
  }  
 
 
}
 
}
  
// MELODY and TIMING  =======================================
 
//  melody[] is an array of notes, accompanied by beats[],
 
//  which sets each note's relative length (higher #, longer note)
 
int melody[] = {  C,  b,  g,  C,  b,  e,  R,  C,  c,  g, a, C };
 
int beats[]  = { 16, 16, 16,  8,  8,  16, 32, 16, 16, 16, 8, 8 };
 
int MAX_COUNT = sizeof(melody) / 2; // Melody length, for looping.
 
 
// Set overall tempo
 
long tempo = 10000;
 
// Set length of pause between notes
 
int pause = 1000;
 
// Loop variable to increase Rest length
 
int rest_count = 100; //<-BLETCHEROUS HACK; See NOTES
 
 
// Initialize core variables
 
int note = 0;
 
int beat = 0;
 
long duration  = 0;
 
  
// PLAY TONE  ==============================================
+
void playNote(char note, int duration)  
// Pulse the speaker to play a tone for a particular duration
+
{
void playTone() {
+
   char names[] = { 'c', 'd', 'e', 'f', 'g', 'a', 'b', 'C' };
  long elapsed_time = 0;
+
  int tones[] = { 1915, 1700, 1519, 1432, 1275, 1136, 1014, 956 };
  if (note > 0) { // if this isn't a Rest beat, while the tone has
 
    //  played less long than 'duration', pulse speaker HIGH and LOW
 
    while (elapsed_time < duration) {
 
 
 
      digitalWrite(speakerOut,HIGH);
 
      delayMicroseconds(note / 2);
 
 
 
      // DOWN
 
      digitalWrite(speakerOut, LOW);
 
      delayMicroseconds(note / 2);
 
 
 
      // Keep track of how long we pulsed
 
      elapsed_time += (note);
 
    }
 
  }
 
  else { // Rest beat; loop times delay
 
    for (int j = 0; j < rest_count; j++) { // See NOTE on rest_count
 
      delayMicroseconds(duration); 
 
    }                               
 
  }                               
 
}
 
 
 
// LET THE WILD RUMPUS BEGIN =============================
 
void loop() {
 
  // Set up a counter to pull from melody[] and beats[]
 
  for (int i=0; i<MAX_COUNT; i++) {
 
    note = melody[i];
 
    beat = beats[i];
 
 
 
    duration = beat * tempo; // Set up timing
 
 
 
    playTone();
 
    // A pause between notes...
 
    delayMicroseconds(pause);
 
 
 
    if (DEBUG) { // If debugging, report loop, tone, beat, and duration
 
      Serial.print(i);
 
      Serial.print(":");
 
      Serial.print(beat);
 
      Serial.print(" ");   
 
      Serial.print(note);
 
      Serial.print(" ");
 
      Serial.println(duration);
 
    }
 
  }
 
}
 
 
 
/*
 
* NOTES
 
* The program purports to hold a tone for 'duration' microseconds.
 
*  Lies lies lies! It holds for at least 'duration' microseconds, _plus_
 
*  any overhead created by incremeting elapsed_time (could be in excess of
 
*  3K microseconds) _plus_ overhead of looping and two digitalWrites()
 
 
* As a result, a tone of 'duration' plays much more slowly than a rest
 
*  of 'duration.' rest_count creates a loop variable to bring 'rest' beats
 
*  in line with 'tone' beats of the same length.
 
*
 
* rest_count will be affected by chip architecture and speed, as well as
 
*  overhead from any program mods. Past behavior is no guarantee of future
 
*  performance. Your mileage may vary. Light fuse and get away.
 
 
* This could use a number of enhancements:
 
* ADD code to let the programmer specify how many times the melody should
 
*    loop before stopping
 
* ADD another octave
 
* MOVE tempo, pause, and rest_count to #define statements
 
* RE-WRITE to include volume, using analogWrite, as with the second program at
 
*          http://www.arduino.cc/en/Tutorial/PlayMelody
 
* ADD code to make the tempo settable by pot or other input device
 
* ADD code to take tempo or volume settable by serial communication
 
*          (Requires 0005 or higher.)
 
* ADD code to create a tone offset (higer or lower) through pot etc
 
* REPLACE random melody with opening bars to 'Smoke on the Water'
 
*/
 
 
 
 
 
</source>
 
 
 
<source lang="cpp">
 
 
 
int speakerPin = 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(speakerPin, HIGH);
 
    delayMicroseconds(tone);
 
    digitalWrite(speakerPin, 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
 
   // play the tone corresponding to the note name
Riadok 226: Riadok 74:
 
}
 
}
  
void setup() {
+
 
 +
 
 +
void setup()  
 +
{
 
   pinMode(speakerPin, OUTPUT);
 
   pinMode(speakerPin, 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 242: Riadok 95:
 
   }
 
   }
 
}
 
}
 
 
</source>
 
</source>
  
 
 
 
[[Acrob02|Predošlá úloha...]] | [[Acrob|Späť do menu]] | [[Acrob03|Pokračovanie...]]
 
  
 
[[Acrob004|< Previous]] | [[Acrob|Home]] | [[Acrob006|Next >]]
 
[[Acrob004|< Previous]] | [[Acrob|Home]] | [[Acrob006|Next >]]

Verzia zo dňa a času 10:09, 12. jún 2010

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.

ArduinoSpeaker.png
#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
  
  tone(SPEAKER, 3000);         // 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

Why robot needs to play music?

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(speakerPin, HIGH);
     delayMicroseconds(tone);
     digitalWrite(speakerPin, 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(speakerPin, 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 >