DMX512 est un standard de commande d'éclairage très répandu dans la technique des scènes de théâtre et des discothèques. Il permet de contrôler à distance toutes sortes d'équipements de scène depuis une console centrale, simplement à travers un long bus à trois fils sur lequel les projecteurs sont chaînés. Mais peut-on utiliser un module Yoctopuce pour accéder à un bus DMX512 ?
Pourquoi faire ?
Etre capable de recevoir des messages DMX512 avec un Yocto-RS485-V2 vous ouvre tout un monde de possibilités pour faire vos propres systèmes contrôlés par une console DMX centrale. Plus besoin de chercher un appareil spécialisé piloté par DMX pour chaque artifice de scène: par exemple, quelques lignes de code suffiront à piloter automatiquement un relais ou un servo-moteur de modélisme, en fonction d'une commande reçue par DMX.
Par ailleurs, si vous construisez un système qui nécessite de nombreux contrôles analogiques, la réutilisation d'une console DMX standard peut vous faciliter grandement la réalisation de votre projet, même si votre projet est sans rapport avec la technique de scène. Inversement, être capable de piloter un bus DMX, cela vous permet d'utiliser ponctuellement pour un projet toutes sortes d'équipements d'éclairage et de signalisation assez faciles à mettre en œuvre.
Deux appareils DMX qui peuvent être utiles à vos projets
Alors, puisque nous publions cet article aujourd'hui, vous vous doutez que la réponse est oui: c'est possible. En réalité, la couche physique de DMX512 n'est autre qu'un bus RS-485. Donc, a priori, un Yocto-RS485-V2 va faire l'affaire. Mais il y aura quand même quelques subtilités du protocole DMX512 à prendre en compte...
Format des données DMX512
L'encodage des messages sur un bus DMX512 est extrêmement simple:
- Chaque message transporte jusqu'à 512 valeurs de commande.
- Les valeurs, comprises entre 0 et 255, sont toutes envoyées dans l'ordre.
- La valeur à l'offset 0 ne compte pas, elle est toujours à 0.
- Si vous donnez à un projecteur l'adresse 2, il s'allumera donc simplement en fonction de la valeur à l'offset 2.
On peut donc adresser jusqu'à 512 projecteurs monochromes sur un bus DMX512, d'où son nom. Mais les appareils modernes utilisent souvent plusieurs valeurs consécutives, pour piloter la puissance avec plus de finesse sur 16 bits, pour choisir la couleur, ou même pour piloter l'orientation du projecteur. Pour palier la limitation de l'espace d'adresses, on utilise alors plusieurs bus séparés, qui sont appelés des univers DMX séparés.
Les messages sont envoyés par la console DMX en continu, typiquement à une fréquence de 10 à 50 Hz. Pour transmettre autant de valeurs à cette fréquence, le bus DMX512 travaille à 250 kbps (8 bits, sans parité, 2 stop bits). Notez que les consoles de commande qui gèrent moins de 512 canaux envoient des messages plus courts, ce qui leur gagne du temps et leur permet d'augmenter la fréquence de rafraîchissement.
Dernière précision d'importance: pour permettre d'identifier le début des messages, ils sont précédés de l'envoi d'un break faisant au minimum la largeur de deux octets (~0.1 ms).
Branchement et configuration
DMX utilise des prises XLR à 3 ou 5 contacts:
Utilisation des contacts d'une prise XLR pour DMX512
Pour raccorder votre Yocto-RS485-V2 à un bus DMX512, le plus simple est probablement d'acheter un petit câble XLR correspondant à la norme de votre appareil et de le couper en deux. Il ne vous reste plus qu'à identifier chacun des fils à l'aide d'un testeur pour les mettre dans la bonne position du bornier du Yocto-RS485-V2.
Pour la configuration du module, utilisez les paramètres ci-dessous:
Configuration du Yocto-RS485-V2 pour DMX512
Le délai entre les messages n'a pas d'importance, puisque le break envoyé au début de chaque message va automatiquement engendrer une séparation adéquate.
Ecouter un bus DMX512 avec un Yocto-RS485-V2
Contrairement au cas où vous utiliseriez une interface RS485 traditionnelle, avec le Yocto-RS485-V2 il n'est pas nécessaire que votre programme lise le flux de données en continu: vous pouvez à tout moment utiliser simplement
pour récupérer le message DMX entièrement reçu le plus récent.
Mais il est possible de faire encore plus efficace: vous pouvez définir un job dans le Yocto-RS485-V2 qui analyse les messages et extrait directement les valeurs qui vous intéressent (pour une introduction sur ce sujet, consultez le manuel ou ce précédent article). Par exemple, si vous êtes intéressé par les valeurs aux positions 1 à 3, définissez un job avec une tâche custom qui contient la commande suivante:
expect 00($1:BYTE)($2:BYTE)($3:BYTE).*
Cela aura pour effet d'extraire les valeurs correspondantes, et de les affecter directement à genericSensor1..3. Si vous utilisez des valeurs sur 16 bits, en utilisant le mot-clé WORD à la place de BYTE vous pourrez même les décoder directement.
Pour que cela fonctionne, il y a juste une petite subtilité à respecter: n'utilisez pas une tâche réactive, comme on le fait habituellement dans ce cas, mais utilisez une tâche périodique en fonction de la fréquence de rafraîchissement que vous désirez utiliser - par exemple une période de 25 ms pour un rafraîchissement à 40 Hz. Cela vous affranchira du risque de surcharger le Yocto-RS485-V2 dans le cas où la console envoie ses messages plus vite qu'il n'arrive à les traiter. Dans tous les cas, il n'y a pas de risque de perte d'information puisque tous les messages répètent l'état de toutes les valeurs.
Voici donc à quoi doit ressembler votre tâche:
Tâche pour le décodage automatique de messages DMX512
Et pour vous prouver que cela fonctionne, voici une petite application en Python qui lit trois valeurs sur le bus DMX512 et affiche un vumètre correspondant sur un écran à base de dalles NeoPixel, raccordé par Ethernet, que nous avions construit pour un précédent article.
Notre vumètre DMX512 'fait maison'
Le code de cet exemple est disponible sur GitHub.
Piloter un appareil DMX512 avec un Yocto-RS485-V2
Envoyer un message DMX avec le Yocto-RS485-V2 est encore plus simple: il suffit de mettre les valeurs désirées dans un tableau d'entiers et d'utiliser
- la méthode sendBreak(1) pour signaler le début du message
- la méthode writeArray(msg) pour envoyer les valeurs
N'oubliez pas que la valeur à l'offset zéro de votre tableau n'est pas utilisée et doit toujours être zéro.
Voici donc une deuxième petite application en Python qui lit l'orientation d'un Yocto-3D-V2 et oriente un petit projecteur motorisé DMX512 dans la même direction. La couleur projetée est choisie en fonction de l'angle d'inclinaison sur le 3e axe (l'axe de roulis).
Notre manette gyroscopique DMX512
Le code de cet exemple est aussi disponible sur GitHub.
Conclusion
Le Yocto-RS485-V2 est donc parfaitement adapté à intégrer des appareils DMX512 dans vos projets divers et variés.
Par contre, si votre but est uniquement de piloter des appareils de scène avec un logiciel de contrôle DMX512 existant, vous aurez tout intérêt à utiliser un simple adaptateur DMX512 grand public qui, même s'il est moins subtil, est nativement supporté par votre logiciel.