Guitar Tuner för blinda (med en Arduino) (6 / 8 steg)
Steg 6: Programpunkt - Arduino kod
December 2012
Kod skriven för MAPPA: www.remap.org.uk A välgörenhet som producerar skräddarsydd utrustning för funktionshindrade personer.
Kod för att använda en Arduino för att skapa en gitarr tuner lämpar sig för användning med blinda
Gitarr tuner modifierad var en kerub WST-550
Använda, kopiera, ändra, förbättra koden alla du gillar, inga garantier men... Bra lycka till / ha kul...
Detta anger egenskaperna för den feedback tonen.
#define NOTE_FLAT 93 / / tonen spelade när en platt Obs upptäcks: G platta
#define NOTE_SHARP 887 / / tonen spelade när en skarp Obs upptäcks: D skarp
#define NOTE_6E 105 / / tonen spelade när en 6E upptäcks (men tonen är faktiskt E4)
#define NOTE_5A 157 / / tonen spelade när en 5A upptäcks (men tonen är faktiskt A3)
#define NOTE_4D 235 / / tonen spelade när en 4D upptäcks (men tonen är faktiskt D3)
#define NOTE_3G 352 / / tonen spelade när en 3G upptäcks (men tonen är faktiskt G2)
#define NOTE_2B 559 / / tonen spelade när en 2B upptäcks (men tonen är faktiskt B1)
#define NOTE_1E 837 / / tonen spelade när en 1E upptäcks (men tonen är faktiskt E1)
#define NOTE_DURATION 300 / / hela tiden i millisekunder hur länge tonen spelas vid start eller när du väljer en sträng
#define NOTE_DELAY1 200 / / tid där emellan feedback Piper
#define NOTE_DUR2 400 / / hur länge tonen spelade när en i tune sträng upptäcks
Mata in stift för läsning från noten lysdioder
int p6E = 7. PIN ansluten till 6E LED
int p5A = 6; PIN ansluten till 5A LED
int p4D = 5; PIN ansluten till 4D LED
int p3G = 4; PIN ansluten till 3G LED
int p2B = 3; PIN ansluten till 2B LED
int p1E = 2; PIN ansluten till 1E LED
Mata in stift för läsning från tune lysdioder
int p40 = 11; PIN ansluten till dioderna som kombinerar + 50 och + 40 lampor
int p30 = 12. PIN ansluten till de + 30 LED
int p20 = 13. PIN ansluten till de + 20 LED
int p10 = 14. (Analog stift 0) Pin ansluten till de + 10 LED
int tune = 15. (Analog pinne 1) Pin ansluten till 0 LED
int n10 = 16. (Analog pin 2) Pin ansluten till de -10 LED
int n20 = 18; (Analog pinne 4) Pin ansluten till de -20 LED
int n30 = 17; (Analog pin 3) Pin ansluten till de -30 LED
int n40 = 19. (Analoga pin 5) Pin ansluten till dioderna som kombinerar-40 och -50 lysdioder
Andra stift
int spkr = 10; Utgångsstiftet som ansluter till hörlurarna via ett motstånd (högsta värde som fortfarande ger ett högt nog utgång).
int knappen = 9. Ingångsstift som ansluter till knappen Välj sträng.
int platt = 8. Mata in Pin som känner av om tunern är i halvton läge?
Variabler
int offset = 0; Hur långt ostämd strängen är, till exempel om -30 lyser denna variabelns värde kommer att -40.
int Obs = 0; Variabel till posten som Obs var upptäckt 1 = 1E, 2 = 2B, 3 = 3 G, 4 = 4 D, 5 = 5A, 6 = 6E.
int noteSelect = 0; Här lagras som sträng har valts om den sträng som läget är i använda 0 = off.
int lastOffset = 0; Tidigare förskjutningen sett.
int lastNote = 0; Föregående not sett.
void setup() {
Serial.BEGIN(9600); För felsökning
Ställ in pinkodsskydd lägen
pinMode(p6E,INPUT);
pinMode(p5A,INPUT);
pinMode(p4D,INPUT);
pinMode(p3G,INPUT);
pinMode(p2B,INPUT);
pinMode(p1E,INPUT);
pinMode(p40,INPUT);
pinMode(p30,INPUT);
pinMode(p20,INPUT);
pinMode(p10,INPUT);
pinMode(tune,INPUT);
pinMode(n10,INPUT);
pinMode(n20,INPUT);
pinMode(n30,INPUT);
pinMode(n40,INPUT);
pinMode(flat,INPUT);
pinMode(spkr,OUTPUT);
pinMode(button,INPUT);
digitalWrite(button,HIGH);
Spela några toner på start upp till användaren veta tuner fungerar.
tonen (spkr, NOTE_1E, NOTE_DURATION);
Delay(NOTE_DELAY1);
tonen (spkr, NOTE_2B, NOTE_DURATION);
Delay(NOTE_DELAY1);
tonen (spkr, NOTE_3G, NOTE_DURATION);
Delay(NOTE_DELAY1);
tonen (spkr, NOTE_4D, NOTE_DURATION);
Delay(NOTE_DELAY1);
tonen (spkr, NOTE_5A, NOTE_DURATION);
Delay(NOTE_DELAY1);
tonen (spkr, NOTE_6E, NOTE_DURATION);
Delay(800);
Kontrollera om tunern är i halvton tuning mode. Om det är, spela några fler toner
IF(digitalRead(flat) == 0) {
Serial.println ("halvton läget är på");
tonen (spkr, NOTE_FLAT, 500);
Delay(800);
tonen (spkr, NOTE_FLAT, 500);
Delay(800);
tonen (spkr, NOTE_FLAT, 500);
Delay(800);
tonen (spkr, NOTE_FLAT, 500);
Delay(800);
}
}
void loop() {
lastOffset = offset;
lastNote = Obs;
ButtonV(); Kontrollera om knappen trycks.
NotesV(); Kontrollera om alla strängar kan höras
OffsetsV(); / / se hur ut av tune strängarna är
om (Obs! = 0) {/ / om en sträng har upptäckts
om (noteSelect == 0 || noteSelect == Obs) {/ / kolla om en sträng är trimmad
IF(Note == lastNote) {/ / kontrollera att läsningen har stabiliserats ett tag (dvs. två upprepa läsningar)
IF(offset == lastOffset) {/ / kontrollera behandlingen har stabiliserats
Output(); Ge ljud-feedback
}
}
}
}
Delay(200);
}
void Output() {/ / en anteckning har upptäckts så tid för att ge lite feedback
Delay(100);
Ton för att visa vilka Obs
IF(Note == 1) {
tonen (spkr, NOTE_1E, NOTE_DUR2);
}
IF(Note == 2) {
tonen (spkr, NOTE_2B, NOTE_DUR2);
}
IF(Note == 3) {
tonen (spkr, NOTE_3G, NOTE_DUR2);
}
IF(Note == 4) {
tonen (spkr, NOTE_4D, NOTE_DUR2);
}
IF(Note == 5) {
tonen (spkr, NOTE_5A, NOTE_DUR2);
}
IF(Note == 6) {
tonen (spkr, NOTE_6E, NOTE_DUR2);
}
Delay(100);
Ton för att ge feedback på hur kraftiga eller platta.
om (offset > 1 || förskjutningen < 0) {
offset = offset * 5.
om (offset < 0) {
offset = offset *-1;
tonen (spkr, NOTE_FLAT, offset);
Delay(250);
tonen (spkr, NOTE_FLAT, offset);
Delay(250);
tonen (spkr, NOTE_FLAT, offset);
Delay(250);
}
annat {
tonen (spkr, NOTE_SHARP, offset);
Delay(250);
tonen (spkr, NOTE_SHARP, offset);
Delay(250);
tonen (spkr, NOTE_SHARP, offset);
Delay(250);
}
}
annat {/ / vad man spelar om strängen finns i finjustera
IF(Note == 1) {
tonen (spkr, NOTE_1E, NOTE_DUR2);
}
IF(Note == 2) {
tonen (spkr, NOTE_2B, NOTE_DUR2);
}
IF(Note == 3) {
tonen (spkr, NOTE_3G, NOTE_DUR2);
}
IF(Note == 4) {
tonen (spkr, NOTE_4D, NOTE_DUR2);
}
IF(Note == 5) {
tonen (spkr, NOTE_5A, NOTE_DUR2);
}
IF(Note == 6) {
tonen (spkr, NOTE_6E, NOTE_DUR2);
}
Delay(400);
}
}
void ButtonV() {/ / kolla om en sträng som väljs.
IF(digitalRead(Button) == 0) {/ / Läs knappen
noteSelect ++; Increment Obs valt tryck på varje knapp
IF(noteSelect == 7) {/ / toner att spela om alla anteckningar har cyklat igenom dvs tillbaka till normalläge
noteSelect = 0;
tonen (spkr, NOTE_6E, NOTE_DURATION);
Delay(NOTE_DELAY1);
tonen (spkr, NOTE_5A, NOTE_DURATION);
Delay(NOTE_DELAY1);
tonen (spkr, NOTE_4D, NOTE_DURATION);
Delay(NOTE_DELAY1);
tonen (spkr, NOTE_3G, NOTE_DURATION);
Delay(NOTE_DELAY1);
tonen (spkr, NOTE_2B, NOTE_DURATION);
Delay(NOTE_DELAY1);
tonen (spkr, NOTE_1E, NOTE_DURATION);
Delay(NOTE_DELAY1);
}
IF(noteSelect > 0) {/ / toner leka som noterna är cyklade genom
tonen (spkr, NOTE_1E, NOTE_DURATION);
Delay(NOTE_DELAY1);
}
om (noteSelect > 1) {
tonen (spkr, NOTE_2B, NOTE_DURATION);
Delay(NOTE_DELAY1);
}
om (noteSelect > 2) {
tonen (spkr, NOTE_3G, NOTE_DURATION);
Delay(NOTE_DELAY1);
}
om (noteSelect > 3) {
tonen (spkr, NOTE_4D, NOTE_DURATION);
Delay(NOTE_DELAY1);
}
om (noteSelect > 4) {
tonen (spkr, NOTE_5A, NOTE_DURATION);
Delay(NOTE_DELAY1);
}
om (noteSelect > 5) {
tonen (spkr, NOTE_6E, NOTE_DURATION);
Delay(NOTE_DELAY1);
}
}
}
void OffsetsV() {/ / läser i storleksordningen lysdioder och sätter behandlingen i den variabla offseten
offset = 0;
IF(digitalRead(P40) == 0) {
Serial.println("P40");
offset = 40;
}
IF(digitalRead(P30) == 0) {
Serial.println("P30");
offset = 30.
}
IF(digitalRead(P20) == 0) {
Serial.println("P20");
offset = 20;
}
IF(digitalRead(P10) == 0) {
Serial.println("P10");
offset = 10;
}
IF(digitalRead(Tune) == 0) {
Serial.println("Tune");
offset = 1;
}
IF(digitalRead(N40) == 0) {
Serial.println("N40");
offset = -40;
}
IF(digitalRead(N30) == 0) {
Serial.println("N30");
offset = -30;
}
IF(digitalRead(N20) == 0) {
Serial.println("N20");
offset = -20;
}
IF(digitalRead(N10) == 0) {
Serial.println("N10");
offset = -10;
}
}
void NotesV() {//Reads Obs lysdioder och butiker resultaten i variabeln Obs
Obs = 0;
IF(digitalRead(p6E) == 0) {
Serial.println("p6E");
Obs = 6;
}
IF(digitalRead(p5A) == 0) {
Serial.println("p5A");
Obs = 5;
}
IF(digitalRead(p4D) == 0) {
Serial.println("p4D");
Obs = 4;
}
IF(digitalRead(p3G) == 0) {
Serial.println("p3G");
Obs = 3;
}
IF(digitalRead(p2B) == 0) {
Serial.println("p2B");
Obs = 2;
}
IF(digitalRead(p1E) == 0) {
Serial.println("p1E");
Obs = 1;
}
}