¿Hay alguna razón por la que el uso de una velocidad en baudios de 31250 en un proyecto Arduino MIDI pueda causar problemas?

7

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?

    
pregunta The Phil Lee

2 respuestas

5

Su velocidad en baudios no es un divisor entero de su reloj MCU. La velocidad en baudios se divide del reloj del 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 debe dividir por 3200.

Para las tasas de datos impares en varias aplicaciones (audio, video analógico y muchas otras) se usan cristales específicos para obtener un divisor entero, por ejemplo, un circuito NTSC podría tener un cristal de 5.034963MHz para generar la sincronización señales, ver

  

Frecuencias del oscilador de cristal - WikiPedia

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.

    
respondido por el Lior Bilia
4

Una forma definitiva de probar es conectar su MIDI a su entrada MIDI, y configurar el sistema utilizando la serie USB como antes, pero enrutarlo (a través de su software 'cable midi virtual') al puerto de salida MIDI en la computadora. Esto comprobará si su hardware MIDI USB funciona de manera confiable a la velocidad de datos en la que trabaja el dispositivo. En mi experiencia, muchos dispositivos USB MIDI están diseñados básicamente para teclados (que solo envían aproximadamente 3 bytes cuando se presiona o suelta una tecla) y tienen problemas de desbordamiento extraños cuando se transmite a la velocidad total de 31.25 Kbit. Esto también depende mucho del sistema operativo / controlador.

Supongo que también desea 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 el controlador de salida?

Estoy haciendo muchas suposiciones, pero asumiendo que el Arduino Uno a 16 MHz, 31250 bps es exactamente compatible (0% de error) con un valor de registro UBBR de 31, según esto: AVR UART calculadora de tasa . Esto me indica que la velocidad de bits de MIDI no debería ser un problema (de hecho, según tengo entendido, 31250 se eligió en gran medida para que fuera fácil trabajar con un reloj de 1MHz, 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.

    
respondido por el Zuofu

Lea otras preguntas en las etiquetas