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