Ultrasonic Piano (3 / 6 steg)
Steg 3: Programmering av Edison
Detta projekt använder en kombination av Arduino för övervakning av sensorer och Edison's Linux-miljö för att spela ljud.
Använda FTP för att skapa en mapp från roten kallas Piano - och ladda upp ett prov som du vill att varje sensor att spela - anteckningarna kan vara att spela en samtidigt - så välj anteckningar från samma instrument - eller inte - ditt samtal...
Dessa gratis piano prover användes för ljud:
www.Freesound.org/People/pinkyfinger/Packs/4409
All kod programmeras med hjälp av Arduino IDE
Koden kan hittas här: UltrasonicPiano på GitHub
Koden är följande:
#define HAND_MUST_MOVE_DISTANCE 200 //in oss ping tid i tar vi som något nära
#define MAXECHOTIME 1000 / / beräkna den maximala distansen i oss (ingen avrundning).
#define DEBOUNCEmS 500 / / millsec innan du kan spela en andra anmärkning på nyckeln
#define MIN_DISTANCE 2 / under denna tid i oss medel antingen ingenting eller för nära - nära
#define TRIGPIN 13 / / alla sonics ansluten till en PIN-kod
#define MAX_SENSOR_DELAY 500 / / maximalt oss det tar för sensorn att starta ping
#define SONAR_NUM 9 / / antal detektorer
#define SOUND_BANK_PIN 12 / / knappen Växla ljud banker
Stiften ekolodet är kopplad till
int sonar [SONAR_NUM] =
{
2, 3, 4, 5, 6, 7, 8, 9, 10
};
int resultatet [SONAR_NUM];
int previousHits [SONAR_NUM];
lång lasttime [SONAR_NUM];
int soundBank = låg; Två ljud bank val - gitarr och piano
9 prover (måste vara wav om du inte har installerat valfri mp3 bibliotek på edison)
Några gratis prover kan jag här: www.freesound.org/people/pinkyfinger/packs/4409
WAV-filer behöver placeras i mappar på edison (Använd FTP) som anges nedan.
Den avslutande & är viktigt
char * ljud [] =
{
"aplay /home/root/piano/00_piano-g.wav &",
"aplay /home/root/piano/01_piano-a.wav &",
"aplay /home/root/piano/03_piano-b.wav &",
"aplay /home/root/piano/05_piano-c.wav &",
"aplay /home/root/piano/06_piano-d.wav &",
"aplay /home/root/piano/08_piano-e.wav &",
"aplay /home/root/piano/09_piano-f.wav &",
"aplay /home/root/piano/10_piano-f.wav &",
"aplay /home/root/piano/11_piano-g.wav &"
};
9 alternativa prover
char * sounds2 [] =
{
"aplay /home/root/guitar/1.e.wav &",
"aplay /home/root/guitar/2.f.wav &",
"aplay /home/root/guitar/3.g.wav &",
"aplay /home/root/guitar/4.a.wav &",
"aplay /home/root/guitar/5.b.wav &",
"aplay /home/root/guitar/6.d.wav &",
"aplay /home/root/guitar/7.e2.wav &",
"aplay /home/root/guitar/8.f2.wav &",
"aplay /home/root/guitar/9.b.wav &"
};
void setup() {
Serial.BEGIN(115200);
Serial.println("Start");
för (int n = 0; n < SONAR_NUM; n ++)
{//Out tid börjar
int ECHOPIN = ekolod [n];
pinMode (ECHOPIN, INPUT_FAST);
}
pinMode (TRIGPIN, OUTPUT_FAST);
pinMode(12,INPUT_PULLUP);
}
void ping()
{
för (int n = 0; n < SONAR_NUM; n ++)
resultatet [n] = 0; 0 för inget resultat
digitalWrite (TRIGPIN, låg);
delayMicroseconds(2); Vänta tills pin att gå lågt. (prova 4 om har problem)
digitalWrite (TRIGPIN, hög); Skicka en ping.
delayMicroseconds(10); Vänta för sensorn att läsa den. Sensor specifikationer säga vänta 10uS.
digitalWrite(TRIGPIN,LOW); Ställa in avtryckaren pin tillbaka till låg.
lång timeoutTime;
vänta på ping att starta
#ifdef true
Enkelt sätt
delayMicroseconds(500); de flesta detektorer ta om 450uS till 500uS
SRF06 kan ta mycket mycket längre.
#else
använda detta för de långsammare sonar detektorerna
timeoutTime = micros() + MAXECHOTIME + MAX_SENSOR_DELAY;
för (int n = 0; n < SONAR_NUM; n ++)
{
int ECHOPIN = ekolod [n];
Tidigare ping klar inte, avbryta.
IF(digitalRead(ECHOPIN) == hög)
resultatet [n] = -1; "Inget svar"
}
för (int n = 0; n < SONAR_NUM; n ++)
{
om (result[n]==0)
{
int ECHOPIN = ekolod [n];
Vänta på ping att starta.
While(digitalRead(ECHOPIN) == låg)
om (micros() > timeoutTime)
{
resultatet [n] = -2; "Alltför länge till Start"
bryta;
}
}
}
#endif
långa startTime = micros();
timeoutTime = startTime + MAXECHOTIME; Ping började, timeout.
booleska bExit;
göra
{
bExit = sant;
för (int n = 0; n < SONAR_NUM; n ++)
{
om (result[n]==0)
{
int ECHOPIN = ekolod [n];
IF(digitalRead(ECHOPIN) == låg) / / ping slut echo
resultatet [n] = (int)((micros() - startTime) +. 05);
Dont bry calc avstånd - ping är tillräckligt för oss.
annars om (micros() > timeoutTime)
resultatet [n] = -3;
spela in fel om vi bortom set maxavståndet.
bExit = false;
}
}
} while(bExit == false);
}
void loop()
{
ping();
Allt gjort - display
för (int n = 0; n < SONAR_NUM; n ++)
{
flyta dist = resultat [n]; i tid
om (dist < = MIN_DISTANCE)
{//person är för nära eller har gått bort
previousHits [n] = dist; återställa
fortsätta;
}
int tidigare = previousHits [n];
om (abs (dist - tidigare) > HAND_MUST_MOVE_DISTANCE)
{//New nedtryckt!
previousHits [n] = dist;
länge nu = millis();
om ((nu - lasttime[n]) > DEBOUNCEmS) //debounce 333mS
{
char * ljud = soundBank == låg? ljud [n]: sounds2 [n];
Serial.println(Sound);
system(Sound);
}
lasttime [n] = nu;
}
}
om (digitalRead(12) == låg)
{//Switch till andra band - har settle tid.
soundBank =! soundBank;
Serial.Print(soundBank);
fördröjning (1000); //debounce
}
Delay(20);
}