Baserade Arduino Piano (3 / 4 steg)
Steg 3: programmering
När du har din krets ansluten, det är dags att ladda upp koden till Arduino, koden innehåller "pitches.h" bibliotek, så se till att du håller biblioteket i samma mapp som mappen E-Piano code.
Koden används huvudsakligen ClickButton() metoden för att bestämma vilken knapp har tryckts att spela en viss frekvens. Frekvenserna för göra Re Mi Fa Sol La Si tilldelas i matrisen melody1 []. De är inte 100 procent korrekt så du kan hålla kalibrera dem tills du får ett bättre resultat. Du kan bokföra disksystemet melody1 i kommentarerna nedan om du vill dela en bättre kalibrerad musiknoter.
Tonar metoden används för att skicka PWM till talaren, den passerar två parametrar, pin av högtalaren och tonhöjd. Du kan använda den noTone(Speaker Pin #) att avsluta eventuella anteckningar spela.
Ladda upp följande kod till Arduino att använda din E-Piano. Ska du ladda ner "pitches.h" biblioteket och hålla den i samma mapp som din kod.
/ * Utvecklats i Fablab DHAHRAN - Mado
* www.fablabdhahran.org
*
* Speciellt tack till PrinceTronics för deras SuperMarioBros tema melodi
* http://www.princetronics.com/supermariothemesong/
*/
#include "pitches.h"
#define melodyPin 3
int göra = 4.
int Re = 5;
int Mi = 6;
int Fa = 7.
int Sol = 8.
int La = 9.
int Si = 10;
int Marioo = 11;
int LED_SYNC = 13.
CONST int dröjsmål = 120;
int högtalare = 3;
int melody1 [] = {NOTE_C4, NOTE_D4, NOTE_E4,
NOTE_F4, NOTE_G4, NOTE_A4, NOTE_B4, NOTE_C5};
int melodi [] = {
NOTE_E7, NOTE_E7, 0, NOTE_E7,
0, NOTE_C7, NOTE_E7, 0,
NOTE_G7, 0, 0, 0,
NOTE_G6, 0, 0, 0,
NOTE_C7, 0, 0, NOTE_G6,
0, 0, NOTE_E6, 0,
0, NOTE_A6, 0, NOTE_B6,
0, NOTE_AS6, NOTE_A6, 0,
NOTE_G6, NOTE_E7, NOTE_G7,
NOTE_A7, 0, NOTE_F7, NOTE_G7,
0, NOTE_E7, 0, NOTE_C7,
NOTE_D7, NOTE_B6, 0, 0,
NOTE_C7, 0, 0, NOTE_G6,
0, 0, NOTE_E6, 0,
0, NOTE_A6, 0, NOTE_B6,
0, NOTE_AS6, NOTE_A6, 0,
NOTE_G6, NOTE_E7, NOTE_G7,
NOTE_A7, 0, NOTE_F7, NOTE_G7,
0, NOTE_E7, 0, NOTE_C7,
NOTE_D7, NOTE_B6, 0, 0
};
Mario main dem tempo
int tempo [] = {
12, 12, 12, 12,
12, 12, 12, 12,
12, 12, 12, 12,
12, 12, 12, 12,
12, 12, 12, 12,
12, 12, 12, 12,
12, 12, 12, 12,
12, 12, 12, 12,
9, 9, 9,
12, 12, 12, 12,
12, 12, 12, 12,
12, 12, 12, 12,
12, 12, 12, 12,
12, 12, 12, 12,
12, 12, 12, 12,
12, 12, 12, 12,
9, 9, 9,
12, 12, 12, 12,
12, 12, 12, 12,
12, 12, 12, 12,
};
Underjorden melodi
int underworld_melody [] = {
NOTE_C4, NOTE_C5, NOTE_A3, NOTE_A4,
NOTE_AS3, NOTE_AS4, 0,
0,
NOTE_C4, NOTE_C5, NOTE_A3, NOTE_A4,
NOTE_AS3, NOTE_AS4, 0,
0,
NOTE_F3, NOTE_F4, NOTE_D3, NOTE_D4,
NOTE_DS3, NOTE_DS4, 0,
0,
NOTE_F3, NOTE_F4, NOTE_D3, NOTE_D4,
NOTE_DS3, NOTE_DS4, 0,
0, NOTE_DS4, NOTE_CS4, NOTE_D4,
NOTE_CS4, NOTE_DS4,
NOTE_DS4, NOTE_GS3,
NOTE_G3, NOTE_CS4,
NOTE_C4, NOTE_FS4, NOTE_F4, NOTE_E3, NOTE_AS4, NOTE_A4,
NOTE_GS4, NOTE_DS4, NOTE_B3,
NOTE_AS3, NOTE_A3, NOTE_GS3,
0, 0, 0
};
Underwolrd tempo
int underworld_tempo [] = {
12, 12, 12, 12,
12, 12, 6,
3,
12, 12, 12, 12,
12, 12, 6,
3,
12, 12, 12, 12,
12, 12, 6,
3,
12, 12, 12, 12,
12, 12, 6,
6, 18, 18, 18,
6, 6,
6, 6,
6, 6,
18, 18, 18, 18, 18, 18,
10, 10, 10,
10, 10, 10,
3, 3, 3
};
void setup(void) {
Serial.BEGIN(9600);
pinMode (LED_SYNC, OUTPUT);
pinMode (melodyPin, produktionen); //buzzer
pinMode (, indata);
pinMode (Re, indata);
pinMode (Mi, indata);
pinMode (Fa, indata);
pinMode(Sol,INPUT);
pinMode (La, indata);
pinMode (Si, indata);
pinMode(Marioo,INPUT);
}
void loop() {
ClickButton();
}
int låten = 0;
void sjunga (int s) {
Låt = s;
om (låten == 2) {
Serial.println ("" Underworld tema"");
int storlek = sizeof(underworld_melody) / sizeof(int);
för (int thisNote = 0; thisNote < storlek; thisNote ++) {
för att beräkna noterar varaktighet, ta en sekund
dividerat med Noteringstyp.
e.g. fjärdedelsnot = 1000 / 4, åttondelen noterar = 1000/8, etc.
int noteDuration = 1000 / underworld_tempo [thisNote];
Buzz (melodyPin, underworld_melody [thisNote], noteDuration);
Ange en minsta tid mellan dem för att skilja anteckningar.
tonens längd + 30% verkar fungera bra:
int pauseBetweenNotes = noteDuration * 1,30;
Delay(pauseBetweenNotes);
stoppa tonen uppspelningen:
Buzz (melodyPin, 0, noteDuration);
}
} annat {
Serial.println ("' Mario Theme'");
int storlek = sizeof(melody) / sizeof(int);
för (int thisNote = 0; thisNote < storlek; thisNote ++) {
för att beräkna noterar varaktighet, ta en sekund
dividerat med Noteringstyp.
e.g. fjärdedelsnot = 1000 / 4, åttondelen noterar = 1000/8, etc.
int noteDuration = 1000 / tempo [thisNote];
Buzz (melodyPin, melody [thisNote], noteDuration);
Ange en minsta tid mellan dem för att skilja anteckningar.
tonens längd + 30% verkar fungera bra:
int pauseBetweenNotes = noteDuration * 1,30;
Delay(pauseBetweenNotes);
stoppa tonen uppspelningen:
Buzz (melodyPin, 0, noteDuration);
}
}
}
{Ogiltig buzz (int targetPin, lång frekvens, lång längd)
digitalWrite 13, hög.
lång delayValue = 1000000 / frekvens / 2; beräkna dröjsmål värdet mellan övergångar
1 sekund är värt mikrosekunder, dividerat med frekvensen, sedan kluvna sedan
Det finns två faser till varje cykel
lång numCycles = frekvens * längd / 1000; beräkna antalet cykler för rätt tid
multiplicera cykler frekvens, som är verkligen per sekund, med antalet sekunder för att
få det totala antalet cykler att producera
för (länge jag = 0; jag < numCycles; i ++) {/ / för den beräknade längden av tid...
digitalWrite (targetPin, hög); Skriv Summer pin hög att driva ut diaphram
delayMicroseconds(delayValue); vänta tills beräknad försening värde
digitalWrite (targetPin, låg); Skriv summern pin låg att dra tillbaka diaphram
delayMicroseconds(delayValue); vänta igen eller beräknad försening värde
}
digitalWrite 13, låg.
}
void ClickButton() {
IF(digitalRead(do) == 1) {
Serial.println("Do");
digitalWrite (LED_SYNC, hög);
tonen (högtalare, melody1[0]);
Delay(delay);
} annat if(digitalRead(Re) == 1) {
Serial.println("re");
digitalWrite (LED_SYNC, hög);
tonen (högtalare, melody1[1]);
Delay(delay);
} annat if(digitalRead(Mi) == 1) {
Serial.println("mi");
digitalWrite (LED_SYNC, hög);
tonen (högtalare, melody1[2]);
Delay(delay);
} annat if(digitalRead(Fa) == 1) {
Serial.println("FA");
digitalWrite (LED_SYNC, hög);
tonen (högtalare, melody1[3]);
Delay(delay);
} annat if(digitalRead(Sol) == 1) {
Serial.println("Sol");
digitalWrite (LED_SYNC, hög);
tonen (högtalare, melody1[4]);
Delay(delay);
} annat if(digitalRead(La) == 1) {
Serial.println("La");
digitalWrite (LED_SYNC, hög);
tonen (högtalare, melody1[5]);
Delay(delay);
} annat if(digitalRead(Si) == 1) {
Serial.println("si");
digitalWrite (LED_SYNC, hög);
tonen (högtalare, melody1[6]);
Delay(delay);
} annat if(digitalRead(Marioo) == 1) {
Serial.println("marioo");
digitalWrite (LED_SYNC, hög);
Sing(1);
Sing(2);
Delay(delay);
} annat {
digitalWrite (LED_SYNC, låg);
noTone(Speaker);
}
}