Mar.01

P6: Suonare una melodia con Arduino (Piezo Speaker)

P6

 

Intro: Suonare una melodia (Super Mario) attraverso un Piezo Speaker collegato ad Arduino

 

Occorrente Hardware
  • 1 Arduino Uno
  • 1 Piezo Speaker
  • 2 cavi di collegamento
 
Occorrente Software
  • Arduino software
 
Teoria di Base

Calcolo dei toni attraverso la formula:

timeHigh = period / 2 = 1 / (2 * toneFrequency)

nota: (frequenza, periodo, 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)
 
Sorgente Arduino

 

int speakerPin = 8; //pin digitale di collegamento

int numNote = 295; // numero di note
char note[] = "EE E CE G  g  C  g e  a b ia gEGA FG E CDb C  g e  a b ia gEGA FG E CDb  GNFR E uaC aCD GNFR E 1 11   GNFR E uaC aCD L  D C   CC C CD EC ag  CC C CDE  CC C CD EC ag  EE E CE G  g  C  g e  a b ia gEGA FG E CDb C  g e  a b ia gEGA FG E CDb EC g u aF Fa  bAAAGFEC ag  EC g u aF Fa  bF FFEDCe ec  "; // a space represents a rest
float beats[] = { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 1, 1, 2, 1, 1, 1, 1, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 1, 1, 1, 1, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, //Page 1
                2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 1, 1, 1, 1, 2, 1, 1, 2, 4, //Page 2
                1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 1, 1, 1, 1, 1, 1, 1, 1, 4, 4, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 1, 1, 2, //Page4
                1, 1, 1, 1, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 1, 1, 1, 1, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, //Page 5
                1, 1, 1, 1, 2, 1, 1, 1, 1, 1, 1, 1, 1, 2, 1.3, 1.3, 1.3, 1.3, 1.3, 1.3, 1, 1, 1, 1, 1, 1, 2, 1, 1, 1, 1, 2, 1, 1, 1, 1, 1, 1, 1, 1, 2, 1, 1, 1, 1, 1.3, 1.3, 1.3, 1, 1, 1, 1, 1, 1, 2 }; //Page 6

int tempo = 95;

void playTone(int ton1, int durata) {
  for (long i = 0; i < durata * 1000L; i += ton1) {
    tone(speakerPin, ton1);
    delayMicroseconds(ton1);
  }
  noTone(speakerPin);
}

void playNote(char nota, int durata) {
//                        c    c#   d    d#   e    f    f#   g    g#   a    a#   b
  char nomi[] = { ' ',  '!', '2', '3', '4', '5', '6', '7', '8', '9', '0', '-', '=', 'c', 'd', 'e', 'f', 'g', 'a', 'b', 'C', 'D', 'E', 'F', 'G', 'A', 'B', 'i', 'N', 'R', 'u',  '1', 'L', 'k'}; // [i = b flat] [N = G flat] [R = D#] [u = g#] [1 = C oct. 5] [L = E flat]
  int toni[] =  {   0, 1046, 138, 146, 155, 164, 174, 184, 195, 207, 220, 233, 246, 261, 293, 329, 349, 391, 440, 493, 523, 587, 659, 698, 783, 880, 987, 466, 740, 622, 415, 1046, 622u, 227};

  for (int i = 0; i < 34; i++) {
    if (nomi[i] == nota) {
      playTone(toni[i], durata);
    }
  }
}

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

void loop() {
  for (int i = 0; i < numNote; i++) {
    if (note[i] == ' ') {
      delay(beats[i] * tempo); // rest
    } else {
      playNote(note[i], beats[i] * tempo);
    }

    delay(tempo / 2); // pausa tra le note
  }
}

 

 
Arduino
Share this Story:
  • facebook
  • twitter
  • gplus

Comments(1)

  1. Trackback: Timer e Sveglia con Arduino | Simone Silini

Comments are closed.

Comment