Tengo un 600 pulsos por revolución del encoder óptico (y algunas otras cosas) conectado a un Arduino Uno (probado en r2 y r3) a través de la interrupción de los pines 2 y 3.
Mientras se espera por un mi jack MIDI para llegar en el correo, he intentado conectar mi configuración de mi computadora a través de USB-puerto serie, junto con el pelo-midi y loopMidi. Loopmidi es un puerto MIDI virtual, y sin pelo-midi, puentes, puertos serie, puertos MIDI virtuales o de otra manera. He utilizado una tasa de baudios 115200, porque pensé que podía herir a ir demasiado alto. Todo parecía funcionar bastante bien en Mixxx. Muy bien, en realidad. Parecía muy sensible y precisa. El codificador no perder el ritmo, no importa lo rápido que abarcan esa cosa.
Así que yo estaba muy emocionado cuando el jack MIDI llegado. Lo puse en mi protoboard y cambiado
Serial.begin(115200);
a
Serial.begin(31250);
y lo probado en Mixxx. Ahora, si hago girar el codificador moderadamente rápidamente en una dirección, el registro virtual se mueve en esa dirección y, a continuación, de repente a girar al otro lado y luego de vuelta otra vez. Supongo que el codificador falta de pulsos?
Lo he probado en dos diferentes $6 usb-midi cables as well as in my M-Audio Fast Track Ultra.
Then I thought that maybe it had something to do with the lower baud rate (115200 vs 31250). I changed the rate to 38400 and went through USB serial. It worked great. I even tried 19200. Perfect. Even at 9600, it worked.
Why is this happening? Is the usb-serial circuitry in the Arduino, along with some free software, really more reliable than a midi cable and a $300 interfaz de audio, incluso cuando el arduino a muy bajas tasas de baudios? O es que hay algo acerca de la extraña 31250 velocidad en baudios que causa problemas en el Arduino?
No he tenido la oportunidad de probar el uso de la 31250 tasa a través de la usb-serie, porque sin pelo midi que no permite que la tasa de.
EDITAR: Aquí está la parte pertinente del código, y la parte pertinente del circuito. Hay un par de otros componentes, lo que podría estar haciendo el problema peor, 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;
}
Es raro. Otra posibilidad: el extraño velocidad en baudios de alguna manera lío con las interrupciones de hardware?
EDITAR de nuevo: Corrí mixxx en mididebug modo de intervalo y el registro en una dirección. Esto fue en el log:
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"
Así que va de la repetición de 63 con un ocasional 62 para, de repente, la repetición de 65 años con un ocasional 66. Una velocidad de 64 significa que la rueda no se mueve. 63 significa mover hacia la izquierda un pulso. 65 es el sentido de las agujas de un pulso . O viceversa, dependiendo de cómo la cosa es con cable.
Eso no implica que el problema está en el arduino y no en el midi adaptador(s)?