Arduino, sensorer och MIDI- (10 / 16 steg)
Steg 10: Arduino och Piezo-Sensor
Piezo sensorer Aktivera tryck eller vibrationer i elektrisk laddning som kan mätas med hjälp av en av den Arduino analoga ingångar. Banan kräver en 1MOhm resistor wired parallellt med piezo-sensor, med sidan ansluten tog rundan, och andra anslutna på en Arduino analoga stift (bild #1 ovan). Övervaka sensor använder följande kod:
int piezo = A0;
void setup() {
Serial.BEGIN(9600);
}
void loop() {
int piezoVal = analogRead(piezo);
Serial.println(piezoVal);
}
Jag såg att min piezo-sensor var stabil om om 0-1 normalt, sedan när jag träffade den, det hoppade upp till ca 150 (bild #2 ovan). Vi kan använda piezo som en switch genom att söka efter dessa spikar, jag skapa ett MIDI-meddelande varje gång piezo pin mäter en signal över 50 i koden nedan.
int noteOn = 144;
int piezo = A0;
int tröskel = 50, //anything över femtio innebär att vi har drabbats av piezo
void setup() {
Serial.BEGIN(9600);
}
void loop() {
int piezoVal = analogRead(piezo);
om (piezoVal > tröskel) {
MIDImessage (noteOn, 60, 127);
Delay(300);
MIDImessage (noteOn, 60, 0);
}
}
skicka MIDI-meddelande
void MIDImessage (byte kommando, byte data1, byte data2) {
Serial.write(Command);
Serial.write(Data1);
Serial.write(data2);
}
Vi kan också använda styrkan av hit till kontroll velocity:
int noteOn = 144;
int piezo = A0;
int tröskel = 50, //anything över femtio innebär att vi har drabbats av piezo
void setup() {
Serial.BEGIN(9600);
}
void loop() {
int piezoVal = analogRead(piezo);
om (piezoVal > tröskel) {
int maxPiezoVal = getMaxVal(piezoVal);
byte hastighet = karta (maxPiezoVal, 0, 1023, 50, 127); //velocity mellan 50 och 127 baserat på max val från piezo
MIDImessage (noteOn, 60, velocity);
Delay(500);
MIDImessage (noteOn, 60, 0);
}
}
skicka MIDI-meddelande
void MIDImessage (byte kommando, byte data1, byte data2) {
Serial.write(Command);
Serial.write(Data1);
Serial.write(data2);
}
int getMaxVal (int lastVal) {
int currentVal = analogRead(piezo);
medan (currentVal > lastVal) {
lastVal = currentVal;
currentVal = analogRead(piezo);
}
återvända lastVal;
}
I koden ovan skapade jag en hjälpare funktion kallas getMaxVal att använder ett tag loop för att registrera piezo, max deplacement så att det kan användas för att ange hastigheten hos en MIDI Observera. Denna kod fungerar genom att mäta piezo och kontroll för att se om mätningen är större än den senaste inspelade mätningen, om det är då vi hålla fast vid den nya mätningen och upprepa processen. Så snart nya mätningen från piezo är lägre än den senaste inspelade mätningen, vet vi att piezo har nått sitt max deplacement och det kommer att fortsätta att återvända lägre och lägre nummer från analogRead(), så funktionen returnerar max värdet.
Tal som returneras från getMaxVal() är någonstans mellan 0 och 1023, så jag använde en map() funktion för att skala upp det till en hastighet mellan 50 och 127.