Diseño del protocolo de comunicación serial de Arduino

8

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

Utilizaunmegaarduinocomomicroprocesador,yactualmenteseconectaconunprogramadeprocesamientoqueescribíparalacomunicaciónenserie.Desdeallí,losmensajesOSCseenvíanaunprogramaMax/MSPquemisociocolaboradorescribióparacrearunflujodedatosMIDI.

Entonces:

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

Escogí esta ruta en parte por no ser lo suficientemente inteligente como para eliminar cualquiera de los pasos todavía, pero también para poder actualizar la interfaz física de la manera que queremos, pudiendo hacer que la interfaz física sea multiuso (múltiples modos para los faders, mandos y botones de selección de voz), y ser capaz de garantizar la sincronización crítica de la misión y la modificación del ritmo (también conocido como "swing").

Mis mensajes seriales están configurados de esta manera:


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)

Entonces, puedes ver que, en función del número de comas por punto y coma, puedo determinar cómo analizar los datos en serie del arduino en el programa de procesamiento. Desde Procesamiento, este tipo de mensajes se transforman en OSC como este:


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

Ahora,hetratadodecortarelprocesamientoylaspartesOSCdelaecuación,peromefaltaalgodeconocimientoconrespectoaldiseñodelprotocolodedatosenserie.

SoyconscientedequehayunobjetoudpreceiveenMax.Yesofuncionabien,supongo?Talvezloestoyusandomal.

Enunmomentodado,cambiétodomicódigoarduinoparanoenviarnuevaslíneasalfinaldecadamensajeenserie,yaqueesonosignificabanadaespecialparaelobjetoudpreceivedeMax.Dehecho,sirecuerdocorrectamente,soloaceptaríaelprimermensajehastalaprimeralíneaydetendríaelprocesamientodedatos.Asíqueparaevitareso,saquétodosloscaracteresdenuevalíneayluegoseescupiríanenmax/mspcontinuamente.

Luego,elsiguienteproblemaconestemétodoesqueelobjetoudpreceivesoloaceptauncarácteralavez.Asíqueestabaintentandousarunobjetojsjavascriptparaconcatenarloscaracteresentrantesyluegoanalizarlosenpuntoycomaycomas.Elproblemaqueencontréallíeraqueeraimpredecibleeinestable.Loscaracteresseabandonaríanyelmensajenosepodríaprocesar.¿Realmentemehacepreguntarmesidebocambiarmiprotocolodedatosenserieaalgomásrobusto?¿Osiloestoyhaciendomalporcompleto?

¿Deberíasimplementedescartarlotodoyempezardeceroutilizandounfirmwarefirmata?Hevistoalgunos tutoriales para usar firmata con Max / MSP , y creo que podría echar un vistazo a lo que hace el código de la caja y si es necesario hacerlo. ¿Puede la firma aceptar datos de cadena en un pin para enviarlos a la pantalla LCD serial de a bordo? Si puedo controlar la pantalla LCD desde max / msp, podría funcionar bien.

¿Tienes algún consejo?

    
pregunta Steve Cooley

1 respuesta

1

¿Es posible que su problema sea causado por Arduino? Sé que suena extraño, porque Arduino se basa en gran medida en la comunicación en serie y no suele fallar. Pero le sugiero que pruebe su Arduino con diferentes velocidades, descarte datos legibles por humanos y monitoree con un programa terminal. He tenido el mismo problema y eso fue causado por el problema de tierra de mi arduino. Además, otra solución podría estar usando un diseño personalizado de arduino con velocidades de reloj compatibles con la serie como 14.7456MHz o cualquier múltiplo de valor de 3.6864MHz. Espero que ayude ...

    
respondido por el superkeci

Lea otras preguntas en las etiquetas