Stap 10: Arduino en Piezo Sensor
Piëzo sensoren schakelen druk of trillingen in de elektrische lading die kan worden gemeten met behulp van één van de analoge ingangen van de Arduino. Het circuit vereist een 1MOhm weerstand wired parallel aan de piëzo-sensor, met één zijde aangesloten tog ronde, en de andere verbinding het analoge pin van een Arduino (afbeelding #1 hierboven). Controleren van de sensor met de volgende code:
int piezo = A0; void setup(){ Serial.begin(9600); } void loop(){ int piezoVal = analogRead(piezo); Serial.println(piezoVal); }
Ik zag dat mijn piëzo-sensor stabiel over over 0-1 normaal was, dan toen ik het raakte, het sprong tot ongeveer 150 (afbeelding #2 hierboven). We kunnen de piezo zoals een schakelaar gebruiken door te kijken naar deze spikes, in de onderstaande code ik maak een notitie van de MIDI telkens de piezo-pin meet een signaal meer dan 50.
int noteOn = 144; int piezo = A0; int threshold = 50;//anything over fifty means we've hit the piezo void setup(){ Serial.begin(9600); } void loop(){ int piezoVal = analogRead(piezo); if (piezoVal>threshold){ MIDImessage(noteOn, 60, 127); delay(300); MIDImessage(noteOn, 60, 0); } } //send MIDI message void MIDImessage(byte command, byte data1, byte data2) { Serial.write(command); Serial.write(data1); Serial.write(data2); }
We kunnen ook de kracht van de hit aan controle snelheid gebruiken:
int noteOn = 144; int piezo = A0; int threshold = 50;//anything over fifty means we've hit the piezo void setup(){ Serial.begin(9600); } void loop(){ int piezoVal = analogRead(piezo); if (piezoVal>threshold){ int maxPiezoVal = getMaxVal(piezoVal); byte velocity = map(maxPiezoVal, 0, 1023, 50, 127);//velocity between 50 and 127 based on max val from piezo MIDImessage(noteOn, 60, velocity); delay(500); MIDImessage(noteOn, 60, 0); } } //send MIDI message void MIDImessage(byte command, byte data1, byte data2) { Serial.write(command); Serial.write(data1); Serial.write(data2); } int getMaxVal(int lastVal){ int currentVal = analogRead(piezo); while (currentVal>lastVal){ lastVal = currentVal; currentVal = analogRead(piezo); } return lastVal; }
In de code hierboven, ik heb een helper functie genaamd getMaxVal dat gebruik een while lus te registreren van de maximale verplaatsing van het piezo, zodat het kan worden gebruikt om de snelheid van een MIDI opmerking gemaakt. Deze code werkt door het meten van de piëzo en controleren om te zien of de meting hoger dan de laatste opgenomen meting, is als het dan we vasthouden aan de nieuwe meting, en herhaal het proces. Zodra de nieuwe meting van de piezo lager dan de laatste opgenomen meting is, weten we dat de piezo max verschuiving heeft bereikt en het blijven zal om terug te keren en lager nummers van analogRead(), zodat de functie de max waarde retourneert.
Het getal dat wordt geretourneerd uit getMaxVal() ligt ergens tussen 0 en 1023, dus ik een map()-functie gebruikte aan schaal het aan een snelheid tussen de 50 en 127.