Problème bounce contrôleur midi

Bonjour,

J'ai monté un petit contrôleur midi avec 1 joystick, 6 boutons d'arcade, et 2 potentiomètres sur 1 arduino leonardo. La transmission se fait par USBMIDI.
Tout fonctionne, sauf que j'ai parfois de fausses détections, surtout avec le joystick, il détecte parfois 2 clic, alors qu'il n'y en a eu qu'un.
J'ai donc modifié mon code avec la bibliothèque bounce, mais j'ai cette erreur que je ne comprends pas lors de la vérification :
exit status 1
expected unqualified-id before 'for'

l'erreur pointe sur cette ligne :
for (int i=0; i<BUTTON_PIN_COUNT; ++i) { Bounce bouton[i] = Bounce(); }

voici le code complet :

#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.

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);
}


const int ANALOG_PIN_COUNT = 2;
const int BUTTON_PIN_COUNT = 10;

// Change the order of the pins to change the ctrl or note order.
//int testBtn;
int analogPins[ANALOG_PIN_COUNT] = { A1, A0 };
int buttonPins[BUTTON_PIN_COUNT] = { 2, 3, 4, 5, 6, 7, 8, 9, 10, 11 };

int ccValues[ANALOG_PIN_COUNT];
int buttonDown[BUTTON_PIN_COUNT];
int bouton[BUTTON_PIN_COUNT];

for (int i = 0; i < BUTTON_PIN_COUNT; ++i) {
  Bounce bouton[i] = Bounce();
}



int readCC(int pin) {
  // Convert from 10bit value to 7bit.
  return analogRead(pin) >> 3;
}

int isButtonDown(int pin) {
  return bouton[pin].read() == 0;
}

void setup() {
  // Initialize initial values.
  for (int i = 0; i < ANALOG_PIN_COUNT; ++i) {
    pinMode(analogPins[i], INPUT);
    ccValues[i] = readCC(analogPins[i]);
  }

  for (int i = 0; i < BUTTON_PIN_COUNT; ++i) {
    bouton[i].attach(buttonPins[i], INPUT_PULLUP);
    bouton[i].interval(5);
    //pinMode(buttonPins[i], INPUT);
    //digitalWrite(buttonPins[i], HIGH);
    buttonDown[i] = isButtonDown(i);
  }
}

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();
  }
  for (int i = 0; i < BUTTON_PIN_COUNT; ++i) {
    bouton[i].update();
  }
  for (int i = 0; i < ANALOG_PIN_COUNT; ++i) {
    int value = readCC(analogPins[i]);
    //int value1 = readCC(analogPins[1]);

    // Send CC only if th has changed.
    if (ccValues[i] != value) {
      sendCC(0, i, value);
      ccValues[i] = value;
    }
  }

  for (int i = 0; i < 4; ++i) {
    int down = isButtonDown(i);

    if (down != buttonDown[i]) {
      sendNote(0, 64 + i, down ? 120 : 0);
      buttonDown[i] = down;
    }
  }
  for (int i = 4; i < 10; ++i) {
    //testBtn = digitalRead(buttonPins[i]);
    //Serial.println(buttonPins[i]);
    //Serial.println(testBtn);
    int down = isButtonDown(i);
    int note = i;
    note = map(note, 5, 10, 0, 5);
    if (down != buttonDown[i]) {
      sendNote(1, 24 + note, down ? 120 : 0);
      buttonDown[i] = down;
    }
  }


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

Si quelqu'un peut m'expliquer, et m'aider à résoudre le problème ?
Merci

Bonjour,

Cette instruction est en dehors de toute fonction (ce que tu peux voir par l'indentation)
La mettre dans le setup

Remarque: tel quel ceci ne sert strictement à rien puisque tu redéfinis la variable bouton[] comme variable locale qui sera détruite à la sortie du for
il faut simplement faire
bouton[i] = Bounce();

donc si je comprends bien, le fait d'écrire, par exemple bouton[10] = Bounce();
va créer 1 tableau de 10 instances de Bounce() ?

Non c'est le fait de donner le type qui crée la variable
Bounce bouton[10];

D'ailleurs Bounce bouton[i] = Bounce(); est incorrect car dans la définition d'un tableau l’indice dot être constant.

Merci, ça fonctionne, mais maintenant, j'ai encore un petit souci avec les potentiomètres qui envoient des valeurs mêmes lorsque je ne les touche pas.
Quelle est la solution ? prendre une série de valeurs et faire la moyenne ? ou augmenter la valeur dans cette ligne : return analogRead(pin) >> 3; ?

Tu peux faire les deux: faire la moyenne et la division

Tout dépend des écarts de valeurs constatés. Il peur s'agir de bruit de l'ADC ou du potentiomètre lui-même.
Si les potentiomètres sont en cause : envisager les potentiomètres à piste plastique.
Sinon, faire une moyenne, ce qui prendra du temps.
Comme tu utilises deux canaux analogiques, si les potentiomètres ont une résistance de plus de 10K, il peut y avoir aussi un problème de rémanence d'un canal sur l'autre (effet condensateur de l'entrée de l'ADC).

ce sont des potentiomètres de 50k, en fait, j'ai l'impression que le problème ne vient pas des potentiomètres, car lorsque je regarde les valeurs dans le moniteur série, elles sont stables, mais par contre, et dans ableton live, les paramètres auxquels ils sont assignés ne changent que si j'agis sur le potards. Mais si j'essaye de changer l'assignation (dans ableton live, ça se fait en cliquant sur le paramètres et en bougeant le potards), ableton live fait l'assignation avant que je n'ai touché le potard... Donc j'ai l'impression que l'arduino envoie constamment les valeurs des potards, même si celles-ci ne changent pas.

50K est une valeur qui peut entraîner de petits problèmes de précision.

Sinon, la mesure peut varier d'un point ou deux, c'est normal. Il faut considérer que si la mesure varie très peu par rapport à la dernière valeur envoyée, on peut ignorer la variation .
Il faut donc mémoriser la dernière valeur envoyée et la comparer aux nouvelles mesures. Si la différence est >= 2 points (ou plus), procéder à l'envoi.

This topic was automatically closed 180 days after the last reply. New replies are no longer allowed.