Problème capteur piezo aucune valeur

Bonjour,

J'ai fait le montage Knock, qui se trouve dans les exemples d'arduino, mais, impossible d'avoir 1 seul "knock", et lorsque je regarde les valeurs sur le serial monitor, je n'ai que des 0 quoi que je fasse sur le capteur.

J'ai essayé sur d'autres entrées, j'ai essayé avec un autre capteur, ça ne change rien, j'ai bien mis une résistance 1Mohm en parallèle, c'est peut-être un peu trop fort ?

Lorsque je teste le capteur avec un multimètre j'ai 0 V par contre si je branche le capteur sur une enceinte (ce sont des petits capteurs type micro contact de guitare : https://www.thomann.de/fr/harley_benton_hbt.htm, j'ai du son (un signal faible, mais non nul).

Avez-vous une idée ?
Question bonus : Je cherche à capter les vibrations que fait un crayon sur une feuille afin de transformer les données en midi, pour pouvoir déclencher des sons, quel est le capteur de vibrations le plus adapté pour cela ?

Bon, finalement, j'arrive à avoir des valeurs non nulles, (je ne sais pas trop comment j'ai corrigé le problème, peut-être y avait-il un faux contact dans les connexions) mais c'est pas très sensible, il faut vraiment taper fort sur le piezo, et le maximum que j'ai obtenu c'est 63...

Bonjour,
Je ne connais pas le montage Knock,
Les capteurs piezo délivrent une faible tension qu'il faut amplifier en principe.
Je pense que ton problème est là ?
D'autant que pour capter les vibrations que fait un crayon sur une feuille il faudra trouver "la bonne" position et le "bon" principe de captage du son.
Pour le mieux, le crayon devrait agir mécaniquement sur le capteur à mon avis ?
L'idéal serait d'utiliser un oscilloscope pour visualiser l'amplitude du signal.

Oui effectivement, je pense qu’il faudrait amplifier le signal.
Pour le capteur, j’ai vu des capteurs de vibration grove,
https://www.gotronic.fr/art-capteur-de-vibrations-101020031-20075.htm#complte_desc
est-ce que ça marcherait mieux ?

Bonjour
Je ne suis pas sur que le micro-guitare présenté ne soit In fine qu'un disque piezo , il est très vraisemblable qu'il y ait aussi un circuit d'adaptation pour rentrer sur la voie de mixage..

pour "jouer" avec arduino , il faut utiliser simplement des disques piezo avec une R 1M en //

Non

Ah bon, pourquoi ?

BP limitée à 180 Hz

un capteur de force, pourrait-il faire l’affaire ?

J’ai trouvé ce schéma sur internet pour amplifier le signal d’un capteur piezo : http://davidhoulding.blogspot.com/2014/02/high-sensitivity-vibration-sensor-using.html

Qu’en pensez-vous ?

bonjour
si c'est juste pour faire un drumpad
dans ce genre là

ne cherche pas midi à quatorze heures
achete un lot comme comme çà

Non, c’est pour détecter des choses beaucoup plus fines, des pinceaux, brosses, crayons, des frottements, pour les convertir en valeurs midi. J’ai déjà des capteurs piezo, mais ce n’est pas assez sensibles…
Peut-être que le piezo, n’est pas l’ideal pour ça, mais je ne vois pas trop quoi utiliser d’autres…

ok
Il faut penser à cannibaliser et/ou detourner des capteurs dont ce n'est pas la fonction première,
I.e que j'ai déjà pratiqué : dessoser un capteur de pression pour acceder à sa "membrane sensible" , ou utiliser la membrane d'un simple micro (frottements) et conditionner son signal.

La seule limite là, je dirais que c'est l'imagination

Bon, j'ai réussi à amplifier le signal du piezo à l'aide de ce lien : http://www.sonelec-musique.com/electronique_realisations_detecteur_impulsion_mecanique_001.html
en faisant ce montage :


J'ai juste changé les valeurs des résistances R1 et R2 (R1 100k au lieu de 10k, et R2 5k au lieu de 10k), le capteur détecte très bien les frottements, tapotements, etc...
Maintenant J'aimerais bien que l'arduino envoie des valeurs midi différentes suivant l'intensité du frottements, c'est à dire, par ex, envoyer une note midi si la valeur max du capteur est 100, une note différente si la valeur max atteint 200, etc... Le souci, c'est que si la valeur max atteint 200, ensuite elle redescend et va déclencher d'autres notes... Comment coder ça, en calculant une moyenne sur un certains nombres de mesures ?

nonjour
Ton capteur renvoie donc (en théorie) une valeur comprise entre 0 et 1023 (CAD 10 bits)
La norme midi1 (la plus répandue aujourd'hui) code les notes entre 0 et 127

ce que tu dois faire dans un premier temps pour jouer

mapper 0/1023 vers 0/127
jouer la note(ON) resultant du MAP pendant un delay x
faire un note(off)

Non, mon problème n'est pas de mapper les valeurs, mais de déclencher un événement midi en fonction de la valeur max atteinte à un moment donné.
Par ex : je frotte doucement le capteur (valeur entre 50 et 100) ça envoie un do, je frotte plus fort (valeur entre 100 et 200) ça envoie un ré, etc...

Le souci, c'est que lorsque la valeur arrive à 200 (par ex), ensuite elle redescend jusqu'à 0, et du coup elle va aussi déclencher les autres notes.

Principe de base : en Midi une note(ON) DOIT etre comprise entre 0 et 127 , elle ne peut donc être de 200 et comme 200 est > 127 ta trame MIDI n'est pas conforme.

poste ton code

200 c'est la valeur renvoyé par le capteur, pas la note midi, et après elle est mappé pour correspondre à la norme midi, évidemment.

exemple de code :

#include <midi_serialization.h>
#include <usbmidi.h>
#include <Bounce2.h>


// See midictrl.png in the example folder for the wiring diagram,
// as well as README.md.
int sensorValue;
int inter;
// variable to calibrate low value
int sensorLow = 60;
// variable to calibrate high value
int sensorHigh = 700;
const int interPin = 2;

void sendCC(uint8_t channel, uint8_t control, uint8_t value) {
  USBMIDI.write(0xB0 | (channel & 0xf));
  USBMIDI.write(control & 0x7f);
  USBMIDI.write(value & 0x7f);
}

void sendNote(uint8_t channel, uint8_t note, uint8_t velocity) {
  USBMIDI.write((velocity != 0 ? 0x90 : 0x80) | (channel & 0xf));
  USBMIDI.write(note & 0x7f);
  USBMIDI.write(velocity & 0x7f);
}

void setup() {
  //touch.attach( touchPin, INPUT);
  //touch.interval(5);
  //Serial.begin(9600);
  pinMode(interPin, INPUT_PULLUP);
  
}

void loop() {
  //Handle USB communication
  USBMIDI.poll();

  while (USBMIDI.available()) {
    // We must read entire available data, so in case we receive incoming
    // MIDI data, the host wouldn't get stuck.
    u8 b = USBMIDI.read();
  }
 

  inter = digitalRead(interPin);
  if (inter == LOW) {
    sensorValue = analogRead(A0);
    Serial.println(sensorValue);
    //Serial.println(sensorValue);
    if (sensorValue > sensorLow && sensorValue < 150 ) {
      sendNote(0, 64, 120);
      delay(10);
    }
    else if (sensorValue > 150 && sensorValue < 300 ) {
      sendNote(0, 66, 120);
      delay(10);
      }
      else if (sensorValue > 300 && sensorValue < 600 ) {
      sendNote(0, 68, 120);
      delay(10);
      }
      else {
         for ( int i = 50; i < 101; ++i) {
        sendNote(0, i, 0);
        delay(1);
      }
        
    }

  }
  else {
    for ( int i = 50; i < 101; ++i) {
        sendNote(0, i, 0);
        delay(1);
      }

  }


  // Flush the output.
  USBMIDI.flush();
}

avec ce code si la valeur du capteur atteint 500, ça va déclencher les 3 notes (68, 66, et 64). puisque la valeur du capteur redescend une fois qu'elle a atteint son maximum.

Il manque un paramètre pour faire ce que tu demandes.
Imagine un trombone à coulisse dans lequel tu soufflerais en permanence en bougeant la coulisse. Tu ne pourrais faire que des portamenti. Ou un theremin aussi.
Lorsque tu appuis sur ton capteur à quel moment peut-on dire que c'est la note que tu veux obtenir ?
Il faut obligatoirement introduire un paramètre supplémentaire:

  • un signal de validation (une touche, un capteur de souffle, ....)
  • le temps (pendant lequel on tient la pression par exemple)