Conception du protocole de communication série Arduino

8

Je fais une interface de séquenceur de batterie pour la musique électronique .

entrez la description de l'image ici

Il utilise un méga arduino comme microprocesseur et actuellement il s'interface avec un programme de traitement que j'ai écrit pour la communication série. De là, les messages OSC sont envoyés à un programme Max / MSP que mon partenaire collaborateur a écrit pour créer un flux de données midi.

Donc:

entrez la description de l'image ici

Mon interface physique -> Arduino Mega -> E / S série -> Traitement -> OSC -> Max / MSP -> Midi (-> application musicale)

J'ai choisi ce chemin en partie parce qu'il n'était pas assez intelligent pour supprimer encore l'une des étapes, mais aussi pour permettre de mettre à jour l'interface physique comme nous le souhaitons, de pouvoir rendre l'interface physique polyvalente (plusieurs modes pour le faders, boutons et boutons de sélection de voix), et être en mesure d'assurer le timing critique de la mission et la modification du rythme (aka "swing").

Mes messages série sont configurés comme ceci:


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)

Ainsi, vous pouvez voir qu'en fonction du nombre de virgules par point-virgule, je peux déterminer comment analyser les données série de l'arduino dans le programme de traitement. Depuis Processing, ces types de messages sont transformés en OSC comme ceci:


/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

Et tout fonctionne bien, mais cela semble inefficace. Ai-je vraiment besoin de l'application de traitement au milieu?

entrez la description de l'image ici

Maintenant, j'avais essayé de couper le traitement et les parties OSC de l'équation, mais je manque de connaissances en matière de conception de protocole de données série.

Je sais qu'il y a un udpreceiveobjet dans Max. Et ça marche ok je suppose? Peut-être que je l'utilise mal.

À un moment donné, j'avais changé tout mon code arduino pour ne pas envoyer de nouvelles lignes à la fin de chaque message série, car cela ne signifiait rien de spécial pour l' udpreceiveobjet de Max . En fait, si je me souviens bien, il n'accepterait que le premier message jusqu'à la première nouvelle ligne et arrêterait alors le traitement des données. Donc, pour contourner cela, j'ai supprimé tous les caractères de nouvelle ligne, puis ils se répandaient en max / msp en continu.

Ensuite, le problème suivant avec cette méthode est que l' udpreceiveobjet n'accepte qu'un seul caractère à la fois. J'essayais donc d'utiliser un jsobjet javascript pour concaténer les caractères entrants, puis les analyser sur les points-virgules et les virgules. Le problème que j'ai rencontré là-bas était qu'il était imprévisible et instable. Les caractères disparaîtraient et le message ne serait pas traitable. Donc, je me demande vraiment si je devrais changer mon protocole de données série pour quelque chose de plus robuste? Ou si je me trompe complètement?

Dois-je simplement tout supprimer et recommencer à zéro en utilisant un firmware firmata? J'ai vu quelques tutoriels pour utiliser les firmata avec Max / MSP , et je suppose que je pourrais jeter un nouveau regard sur ce que fait le code sur la boîte et s'il doit le faire. La firmata peut-elle accepter des données de chaîne sur une broche à envoyer à l'écran LCD série intégré? si je peux contrôler l'écran LCD à partir de max / msp, cela pourrait fonctionner correctement.

Vous avez des conseils?

Steve Cooley
la source
1
+1 juste pour le OMGWTFbouton, mais très bien pensé et question détaillée aussi!
Polynôme
1
Avez-vous vu cette page ? Il existe un certain nombre de façons d'interfacer avec Max / MSP qui n'impliquent pas de traitement. L'un d'entre eux fonctionne / ne fonctionne pas pour vous?
angelatlarge
@angelatlarge Ouais, un peu. Pas du tout. J'espère obtenir des conseils sur si je fais bien ou mal le protocole série, mais je suis ouvert à une refonte avec une méthode de communication alternative si je peux toujours obtenir les mêmes fonctionnalités à la fin.
Steve Cooley

Réponses:

1

Est-il possible que votre problème soit causé par Arduino? Je sais que cela semble étrange, car Arduino dépend fortement de la communication série et il n'échoue généralement pas. Mais je vous suggère d'essayer votre Arduino à différentes vitesses, en vidant les données lisibles par l'homme et en les surveillant avec un programme de terminal. J'ai eu le même problème et cela a été causé par un problème au sol de mon arduino. En outre, une autre solution pourrait être d'utiliser une conception arduino personnalisée avec des vitesses d'horloge respectueuses de la série telles que 14,7456 MHz ou tout multiple de valeur de 3,6864 MHz. J'espère que cela aide...

superkeci
la source