10 votos

¿Hay alguna razón por la que el uso de una velocidad de transmisión de 31250 en un Arduino MIDI proyecto podría causar problemas?

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;

  }

the basic circuit

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)?

6voto

Matt Puntos 150

La tasa de baudios no es un divisor entero de su MCU reloj. La velocidad en baudios se divide de la MCU del reloj. Es fácil obtener 9600, 19200 y otras tarifas con un número entero divisor del reloj. por ejemplo, si usted tiene un 6.144 MHz cristal, para obtener 19200 es necesario dividir por 3200.

Para el extraño tasas de datos en diferentes aplicaciones (Audio, vídeo analógico, y muchos otros) específicos de los cristales se utilizan con el fin de obtener un divisor entero, por ejemplo, NTSC circuito podría tener un 5.034963 MHz cristal para la generación de las distintas señales de sincronización, ver

Oscilador de cristal de frecuencias - WikiPedia

Si el MCU tiene un reloj interno del generador, trate de ajustar a un valor diferente con el fin de obtener un divisor entero, de lo contrario, el bit de error será demasiado alto.

4voto

Zuofu Puntos 3002

Una manera definitiva de la prueba es el hilo de su MIDI out MIDI in, y configurar el sistema mediante el cable USB-serial como antes, pero de enrutamiento (a través de su 'virtual cable midi' software) para el puerto de salida MIDI en el ordenador. Esto pondrá a prueba para ver si su USB MIDI hardware es en el hecho de funcionar de forma fiable en la tasa de datos, el dispositivo funciona. En mi experiencia, muchos de USB dispositivos MIDI son básicamente diseñado para los teclados (que sólo enviar 3 bytes o menos cuando se presiona una tecla o liberado) y han extraño problemas de desbordamiento cuando se transmita en el total 31,25 Kbit velocidad. Esto también es muy operativo de sistema / controlador de dependientes.

Supongo que usted también quiere asegurarse de que el transmisor/controlador de línea está trabajando. Por favor, publique un esquema de tu Arduino MIDI de salida del circuito. ¿Qué estás usando como controlador de salida?

Estoy haciendo un montón de suposiciones, pero suponiendo que el Arduino Uno a 16 MHz, 31250 bps es exactamente compatibles (0% de error) con un UBBR valor del registro de 31, de acuerdo con esto: AVR UART calculadora de la tasa. Esto me indica que la tasa de bits de MIDI no debería ser un problema (de hecho, mi entendimiento es que 31250 en gran parte fue elegida para ser fácil trabajar con un reloj de 1MHz, a diferencia de la máquina de teletipo derivados RS-232 tasas).

También, un volcado de lo que los mensajes de la PC está recibiendo a través de un MIDI sniffer o monitor sería muy útil en la depuración.

i-Ciencias.com

I-Ciencias es una comunidad de estudiantes y amantes de la ciencia en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X