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 que llegara mi conector MIDI por correo, traté de conectar mi configuración a mi computadora a través del puerto serial USB, junto con midi sin pelo y loopMidi. Loopmidi es un puerto MIDI virtual, y el midi sin pelo une los puertos serie con los puertos MIDI, virtuales o no. Usé una tasa de baudios de 115200, porque pensé que no estaría de más ir demasiado alto. Todo parecía funcionar bastante bien en Mixxx. Muy bien, en realidad. Parecía muy receptivo y preciso. El codificador no perdió el ritmo, sin importar qué tan rápido amplíe esa cosa.
Así que estaba muy emocionado cuando llegó el conector MIDI. Lo puse en mi protoboard y 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 hacia el otro lado y luego volverá. ¿Supongo que al codificador le faltan pulsos?
Lo probé en dos cables usb-midi diferentes de $6, así como en mi M-Audio Fast Track Ultra.
Luego pensé que tal vez tenía algo que ver con la tasa de baudios más baja (115200 frente a 31250). Cambié la tarifa a 38400 y pasé por USB serial. Funcionó muy bien. Incluso probé 19200. Perfecto. Incluso en 9600, funcionó.
¿Por qué está pasando esto? ¿Es el circuito usb-serial en 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 baudios de 31250 que causa problemas en el Arduino?
No he tenido la oportunidad de intentar usar la tasa 31250 a través del usb-serial, porque 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;
}
Es raro. Otra posibilidad: ¿la extraña tasa de baudios interfiere de alguna manera con las interrupciones del hardware?
EDITAR nuevamente: ejecuté mixxx en modo mididebug y amplí el registro en una dirección. Esto estaba en el registro:
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"
Entonces pasa de repetir 63 con un 62 ocasional a repetir repentinamente 65 con un 66 ocasional. Una velocidad de 64 significa que la rueda no se mueve. 63 significa moverse en sentido antihorario un pulso. 65 es un pulso en el sentido de las agujas del reloj. O viceversa, dependiendo de cómo esté conectado.
¿Eso implica que el problema está en el arduino y no en los adaptadores midi?
Su tasa de baudios no es un divisor entero de su reloj MCU. La tasa de baudios se divide del reloj de la MCU. Es fácil obtener 9600, 19200 y otras tasas con un divisor entero del reloj. por ejemplo, si tiene un cristal de 6.144MHz, para obtener 19200 necesita dividir por 3200.
Para las velocidades de datos impares en diversas aplicaciones (audio, video analógico y muchas otras), se utilizan cristales específicos para obtener un divisor de números enteros, por ejemplo, un circuito NTSC puede tener un cristal de 5,034963 MHz para generar las diversas señales de sincronización, consulte
Si su MCU tiene un generador de reloj interno, intente ajustarlo a un valor diferente para obtener un divisor entero; de lo contrario, el error de bit será demasiado alto.
Una forma definitiva de probar es conectar su salida MIDI a su entrada MIDI y configurar el sistema usando el puerto serie USB como antes, pero enrutándolo (a través de su software de 'cable midi virtual') al puerto de salida MIDI en la computadora . Esto probará para ver si su hardware USB MIDI está funcionando de manera confiable a la velocidad de datos a la que funciona el dispositivo. En mi experiencia, muchos dispositivos USB MIDI están diseñados básicamente para teclados (que solo envían 3 bytes cuando se presiona o suelta una tecla) y tienen extraños problemas de desbordamiento cuando transmites a la velocidad máxima de 31,25 Kbit. Esto también depende mucho del sistema operativo/controlador.
Supongo que también querrá asegurarse de que el transmisor/controlador de línea esté funcionando. Publique un esquema de su circuito Arduino MIDI-out. ¿Qué estás usando como controlador de salida?
Estoy haciendo muchas suposiciones, pero suponiendo que Arduino Uno a 16 MHz, 31250 bps es exactamente compatible (0% de error) con un valor de registro UBBR de 31, de acuerdo con esto: Calculadora de tasa AVR UART . Esto me indica que la tasa de bits de MIDI no debería ser un problema (de hecho, tengo entendido que 31250 fue elegido en gran medida para que fuera fácil trabajar con un reloj de 1 MHz, a diferencia de las tasas RS-232 derivadas de la máquina de teletipo).
Además, un volcado de los mensajes que recibe la PC a través de un rastreador o monitor MIDI sería muy útil para la depuración.
yippie
el phil lee
yippie
el phil lee
yippie