Midi Tx/Rx instabile.

Ciao a tutti, sto sviluppando un controller Midi 4ch per controllare un mixer audio.
Il controller é costituito da 4 potenziometri per regolare i primi 4 canali del mixer, 4 bottoni pushbutton per controllare i tasti mute del mixer e da 4 led bicolori per lo stato di feedback dei 4 mute.

Il codice si basa sulla libreria Midi.h di Arduino.

Il controller funziona, riesce a inviare dati (posizione potenziometri) e riesce a leggere valori (feedback stato mute).

Il problema é che se vario velocemente i potenziometri muovendoli "avanti e indietro" capita a volte che lo stato dei potenziometri entri in una oscillazione di valori.

(I bottoni non li ho ancora inserito in questa versione di codice, li inseriró più avanti quando avró sistemato il problema dell'instabilità)

Allego un video dove mostro fisicamente il problema: 20190926_224348_1.mp4 - Google Drive

#include <MIDI.h>

MIDI_CREATE_DEFAULT_INSTANCE();


//------------------NUMBER OF CONTROLS------------------
byte nLeds = 4;
byte nButtons = 4;
byte nPots = 4;

int Pot[]{A7,A6,A5,A4};
int Button[]{4,5,10,11};

int LedG[]{2,6,8,12};
int LedR[]{3,7,9,13};

byte potLastState[4];
byte potCurrentState[4];

int i = 0;


/////////////////////////////////////////////
// Metro Variables

void setup() {

MIDI.begin(2);
MIDI.setHandleControlChange(MyHandleControlChange);

  for (int i; i<4; i++) {
    pinMode (Button[i],INPUT_PULLUP);
    pinMode (LedG[i],OUTPUT);
    pinMode (LedR[i],OUTPUT);
  }
}

void loop() {
  
potUpdate();
MIDI.read();
}





void potUpdate() {

    potCurrentState[i] = map(analogRead(Pot[i]),1023,0,0,127);
    
    if (potCurrentState[i] > potLastState[i] + 1 || potCurrentState[i] + 1 < potLastState[i]) 
    {  
      //digitalWrite(LedG[i],HIGH);
      
       MIDI.sendControlChange (i, potCurrentState[i], 1); 
      
      potLastState[i] = potCurrentState[i];
    }
    //else digitalWrite(LedG[i],LOW);
    i++;
    if (i==4) i=0;
 
}

void MyHandleControlChange(byte channel, byte number, byte value) { 
 if (channel==2) {

    switch (number) {
      case 0:
        if (value<63) {digitalWrite(LedG[0],HIGH); digitalWrite(LedR[0],LOW);}
        else {digitalWrite(LedG[0],LOW); digitalWrite(LedR[0],HIGH);}
        break;
      case 1:
        if (value<63) {digitalWrite(LedG[1],HIGH); digitalWrite(LedR[1],LOW);}
        else {digitalWrite(LedG[1],LOW); digitalWrite(LedR[1],HIGH);}
        break;
      case 2:
        if (value<63) {digitalWrite(LedG[2],HIGH); digitalWrite(LedR[2],LOW);}
        else {digitalWrite(LedG[2],LOW); digitalWrite(LedR[2],HIGH);}
        break;
      case 3:
        if (value<63) {digitalWrite(LedG[3],HIGH); digitalWrite(LedR[3],LOW);}
        else {digitalWrite(LedG[3],LOW); digitalWrite(LedR[3],HIGH);}
        break;
 }
}
else {};
}

Beh visto anche il video, non ho molti suggerimenti certi ma solo qualche idea.

Primo, verifica comunque bene che le masse siano tutte in comune tra Arduino e le uscite MIDI.

Poi considera che il convertitore A/D di Arduino non è che dia valori molto stabili visto che la qualità del dato dipende da tanti fattori, tanto più se parli di potenziometri (come li hai connessi esattamente?).

A parte questo, vedo che le variazioni le mappi direttamente ossia i valori da 1023 a 0 (perché li hai montati al contrario? :wink: ) li trasformi in valori tra 0 e 127 con la map() quindi verifichi se ci sono stati cambiamenti:

    potCurrentState[i] = map(analogRead(Pot[i]),1023,0,0,127);

   if (potCurrentState[i] > potLastState[i] + 1 || potCurrentState[i] + 1 < potLastState[i])

Per il problema del "tremolio" se non trovi altre cause potresti provare ad aumentare il margine di variabilità, da 1 a 2 o più. Poi ad esempio farei:

...
#define TRIGGER 3
...
    potCurrentState[i] = map(analogRead(Pot[i]),1023,0,0,127);

   if ( potCurrentState[i] > potLastState[i] + TRIGGER 
    || potCurrentState[i] < potLastState[i] - TRIGGER )

Ma al tuo posto prenderei in considerazione di sostituire i potenziometri con degli encoder, che danno molti meno problemi... :wink: