Vibration skum talare! (3 / 3 steg)
Steg 3: Ladda upp koden och spela vibrerande musik!
Speciellt tack till R-Team Robotics klubb för utstationering deras arduino kod med melodier programmeras i!
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
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
/ * Spela melodin
* -----------
*
-Program att spela en enkel melodi
*
* Toner skapas av snabbt pulserande en högtalare på och av
* använda PWM, för att skapa signatur frekvenser.
*
* Varje not har en frekvens, skapad av varierande löptid
* vibrationer, mätt i mikrosekunder. Vi använder bredd för synkpuls
* modulering (PWM) att skapa den vibration.
* Vi beräkna puls-bredd för att vara halva perioden. Vi pulsen
* talaren hög för "pulse-bredd" mikrosekunder, sedan låg
* för "pulse-bredd" mikrosekunder.
* Denna pulserande skapar en vibration av önskad frekvens.
*
* (läpp) 2005 D. Cuartielles för K3
* Refactoring och kommentarer 2006 clay.shirky
* Se anteckningar i kommentarer på slutet för möjliga förbättringar
*/
// TONES ==========================================
Börja med att definiera förhållandet mellan
Obs, period, och frekvens.
i mikrosekund är så 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
Definiera en särskild anmärkning, "R", som representerar en vila
#define R 0
// SETUP ============================================
Ställ in högtalare på en PWM stift (digital 9, 10 eller 11)
int speakerOut = 9;
Vill vi felsökning på serial ut? 1 för Ja, 0 för no
int DEBUG = 1;
void setup() {
pinMode (speakerOut, produktionen);
om (DEBUG) {
Serial.BEGIN(9600); Ställa in följetong ut om vi vill felsökning
}
}
MELODI och TIMING ===
Melody [] är en matris av anteckningar, tillsammans med beats [],
som sätter varje ton relativa längd (högre #, längre anteckning)
Star wars tema
int melodi [] = {f4, f4, f4, a4s, f5, d5s, d5, c5, a5s, f5, d5s, d5, c5, a5s, f5, d5s, d5, d5s, c5} ;//
int slår [] = {21, 21, 21, 128, 128, 21, 21, 21, 128, 64, 21, 21, 21, 128, 64, 21, 21, 21, 128};
Obs debug
int melodi [] = {c4, d4, e4, f4, g4, a4, b4, c5};
int slår [] = {63, 64, 64, 64, 64, 64, 64, 64};
super mario tema
int melodi [] = {e5, e5, R, e5, R, c5, e5, R, g5, R, R, R, g4, R, R, R, c5, R, R, g4, R, R, e4};
int slår [] = {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; Melody längd, för looping.
Ange övergripande tempo
långa tempo = 10000;
Ange längden på paus mellan anteckningar
int paus = 1000;
Loop variabel att öka resten längd
int rest_count = 50; <-BLETCHEROUS hacka; Se anteckningar
Initiera core variabler
int toneM = 0;
int slå = 0;
lång varaktighet = 0;
// PLAY TONE ==============================================
Puls talaren att spela en ton för en viss varaktighet
void playTone() {
lång elapsed_time = 0;
om (toneM > 0) {/ / om detta inte är en resten beat, medan tonen har
spelat mindre långt än "varaktighet", puls högtalare hög och låg
medan (elapsed_time < varaktighet) {
digitalWrite(speakerOut,HIGH);
delayMicroseconds(toneM / 2);
NED
digitalWrite (speakerOut, låg);
delayMicroseconds(toneM / 2);
Hålla reda på hur länge vi pulsade
elapsed_time += (toneM);
}
}
annat {/ / resten slå, loop gånger försenar
för (int j = 0; j < rest_count; j ++) {/ / se anmärkning på rest_count
delayMicroseconds(duration);
}
}
}
LÅT VILDA BRÅK BÖRJA ===
void loop() {
Ställ in en räknare för att dra från melody [] och [slag]
för (int jag = 0; jag < MAX_COUNT; i ++) {
toneM = melodi [i];
slå = beats [i];
längd = beat * tempo; Ställ in timing
playTone();
En paus mellan anteckningar...
delayMicroseconds(pause);
om (DEBUG) {/ / om felsökning, rapport loop, tonar, beat, och varaktighet
Serial.Print(i);
Serial.Print(":");
Serial.Print(Beat);
Serial.Print("");
Serial.Print(toneM);
Serial.Print("");
Serial.println(duration);
}
}
}
/*
* ANTECKNINGAR
* Programmet utger sig för att hålla en ton för 'varaktighet' mikrosekunder.
* Ligger ligger lögner! Det håller för minst 'varaktighet' mikrosekunder, _plus_
* någon overhead skapad av incremeting elapsed_time (kan vara överstiger
* 3 K mikrosekunder) _plus_ overhead av looping och två digitalWrites()
*
* Som ett resultat, spelar en ton av "varaktighet" mycket långsammare än en vila
* av "varaktighet." skapar rest_count en loop variabel för att få "vila" beats
* i "ton" beats av samma längd.
*
* rest_count kommer att påverkas av chip arkitektur och hastighet, som
* overhead från programmet mods. Tidigare beteende är ingen garanti för framtiden
* prestanda. Användbarheten kan variera. Lätta fuse och få bort.
*
* Detta kan använda ett antal förbättringar:
* Lägga till kod för att låta programmeraren anger hur många gånger melodin bör
* loop innan du slutar
* Lägg till en annan octave
* FLYTTA tempo, paus och rest_count till #define uttalanden
* SKRIVA att inkludera volym med analogWrite, som med det andra programmet på
* http://www.arduino.cc/en/Tutorial/PlayMelody
* Lägga till koden för att göra tempot inställbar av potten eller annan inmatningsenhet
* Lägga till koden för att ta tempo eller volym inställbar av seriell kommunikation
* (Kräver 0005 eller högre.)
* Lägga till kod för att skapa en tone offset (högre eller lägre) genom potten etc
* ERSÄTTA slumpmässiga melodi med öppna barer att "Röka på bevattna"
*/