Arduino - Play Piezo
Syftet med detta projekt är att generera musik genom rörelse tack vare accelerometrar.
-1 3-axlig accelerometer
-1 arduino kort
-1 högtalare
-1 song kunna utmana skit ljudet på högtalaren
Koden är grundläggande: Låt rytmen implementeras och före varje tidssteg, handsken sinnen gravitation riktning och väljer en av de tre anteckningarna av låten.
Koden är nedan.
Du kan titta på video på Youtube.
Få nyheter och uppdateringar på min sida. För närvarande jag samlar in medel mot Cancer, donera gärna!
/*
December 28 2012 - Sebastien RUBRECHT
Försök att spela en cool musik med en skit talare, hoppas att den "svala" kompenserar "skit".
Musiken är "where is my mind" från The Pixies, vilket är verkligen lätt att spela.
*/
#define AUTO 0 / / automatisk läge: om 1, musiken spelas automatiskt.
Pins
CONST int analogInPinX = 0; Analog ingång pin som Accelerometerns första pin är kopplad till
CONST int analogInPinY = 1; Analog ingång pin som den Accelerometer andra pin är kopplad till
CONST int analogInPinZ = 2; Analog ingång pin som den Accelerometer tredje pin är kopplad till
CONST int tone1Pin = 9; tonar utsignal
CONST int highPin1 = 11; 5 V näring
CONST int highPin2 = 12; 5 V näring
CONST int lowPin1 = 5; grund för en av de 2 accelerometer gnd.
CONST int lowPin2 = 6; grund för en av de 2 accelerometer gnd.
CONST int ledOKPinGnd = 8; mark för OK Pin
CONST int ledOKPinH = 10; 5 V näring för OK Pin
CONST int ledNOKPinGnd = 2; mark för NOK Pin
CONST int ledNOKPinH = 4; 5 V näring för NOK Pin
konstanta värden
CONST float freq_rediese0 = 38.9;//frequency av en skarp Re i Hz, för octave 0
CONST float freq_mi0 = 41.2;//frequency en mi i Hz, för octave 0
CONST float freq_soldiese0 = 51.9;//frequency av en skarp Sol i Hz, för octave 0
konstant användardefinierade parametrar
CONST int octave = 4; //octave nummer. Var försiktig, under 2(low) och över 6 (akut), det blir mycket ful
CONST int temps = 380; //number millisekunder för 1 Musiknoteringen. 380 är riktiga rytmen, men börjar med 600 är lättare att lära
variabler
flyta freq_rediese = freq_rediese0 * pow (2, oktav); frekvensen av en skarp Re i Hz, för den balanserade Oktaven
flyta freq_mi = freq_mi0 * pow (2, oktav), //frequency för en Mi i Hz, för den balanserade Oktaven
flyta freq_soldiese = freq_soldiese0 * pow (2, oktav), //frequency av en skarp Sol i Hz, för den balanserade Oktaven
int noire; //time crotchet anteckningen
int croche; //temps av en åttondel noterar
float frekvens; //frequency spelade
int sensorValue1; värdet läsa från den Accelerometer första stift
int sensorValue2; värdet läsa från den Accelerometer andra stift
int sensorValue3; värdet läsa från den Accelerometer andra stift
void setup() {
pinMode (tone1Pin, produktionen);
pinMode (highPin1, produktionen);
pinMode (highPin2, produktionen);
pinMode (lowPin1, produktionen);
pinMode (lowPin2, produktionen);
pinMode (ledOKPinGnd, produktionen);
pinMode (ledOKPinH, produktionen);
pinMode (ledNOKPinGnd, produktionen);
pinMode (ledNOKPinH, produktionen);
digitalWrite (lowPin1, låg);
digitalWrite (lowPin2, låg);
digitalWrite (highPin1, hög);
digitalWrite (highPin2, hög);
digitalWrite (ledOKPinGnd, låg);
digitalWrite (ledNOKPinGnd, låg);
}
void loop() {
Noire = temps;
croche = temps/2;
"where is my mind" är 4 * (1 mi + 1sol #); 2 * (1Beträffande # + 1sol #); 2 * (1 mi + 1/2 mi + 1 / 2re #).
för (int j = 0; j < 4; j ++) //4 * (1 mi + 1sol #)
{
frekvens = acqNote(freq_mi); får riktning mot högre acceleration från sensorn och returnerar assofrequency. Den teoretiska bra är ett Mi.
Obs (frekvens, noire); / / spelar frekvensen tillbaka på föregående rad under 1 "noire" tid.
frekvens = acqNote(freq_soldiese);
Obs (frekvens, noire);
}
för (int j = 0; j < 2; j ++) //2 * (1Beträffande # + 1sol #);
{
frekvens = acqNote(freq_rediese);
Obs (frekvens, noire);
frekvens = acqNote(freq_soldiese);
Obs (frekvens, noire);
}
för (int j = 0; j < 2; j ++) / / 2 * (1 mi + 1/2 mi + 1 / 2re #)
{
frekvens = acqNote(freq_mi);
Obs (frekvens, noire);
frekvens = acqNote(freq_mi);
Obs (frekvens, croche);
frekvens = acqNote(freq_rediese);
Obs (frekvens, croche);
}
}
void note (flyta freq, int längd)
{
Funktionen "note" spelar en anteckning på frekvens "freq" (Hz) under "varaktighet" (ms)
konvertering av frekvensen i en semi-period
dubbla semiperiod_micros =1/(double(freq)) * 1000000 * 0,5;
lång duree=long(duration);
osignerade långa en = millis();
medan (millis() < (a + duree))
{
digitalWrite (tone1Pin, hög);
delayMicroseconds(int(semiperiod_micros));
digitalWrite (tone1Pin, låg);
delayMicroseconds(int(semiperiod_micros));
}
För att avskilja anteckningar (det låter bättre), små förseningar.
om (varaktighet > 300)
{delay(15);}
annat
{delay(7);}
}
flyta acqNote(float freq_ref) {
"acqNote" blir accelerationen i 3 riktningar från sensorn, väljs den högsta och returnerar den associerade frekvensen.
Om det matchar den teoretiska bra frekvensen "freq_ref", den växlar på gröna led, annars röda ledde.
float freq;
läser båda analoga indatavärdena:
sensorValue1 = analogRead(analogInPinX);
sensorValue2 = analogRead(analogInPinY);
sensorValue3 = analogRead(analogInPinZ);
Returnerar index för max 3 värden
om ((max(max(sensorValue1,sensorValue2),sensorValue3))==sensorValue1) {
Freq = freq_rediese;
}
annars om ((max(max(sensorValue1,sensorValue2),sensorValue3))==sensorValue2) {
Freq = freq_mi;
}
annat {
Freq = freq_soldiese;
}
växlar på gröna led om frekvensen är den teoretiska bra en, annars den röda.
om (freq == freq_ref) {
digitalWrite(ledOKPinH,HIGH);
digitalWrite(ledNOKPinH,LOW);
}
annat {
digitalWrite(ledOKPinH,LOW);
digitalWrite(ledNOKPinH,HIGH);
}
om (AUTO) {
återvända freq_ref;
}
annat {
returnera freq;
}
};