Stap 3: Code uploaden en vibrationele muziek afspelen!
Speciale dank aan R-Team Robotics club voor het posten van hun arduino-code met de melodieën die geprogrammeerd in!
http://www.phys-x.org/rbots/index.php?option=com_content&view=article&id=66:Lesson-5-Play-Melody-with-piezo&catId=41:kits&Itemid=70
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
/ * Spelen melodie
* -----------
*
-Programma tot een eenvoudige melodie spelen
*
* Tonen zijn gemaakt door snel pulserende een spreker in- en uitschakelen
* gebruik PWM, voor het maken van de handtekening frequenties.
*
* Elke noot heeft een frequentie, gemaakt door het variëren van de periode van
* trillingen, gemeten in microseconden. We gebruiken pulsbreedte
* modulatie (PWM) maken dat trillingen.
* We berekenen de pulsbreedte te helft van de periode; We pulse
* de luidspreker HIGH voor 'pols-breedte' microseconden en vervolgens laag
* voor 'pols-breedte' microseconden.
* Deze pulserende creëert een trilling van de gewenste frequentie.
*
* (gespleten) 2005 overleden Cuartielles voor K3
* Refactoring en opmerkingen van 2006 clay.shirky
* Zie opmerkingen in commentaren aan einde voor mogelijke verbeteringen
*/
// TONES ==========================================
Beginnen met het definiëren van de relatie tussen
Opmerking, periode, & frequentie.
periode is in microseconde zo P = 1/f * (1E6)
#define c3 7634
#define d3 6803
#define e3 6061
#define f3 5714
#define g3 5102
#define a3 4545
#define b3 4049
#define c4 3816 / / 261 Hz
#define d4 3401 / / 294 Hz
#define e4 3030 / / 329 Hz
#define f4 2865 / / 349 Hz
#define g4 2551 / / 392 Hz
#define a4 2272 / / 440 Hz
#define a4s 2146
#define b4 2028 / / 493 Hz
#define c5 1912 / / 523 Hz
#define d5 1706
#define d5s 1608
#define e5 1517
#define f5 1433
#define g5 1276
#define a5 1136
#define a5s 1073
#define b5 1012
#define c6 955
Een speciale opmerking, 'R', te vertegenwoordigen een rust definiëren
#define R 0
// SETUP ============================================
Spreker op een PWM-pin (digitale 9, 10 of 11) instellen
int speakerOut = 9;
Willen wij debuggen op seriële out? 1 voor Ja, 0 voor Nee
int DEBUG = 1;
VOID Setup {}
pinMode (speakerOut, OUTPUT);
Als (DEBUG) {}
Serial.begin(9600); Seriële uit als we willen dat foutopsporing instellen
}
}
MELODIE en TIMING ===
[Melody] is een array van nota's, vergezeld van beats [],
waarin elke nota's relatieve lengte (hogere # en langere opmerking)
Star wars-thema
int melodie [] = {f4, f4, f4, a4s, f5, d5s, d5, c5, a5s, f5, d5s, d5, c5, a5s, f5, d5s, d5, d5s, c5} ;//
int verslaat [] = {21, 21, 21, 128, 128, 21, 21, 21, 128, 64, 21, 21, 21, 128, 64, 21, 21, 21, 128};
Opmerking debug
int melodie [] = {c4, d4, e4, f4, g4, a4, b4, c5};
int verslaat [] = {63, 64, 64, 64, 64, 64, 64, 64};
Super mario thema
int melodie [] = {e5, e5, R, e5, R, c5, e5, R, g5, R, R, R, g4, R, R, R, c5, R, R, g4, R, R, e4};
int verslaat [] = {16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 8, 16, 8, 16, 16};
int MAX_COUNT = sizeof(melody) / 2; Melodie de lengte, voor een lus.
Set algehele tempo
lange tempo = 10000;
Lengte van de pauze tussen notities instellen
int pauze = 1000;
Lus variabele meer Rest lengte
int rest_count = 50; <-BLETCHEROUS HACK; Zie ' opmerkingen '
Kern variabelen initialiseren
int toneM = 0;
int verslaan = 0;
lange duur = 0;
// PLAY TONE ==============================================
Pulse de spreker om af te spelen van een Toon voor een bepaalde duur
ongeldig playTone() {}
lange elapsed_time = 0;
Als (toneM > 0) {/ / als dit niet een Rest beat, terwijl de Toon heeft
minder lang dan 'duur', pulse spreker hoge en lage gespeeld
terwijl (elapsed_time < duur) {}
digitalWrite(speakerOut,HIGH);
delayMicroseconds(toneM / 2);
DOWN
digitalWrite (speakerOut, laag);
delayMicroseconds(toneM / 2);
Bijhouden van hoe lang we gepulseerde
elapsed_time += (toneM);
}
}
else {/ / Rest verslaan; lus keer uitstellen
for (int j = 0; j < rest_count; j ++) {/ / zienoot op rest_count
delayMicroseconds(duration);
}
}
}
LAAT DE WILDE RUMPUS BEGINNEN ===
void loop {}
Instellen van een teller te trekken uit de melodie [] en beats]
for (int i = 0; ik < MAX_COUNT; i ++) {}
toneM = melodie [i];
Beat = slagen [i];
duur = beat * tempo; Timing instellen
playTone();
Een pauze tussen notities...
delayMicroseconds(pause);
Als (DEBUG) {/ / als foutopsporing, verslag lus, Toon, beat, en duur
Serial.Print(i);
Serial.Print(":");
Serial.Print(Beat);
Serial.Print("");
Serial.Print(toneM);
Serial.Print("");
Serial.println(duration);
}
}
}
/*
* NOTA 'S
* Het programma pretendeert te houden een Toon voor 'duur' microseconden.
* Leugens ligt leugens! Het geldt voor ten minste 'duur' microseconden, _plus_
* overhead gemaakt door incremeting elapsed_time (zou dan
* 3 K microseconden) _plus_ overhead van looping en twee digitalWrites()
*
* Hierdoor speelt een Toon van 'duur' veel langzamer dan een rust
* van 'duur.' maakt rest_count een lus variabele om 'rest' beats
* in overeenstemming met de 'Toon' beats van dezelfde lengte.
*
* rest_count zal worden beïnvloed door chiparchitectuur en snelheid, alsmede
* overhead van elk programma mods. Afgelopen gedrag is geen garantie voor de toekomst
* prestaties. Jouw snelheid kan variëren. Lichte fuse en wegkomen.
*
* Dit kan het gebruik van een aantal verbeteringen:
* Het toevoegen van code om te laten de programmeur opgeven hoeveel keer de melodie moet
-lus voordat stoppen
* Het toevoegen van een andere octave
* Tempo, pauze en rest_count verplaatsen naar #define verklaringen
* HERSCHRIJVEN te nemen volume, met behulp van analogWrite, net als bij het tweede programma op
* http://www.arduino.cc/en/Tutorial/PlayMelody
* Code toevoegen om te maken het tempo instelbaar door pot of een ander invoerapparaat
* Code toevoegen om te nemen tempo of volume instelbaar door seriële communicatie
* (0005 vereist of hoger.)
* Code toevoegen om te maken een verschuiving van de Toon (hoger of lager) via pot enz
* VERVANGEN door willekeurige melodie bars 'Smoke on the Water' openen
*/