// deal with first piezo, this is kind of a hack
val = analogRead(piezoAPin);
if( val >= PIEZOTHRESHOLD ) {
t=0;
while(analogRead(piezoAPin) >= PIEZOTHRESHOLD/2) {
t++;
}
noteOn(drumchan,note_hihatopen, t*2);
delay(t);
noteOff(drumchan,note_hihatopen,0);
}
là il s'agit d'estimer la force de frappe en fonction du temps (t) que met l'onde à redescendre
ce que je trouve peu logique car on aura plutôt une notion de la fréquence que de la vélocité
d'ailleurs dans mes tests c'est vraiment pas convainquant
mais je crois que mon problème vient surtout d'un manque de sensibilité
sur le duemilanove en ne branchant qu'un piezo avec sa résistance les chocs électriques que j'envoie oscillent généralement entre 1 et 20 (sur 1024) et ça fonctionne (c'est léger parce que je ne tape pas directement le buzzer mais la partie en bois sur laquelle il est collée)
mais sur le bluetooth j'ai du bruit et continuellement des valeurs entre 0 et 10 ce qui m'empêche de réduire le threshold en dessous de 10, du coup très peu de sensibilité
à mon avis arduino ne capte pas bien le signal alternatif envoyé par le piezo, pas suffisamment bien pour proposer une courbe de réponse correcte en fonction de la vélocité en tout cas
donc l'idée serait (dans l'ordre) d'amplifier, de redresser et de lisser ce signal électrique :
avec le lm358 il reste un ampli libre pour un 2e piezo
ya surement d'autres puces avec un seul ampli
je suis en train de bosser sur le code
pour l'instant ça marche à peu près avec
const int piezo_0 = 0;
const int threshold = 5;
int sensorReading_0 = 0;
int newReading_0 = 0;
int previousReading_0 = 0;
void setup() {
//Serial.begin(115200); // bluetooth
Serial.begin(9600); // usb
}
void loop() {
sensorReading_0 = analogRead(piezo_0);
if(sensorReading_0 >= threshold && sensorReading_0 > previousReading_0 + 8) {
// vérifie que l'intensité electrique soit superieur au seuil et qu'elle ne soit pas en chute
delayMicroseconds(200); // pic du signal 0.2 ms apres le déclenchement
newReading_0 = analogRead(piezo_0);
Serial.print("/piezo_0/");
Serial.println(newReading_0);
previousReading_0 = newReading_0;
}
else {
previousReading_0 = sensorReading_0;
}
}
mais ça manque encore un peu de sensibilité en ce qui me concerne...
(pour un drumkit je pense que ça va très bien)
comment je pourrais augmenter le coefficient d'amplification sur ce montage ?
j'ai essayé en modifiant des résistances un peu au pif mais je n'arrive à rien de concluant...
la seule solution serait p-e d'utiliser l'ampli resté libre sur lm358 ?
après une nuit d'essai j'arrive à une sensibilité maximale et un minimum de false trigger en changeant ces resistances :
R1 -> 5k
R2 -> 55k
R3 -> 3M
code utilisé :
const int piezo_0 = 0;
const int piezo_1 = 1;
const int position_2 = 2;
const int position_3 = 3;
const int position_4 = 4;
const int threshold = 80;
int triggerValue_0 = 0;
int previousValue_0 = 0;
int peakValue_0 = 0;
int delay_0 = 0;
int now = 0;
void setup() {
//Serial.begin(115200); // bluetooth
Serial.begin(9600); // usb
}
void loop() {
now = millis();
if (delay_0 < now - 60){
triggerValue_0 = analogRead(piezo_0);
if(triggerValue_0 >= threshold && triggerValue_0 > previousValue_0 + 2) {
delayMicroseconds(230);
peakValue_0 = analogRead(piezo_0);
/*Serial.print("/previousValue/");
Serial.print(previousValue_0);
Serial.print(" /triggerValue/");
Serial.print(triggerValue_0);
Serial.print(" /peakValue/");
Serial.println(peakValue_0);*/
if(peakValue_0 >= threshold && peakValue_0 > previousValue_0 + 2){
Serial.print("/piezo_0/");
Serial.println(peakValue_0);
delay_0 = millis();
previousValue_0 = peakValue_0;
}
else {
previousValue_0 = triggerValue_0;
}
}
else {
previousValue_0 = triggerValue_0;
}
}
}
le piezo collé sous la table ça marche très bien en tapotant légèrement du bout des doigts
la réponse en vélocité va de 80 à 640
on peut surement faire mieux mais vu le peu d'info à ce sujet je suis assez content
(à mon avis cette solution est vachement meilleure que le midi drumkit)