DmxSimple et utilisation de son buffer

Salut à tous,

dans le cadre d'un nouveau projet je ré-utilise une librairie, à savoir DmxSimple, dans le but de contrôler mon bus DMX.

Par le passé j'ai utilisé cette librairie, sur une cible ARDUINO NANO, et même combiné la gestion du bus DMX (110 canaux) avec 400 NEOPIXELS. Tout fonctionne à peu près bien (je m'en sert toujours), sauf que j'ai remarqué que quand je donne un ordre genre "tous les projos LED couleur rouge en même temps", je remarque assez souvent un décalage perceptible, pas du tout reproductible si je répète la même action.

l'architecture du code est la suivante (extrait pour les deux premiers projos de la série, il y en a encore 10 comme ça en suivant, + 3 lasers + d'autres trucs... pour écrire le DMX+ quelques centaines de lignes de codes pour le reste du produit) :

void E_DMX_OUT()
{
DmxSimple.write(ADD_1,255);
DmxSimple.write(ADD_1+1,RED);
DmxSimple.write(ADD_1+2,GREEN);
DmxSimple.write(ADD_1+3,BLUE);
DmxSimple.write(ADD_1+4,WHITE);
DmxSimple.write(ADD_1+5,0);
DmxSimple.write(ADD_1+6,(AUTO_M*AUTO_M1*255));
DmxSimple.write(ADD_1+7,0);

DmxSimple.write(ADD_2,255);
DmxSimple.write(ADD_2+1,RED);
DmxSimple.write(ADD_2+2,GREEN);
DmxSimple.write(ADD_2+3,BLUE);
DmxSimple.write(ADD_2+4,WHITE);
DmxSimple.write(ADD_2+5,0);
DmxSimple.write(ADD_2+6,(AUTO_M*AUTO_M2*255));
DmxSimple.write(ADD_2+7,0);

Ma théorie est que dès la première ligne 'DMXSimple.write', il part en émission de la trame, et quand arrive la seconde ligne, elle ne sera prise en compte que lors de l'émission trame suivante.
Le temps d’exécution de chaque ligne étant différent du temps pour émettre une trame complète, la trame n+1 peut débuter n'importe où au milieu de mes paquets, d'où le coté aléatoire du deuxième step visible sur les projos.

En ouvrant le .cpp de la librairie pour essayer de comprendre comment ça marche, j'ai trouvé ça :

void dmxWrite(int channel, uint8_t value) {
  if (!dmxStarted) dmxBegin();
  if ((channel > 0) && (channel <= DMX_SIZE)) {
    if (value<0) value=0;
    if (value>255) value=255;
    dmxMax = max((unsigned)channel, dmxMax);
    dmxBuffer[channel-1] = value;
  }
}

La dernière ligne m'interpelle, il a l'air d'accumuler les valeurs de chaque canal dans un buffer qu'il va ensuite dump dans le bus DMX physique.
La déclaration de volatile uint8_t dmxBuffer[DMX_SIZE]; en début du .cpp me conforte là dedans.

Ensuite, d'après mon interprétation de la structure générale, on dirait qu'il pilote la pin de sortie DMX "en live" et non par un UART. (c'est étonnant, instinctivement j'aurais pensé à utiliser un UART).

Donc ma question est la suivante, vu qu'il est possible de stopper l'émission de la trame en mettant 0 dans DmxSimple.maxChannel(0) (ce qui va appeler dmxEnd(); ), est-ce que cet arrêt va empêcher la constitution du buffer (accumulation des valeurs de chaque canaux, en vue du futur dump) ?
Si oui, ça serait cool, car je vais périodiquement stopper le DMX le temps qu'il charge la purée, puis le réactiver pour avoir une trame bien propre et complète (et accessoirement interdire la modification des valeurs des canaux pendant la phase active du DMX).
D'ailleurs est-ce que je peux utiliser dmxState dans mon code pour connaitre l'état de l'émission de la trame ?

Si non, ba je suis coincé et dois vivre avec un fonctionnement séquentiel qui donne parfois un résultat un peu dégueu.

merci à ceux qui auront des idées.

PS: la cible est un MEGA R3

This topic was automatically closed 180 days after the last reply. New replies are no longer allowed.