8 votos

Diseño del protocolo de comunicación en serie de Arduino

Hago una interfaz de secuenciador de batería para música electrónica .

enter image description here

Utiliza un arduino mega como microprocesador, y actualmente interactúa con un programa de Processing que escribí para la comunicación en serie. Desde allí, los mensajes OSC se envían a un programa Max/MSP que mi socio colaborador escribió para crear un flujo de datos midi.

Así que:

enter image description here

Mi interfaz física -> Arduino Mega -> E/S en serie -> Procesamiento -> OSC -> Max/MSP -> Midi ( -> aplicación musical)

Elegí este camino en parte por no ser lo suficientemente inteligente como para eliminar ninguno de los pasos todavía, pero también para poder actualizar la interfaz física de la manera que queramos, poder hacer que la interfaz física sea polivalente (múltiples modos para los faders, los mandos y los botones de selección de voz), y poder asegurar la modificación del tiempo y el ritmo de misión crítica (aka "swing").

Mis mensajes en serie están configurados así:

PL,1;        // transport control: play
PL,0;        // transport control: stop
SW,30;       // swing value 30
TM,130;      // tempo value 130
SD,1,8,04,0; // Step sequencer data, pattern 1, voice 8 (of 8), step 04 (of 16), off
MU,8,1;      // Mute, voice 8 (of 8), on
SO,4,0;      // Solo, voice 4 (of 8), off
VL,3,127;    // Velocity, voice 3 (of 8), value 127
CC,1,127;    // Midi CC, controller 1, value 127
NN,1,36;     // Note number, voice 1 (of 8), value 36 (usually a kick drum)

Así, puedes ver que en base al número de comas por punto y coma, puedo determinar cómo parsear los datos en serie del arduino en el programa Processing. Desde Processing, este tipo de mensajes se transforman en OSC así:

/beatseqr/play 1
/beatseqr/play 0
/beatseqr/swing 30
/beatseqr/tempo 130
/beatseqr/matrix/1/8/04 0
/beatseqr/mute/8 1
/beatseqr/solo/4 0
/beatseqr/velocity/3 127
/beatseqr/midicc/1 127
/beatseqr/midinn/1 36

Y todo funciona bien, pero se siente ineficiente. ¿Realmente necesito la aplicación de procesamiento en el medio?

enter image description here

Ahora, yo había tratado de cortar el procesamiento y las partes OSC fuera de la ecuación, pero me falta un poco de conocimiento en lo que respecta al diseño del protocolo de datos en serie.

Soy consciente de que hay un udpreceive en Max. ¿Y eso funciona bien, supongo? Tal vez lo estoy usando mal.

En un momento dado había cambiado todo mi código de arduino para no enviar nuevas líneas al final de cada mensaje en serie ya que eso no significaba nada especial para Max udpreceive objeto. De hecho, si no recuerdo mal, sólo aceptaba el primer mensaje hasta la primera línea nueva y luego dejaba de procesar los datos. Así que para evitar eso, quité todos los caracteres de nueva línea y entonces se escupía en max/msp continuamente.

Entonces el siguiente problema de este método es que el udpreceive sólo acepta un carácter a la vez. Así que estaba intentando utilizar un js objeto javascript para concatenar los caracteres entrantes, y luego parsearlos en los puntos y comas. El problema con el que me encontré fue que era impredecible e inestable. Los caracteres se caían y el mensaje no se podía procesar. Así que me hace preguntarme si debería cambiar mi protocolo de datos en serie a algo más robusto. ¿O si lo estoy haciendo mal del todo?

¿Debería desechar todo y empezar de nuevo con un firmware de firmata? He visto algunos tutoriales para utilizar el firmata con Max/MSP y supongo que podría echar un nuevo vistazo a lo que el código de la caja está haciendo y si necesita hacerlo en absoluto. ¿Puede el firmata aceptar datos de cadena en un pin para enviar a la LCD de serie de la placa? si puedo controlar la LCD desde el max/msp, eso podría funcionar bien.

¿Tienes algún consejo?

1voto

¿Es posible que tu problema sea causado por Arduino? Sé que suena extraño, porque Arduino depende mucho de la comunicación en serie y no suele fallar. Pero te sugiero que pruebes tu Arduino con diferentes velocidades, volcando datos legibles por humanos y monitoreando con un programa de terminal. Yo he tenido el mismo problema y eso fue causado por un problema de tierra de mi arduino. También, otra solución podría ser usar un diseño de arduino personalizado con velocidades de reloj amigables con la serie como 14.7456MHz o cualquier valor múltiplo de 3.6864MHz. Espero que esto ayude...

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