Neste exemplo usamos um piezo para tocar melodias. Usamos a possibilidade dos processadores de produzir sinais PWM com o objetivo de tocar músicas.

Um piezo não é nada mais que um dispositivo que pode ser usado tanto para reproduzir tons como para detectá-los. Neste exemplo vamos conectar um piezo no pino 9, que suporta a funcionalidade de um sinal PWM e não somente sinais HIGH ou LOW. Neste caso faremos uso da funcionalidade PWM para controlar o volume através da alteração do comprimento do pulso.

Componentes necessários:

  • Arduino
  • 1 sensor/atuador piezoelétrico
  • 1 Cabo USB

Circuito

Os Piezos têm polaridade. Peças comerciais normalmente têm um lado vermelho (positivo) e outro preto (negativo). Conecte o cabo vermelho no pino digital 9 e o cabo preto ao terra. Elementos Piezo sem a capa plástica, e se parecem a um disco metálico.

Arduino Exemplos: Melodia

Esquema

Código

/* Play Melody
 * -----------
 *
 * Program to play melodies stored in an array, it requires to know
 * about timing issues and about how to play tones.
 *
 * The calculation of the tones is made following the mathematical
 * operation:
 *
 *       timeHigh = 1/(2 * toneFrequency) = period / 2
 *
 * where the different tones are described as in the table:
 *
 * note         frequency       period  PW (timeHigh)  
 * c            261 Hz          3830    1915    
 * 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    
 * b            493 Hz          2028    1014   
 * C            523 Hz          1912    956
 *
 * (cleft) 2005 D. Cuartielles for K3
 */


int ledPin = 13;
int speakerOut = 9;              
byte names[] = {'c', 'd', 'e', 'f', 'g', 'a', 'b', 'C'};  
int tones[] = {1915, 1700, 1519, 1432, 1275, 1136, 1014, 956};
byte melody[] = "2d2a1f2c2d2a2d2c2f2d2a2c2d2a1f2c2d2a2a2g2p8p8p8p";
// count length: 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0
//                                10                  20                  30
int count = 0;
int count2 = 0;
int count3 = 0;
int MAX_COUNT = 24;
int statePin = LOW;

void setup() {
 pinMode(ledPin, OUTPUT);
}

void loop() {
  analogWrite(speakerOut, 0);    
  for (count = 0; count < MAX_COUNT; count++) {
    statePin = !statePin;
    digitalWrite(ledPin, statePin);
    for (count3 = 0; count3 <= (melody[count*2] - 48) * 30; count3++) {
      for (count2=0;count2<8;count2++) {
        if (names[count2] == melody[count*2 + 1]) {      
          analogWrite(speakerOut,500);
          delayMicroseconds(tones[count2]);
          analogWrite(speakerOut, 0);
          delayMicroseconds(tones[count2]);
        }
        if (melody[count*2 + 1] == 'p') {
          // make a pause of a certain size
          analogWrite(speakerOut, 0);
          delayMicroseconds(500);
        }
      }
    }
  }
}

O conteúdo desta página é uma tradução para o português a partir do site original do Arduino.