Tengo un codificador óptico de 600 pulsos por revolución (y algunas otras cosas) conectado a un Arduino Uno (lo probé en r2 y r3) a través de los pines de interrupción 2 y 3.
Mientras esperaba a que llegara por correo mi conector MIDI, intenté conectar mi configuración a mi computadora a través del puerto serial USB, junto con midi sin hilos y loopMidi. Loopmidi es un puerto MIDI virtual, y los puertos serie de puentes midi sin pelo con puertos MIDI - virtuales o de otro tipo. Utilicé una velocidad en baudios de 115200, porque pensé que no podía hacer demasiado daño. Todo parecía funcionar bastante bien en Mixxx. Muy bien, en realidad. Parecía muy sensible y precisa. El codificador no perdió el ritmo, no importa lo rápido que lo abarque.
Así que estaba muy emocionado cuando llegó el conector MIDI. Lo puse en mi tablero y lo cambié
Serial.begin(115200);
a
Serial.begin(31250);
y lo probé en Mixxx. Ahora, si giro el codificador moderadamente rápido en una dirección, el registro virtual se moverá en esa dirección y luego girará repentinamente en la otra dirección y luego volverá a retroceder. ¿Supongo que al codificador le faltan pulsos?
Lo probé con dos cables usb-midi de $ 6 diferentes, así como en mi M-Audio Fast Track Ultra.
Entonces pensé que tal vez tenía algo que ver con la menor velocidad de transmisión (115200 vs 31250). Cambié la tasa a 38400 y pasé por USB serial. Funcionó muy bien Incluso probé 19200. Perfecto. Incluso a 9600, funcionó.
¿Por qué sucede esto? ¿Es el circuito serie usb en el Arduino, junto con algún software gratuito, realmente más confiable que un cable midi y una interfaz de audio de $ 300, incluso cuando el arduino está configurado a velocidades de transmisión muy bajas? ¿O hay algo en la extraña tasa de 31250 baudios que causa problemas en el Arduino?
No he tenido la oportunidad de intentar usar la tasa de 31250 a través de la serie USB, porque el midi sin pelo no permite esa tasa.
EDITAR: Aquí está la parte relevante del código y la parte relevante del circuito. Hay algunos otros componentes, que podrían empeorar el problema, pero incluso sin esos componentes, el codificador óptico no funciona en 31250.
enum PinAssignments {
encoderPinA = 2, // rigth
encoderPinB = 3, // left
};
volatile int encoderPos = 0; // a counter for the dial
unsigned int lastReportedPos = 0; // change management
boolean A_set = false;
boolean B_set = false;
void setup() {
pinMode(encoderPinA, INPUT_PULLUP);
pinMode(encoderPinB, INPUT_PULLUP);
// encoder pin on interrupt 0 (pin 2)
attachInterrupt(0, doEncoderA, CHANGE);
// encoder pin on interrupt 1 (pin 3)
attachInterrupt(1, doEncoderB, CHANGE);
Serial.begin(31250);
}
void loop() {
if (encoderPos != lastReportedPos){
Serial.write(0xB0);
Serial.write(0x27);
Serial.write(64 + encoderPos - lastReportedPos);
encoderPos = 0;
lastReportedPos = encoderPos;
}
}
// Interrupt on A changing state
void doEncoderA(){
A_set = !A_set;
// adjust counter + if A leads B
if ( A_set && !B_set )
encoderPos += 1;
}
// Interrupt on B changing state, same as A above
void doEncoderB(){
B_set = !B_set;
if( B_set && !A_set )
encoderPos -= 1;
}
Esraro.Otraposibilidad:¿lavelocidaddebaudiosextrañadealgunamaneraconfundeconlasinterrupcionesdehardware?
EDITARdenuevo:Corrímixxxenmodomididebugyabarcoelregistroenunadirección.Estoestabaenelregistro:
Debug[Controller]:"MIDI status 0xB0 (ch 1, opcode 0xB), ctrl 0x27, val 0x41"
Debug [Controller]: "MIDI status 0xB0 (ch 1, opcode 0xB), ctrl 0x27, val 0x41"
Debug [Controller]: "MIDI status 0xB0 (ch 1, opcode 0xB), ctrl 0x27, val 0x3F"
Debug [Controller]: "MIDI status 0xB0 (ch 1, opcode 0xB), ctrl 0x27, val 0x41"
Debug [Controller]: "MIDI status 0xB0 (ch 1, opcode 0xB), ctrl 0x27, val 0x3F"
Debug [Controller]: "MIDI status 0xB0 (ch 1, opcode 0xB), ctrl 0x27, val 0x3F"
Debug [Controller]: "MIDI status 0xB0 (ch 1, opcode 0xB), ctrl 0x27, val 0x3F"
Debug [Controller]: "MIDI status 0xB0 (ch 1, opcode 0xB), ctrl 0x27, val 0x3F"
Debug [Controller]: "MIDI status 0xB0 (ch 1, opcode 0xB), ctrl 0x27, val 0x3F"
Debug [Controller]: "MIDI status 0xB0 (ch 1, opcode 0xB), ctrl 0x27, val 0x3E"
Debug [Controller]: "MIDI status 0xB0 (ch 1, opcode 0xB), ctrl 0x27, val 0x3F"
Debug [Controller]: "MIDI status 0xB0 (ch 1, opcode 0xB), ctrl 0x27, val 0x3F"
... for a while and then ...
Debug [Controller]: "MIDI status 0xB0 (ch 1, opcode 0xB), ctrl 0x27, val 0x3F"
Debug [Controller]: "MIDI status 0xB0 (ch 1, opcode 0xB), ctrl 0x27, val 0x41"
Debug [Controller]: "MIDI status 0xB0 (ch 1, opcode 0xB), ctrl 0x27, val 0x41"
Debug [Controller]: "MIDI status 0xB0 (ch 1, opcode 0xB), ctrl 0x27, val 0x41"
Debug [Controller]: "MIDI status 0xB0 (ch 1, opcode 0xB), ctrl 0x27, val 0x41"
...
Debug [Controller]: "MIDI status 0xB0 (ch 1, opcode 0xB), ctrl 0x27, val 0x41"
Debug [Controller]: "MIDI status 0xB0 (ch 1, opcode 0xB), ctrl 0x27, val 0x41"
Debug [Controller]: "MIDI status 0xB0 (ch 1, opcode 0xB), ctrl 0x27, val 0x3F"
Debug [Controller]: "MIDI status 0xB0 (ch 1, opcode 0xB), ctrl 0x27, val 0x3F"
Debug [Controller]: "MIDI status 0xB0 (ch 1, opcode 0xB), ctrl 0x27, val 0x3F"
Debug [Controller]: "MIDI status 0xB0 (ch 1, opcode 0xB), ctrl 0x27, val 0x3F"
Debug [Controller]: "MIDI status 0xB0 (ch 1, opcode 0xB), ctrl 0x27, val 0x3F"
Debug [Controller]: "MIDI status 0xB0 (ch 1, opcode 0xB), ctrl 0x27, val 0x3F"
Debug [Controller]: "MIDI status 0xB0 (ch 1, opcode 0xB), ctrl 0x27, val 0x3F"
Debug [Controller]: "MIDI status 0xB0 (ch 1, opcode 0xB), ctrl 0x27, val 0x3F"
Por lo tanto, se pasa de repetir 63 con un ocasional 62 a repetir repentinamente 65 con un ocasional 66. Una velocidad de 64 significa que la rueda no se está moviendo. 63 significa mover un impulso en sentido antihorario. 65 es en el sentido de las agujas del reloj un pulso. O viceversa, dependiendo de cómo esté cableado.
¿Eso implica que el problema está en el arduino y no en los adaptadores midi?