Salut à tous,
j'utilise la librairie DmxSimple pour piloter des jeux de lumières. Actuellement mon système tourne sur un NANO, je gère 120 adresses et ça fonctionne à peu près bien.
Quand je dis à peu près, c'est parceque j'ai l'impression parfois qu'il envoie les trames en plusieurs blocs. Je m'explique, sur certaines scènes, j'allume tous mes projos en même temps (du moins c'est la théorie), sauf qu'en vrai, certains s"allument avant d'autres. Le décalage est léger, probablement deux ou trois trames d'écart, mais c'est perceptible en les regardant. avec une vraie console DMX, cela ne se produit pas, ils s'allument tous synchrones.
Alors je me dis que ça vient de la librairie et de son fonctionnement, car le phénomène est aléatoire et difficilement reproductible (ce ne sont jamais systématiquement les mêmes ou le même nombres qui sont touchés par le retard).
pour envoyer les données sur le bus, il faut appeler cette instruction :
DmxSimple.write(Adresse,Valeur);
sauf que ça c'est pour une seule adresse, donc dans le code, je me retrouve avec plusieurs fois ce genre de chose à la suite. Probablement qu'il commence à écrire la trame DMX dès le premier DmxSimple.write, et les suivants seront pris en compte au prochain passage...
pour en avoir le coeur net, malin mais incompétent que je suis, j'ai ouvert le .ccp de la librairie pour tenter de comprendre comment il marche, et j'en ai déduis les choses suivantes :
- je ne vois pas d'appel à l'UART, donc il fabrique la trame DMX entièrement "à la main" à grand coup d'interruption, ce qui suppose que le code peut faire sa vie et d'un coup il saute dans la routine DMX, pour revenir dans le code, et ainsi de suite, d'où des éléments parfois incomplets à l'instant T.
- la présence de l'instruction
volatile uint8_t dmxBuffer[DMX_SIZE];me conforte dans l'idée qu'il rempli un tableau qu'il va dépiler ensuite un à un pour émettre sur le bus dansdmxSendByte(dmxBuffer[dmxState-1]); - la présence d'une variable
dmxStarted = 1;indique l'état de l'envoi, pourtant si j'appelledmxStarted;dans mon propre code pour savoir où il en est, ça ne marche pas, comme si cette variable était propre au.cppet que je ne pouvais pas l'utiliser dans mon propre code qui lui même utilise ce.cpp. - la présence d'une fonction
dmxEnd();qui stoppe l'envoie des trames DMX, accessible en mettant à 0 une des variables que je gère (nombre de canaux DMX).
Mon idée est la suivante, utiliser dmxEnd(); périodiquement, pour être certains que le tableau dmxBuffer[DMX_SIZE]; a eu le temps de se charger complétement, afin que quand je réactive dmxBegin(); il puisse envoyer la purée en une traite (ou plutôt en une trame).
Seulement je crains qu'en invoquant l’arrêt avec dmxEnd(); la fonction tableau se désactive également.
Alors voici (enfin) mes questions :
- Est-ce que l’arrêt
dmxEnd();empêcherait l'incrémentation du tableau ? - Si cela est hasardeux, est-ce qu'il existe un autre moyen de procéder pour qu'il n'envoie les données sur le bus que quand le tableau est stable ?
En gros est-ce qu'il est possible de faire comme avec certains écrans ou NEOPIXELS, de charger toutes les valeurs, puis ensuite, au bon moment envoyer une instruction pour qu'il dump sur le bus tout ce qui a été accumulé précédemment ?
merci à vous pour votre aide