Mise en oeuvre du bus DMX sous Linux

Expression du besoin

La gestion d’une régie d’éclairage DMX se fait généralement à l’aide de pupitre, ou console DMX. De plus en plus d’éclairagistes utilisent des interfaces informatiques (électronique numérique) leur permettant de gérer depuis des logiciels, via des adaptateurs (port série/DMX et surtout USB/DMX) des chaînes de projecteurs DMX.

DMX512

Le DMX512 (Digital Multiplexing) est une norme de transmission de données essentiellement utilisée pour le contrôle de l’éclairage et des effets de scène dans le monde du spectacle.

Le DMX 512 est à ce jour le protocole le plus répandu et le plus universel, (utilisés partout et par tous les fabricants de matériel d’éclairage scénique).

Le protocole DMX512 utilise généralement une liaison suivant la norme EIA RS 485 et cadencée à 250 kb/s. La transmission numérique unidirectionnelle se fait de façon sérialisée par liaison symétrique. La topologie est de type bus. La norme prévoit la mise en série de maximum 32 appareils sur une même ligne DMX.

Remarque : il est possible de brancher plus de 32 appareils en insérant sur la ligne un ou plusieurs boosters DMX.

Il permet de contrôler 512 canaux (donc 9 bits d’adressage) en affectant à chacun une valeur comprise entre 0 et 255 (donc 8 bits de données par canal).

Chaque appareil reçoit en même temps l’ensemble des 512 valeurs ce qui forme une « trame » DMX.

Remarque : La norme prévoit l’utilisation d’au maximum de 16 canaux par appareil. La réalité en est loin, certains appareils utilisent plus de 60 canaux, tandis que d’autres n’en utilisent qu’un.

Exemple : une lyre configurée pour le canal 81 avec 6 voies :

  • voie 1 (canal=81) : intensité. 0=éteint, 150 = intensité max, 150-245 = stroboscope, 245-255 = aléatoire.
  • voie 2 (82) : masque. Chaque masque correspond à 8 pas : 0-7 -> premier masque, 8-15 -> deuxième…
  • voie 3 (83) : couleur. Idem que pour les masques, mais avec une couleur : 0-7 = rouge, 8-15 = orange…
  • voie 4 (84) : diaphragme. 0-255 : règle l’ouverture du diaphragme
  • voie 5 (85) : panoramique (pan). 0-255 : permet de guider la lyre en rotation autour de son axe horizontal.
  • voie 6 (86) : assiette (tilt). 0-255 : permet de guider la lyre en rotation autour de son axe vertical.

Ainsi, la lyre va analyser le contenu de la trame DMX, et lire les valeurs des canaux 81 à 86, qu’elle affecte à sa voie 1, et les 5 canaux suivants (qu’elle affecte aux voies suivantes). Chaque constructeur d’appareil fournit ainsi la liste des valeurs et les effets associés.

La transmission se fait :

  • par un câble d’une paire blindée,
  • d’une impédance d’environ 120 ohms,
  • avec des connecteurs XLR de type 5 broches (standard de la norme) dont les broches 4 et 5 ne sont pas connectées, ou éventuellement de type 3 broches (ancienne convention de cablage),
  • électriquement en 5 volts.

La fréquence de rafraîchissement est de 44 Hz (ce qui signifie que la trame est envoyée 44 fois par seconde pour 512 canaux).

Remarques :

  • Le mode de transmission des données tendant à apparaître de plus en plus est l’utilisation de transmissions DMX WIFI.

  • Une nouvelle norme a été créée en parallèle de DMX512. Cette norme, nommée Art-Net, intègre les trames DMX dans des paquets Ethernet et permet un câblage plus simple (de type réseau informatique) et l’utilisation d’équipements comme les switchs, le Wi-Fi, etc.

Liens :

Interface Enttec DMX USB PRO

Le DMX USB PRO est une interface professionnelle pour connecter des ordinateurs PC et MAC afin de piloter des réseaux d’éclairage DMX512. Il est compatible avec une très large gamme de logiciels. Il est commercialisé autour de 125 euros.

Caractéristiques :

  • USB 2.0 Support on Windows PC and Apple OSX
  • Input or Output mode
  • RDM enabled
  • Internal frame buffering for steady DMX Generation
  • Drivers for Windows, OSX and Linux
  • Universe & user config EEPROM
  • Refresh Rate configurable from 1 to 40 Fps
  • Break configurable from 96uS to 1.3mS
  • MaB configurable from 10.6uS to 1.3mS
  • Upgradeable firmware

Site : www.enttec.com

Il est conseillé de lire ou de s’aider de ce document avant de poursuive.

Prise en charge

Avant :

$ lsusb > lsusb-avant.txt
$ lsmod > lsmod-avant.txt
$ dmesg > dmesg-avant.txt

Brancher maintenant un périphérique USB.

Après :

$ lsusb > lsusb-apres.txt
$ lsmod > lsmod-apres.txt
$ dmesg > dmesg-apres.txt

Analyse :

$ diff lsusb-avant.txt lsusb-apres.txt 
> Bus 001 Device 009: ID 0403:6001 Future Technology Devices International, Ltd FT232 USB-Serial (UART)

$ diff dmesg-avant.txt dmesg-apres.txt
> [31135.339716] usb 1-1.2.2: new full-speed USB device number 9 using ehci-pci
> [31135.438350] usb 1-1.2.2: New USB device found, idVendor=0403, idProduct=6001
> [31135.438355] usb 1-1.2.2: New USB device strings: Mfr=1, Product=2, SerialNumber=3
> [31135.438358] usb 1-1.2.2: Product: DMX USB PRO
> [31135.438360] usb 1-1.2.2: Manufacturer: ENTTEC
> [31135.438363] usb 1-1.2.2: SerialNumber: EN082570
> [31135.440523] ftdi_sio 1-1.2.2:1.0: FTDI USB Serial Device converter detected
> [31135.440554] usb 1-1.2.2: Detected FT232RL
> [31135.440557] usb 1-1.2.2: Number of endpoints 2
> [31135.440560] usb 1-1.2.2: Endpoint 1 MaxPacketSize 64
> [31135.440562] usb 1-1.2.2: Endpoint 2 MaxPacketSize 64
> [31135.440565] usb 1-1.2.2: Setting MaxPacketSize 64
> [31135.440990] usb 1-1.2.2: FTDI USB Serial Device converter now attached to ttyUSB0

$ diff lsmod-avant.txt lsmod-apres.txt 
> ftdi_sio               47922  0 
> usbserial              37161  1 ftdi_sio

$ modinfo ftdi_sio
filename:       /lib/modules/3.8.0-44-generic/kernel/drivers/usb/serial/ftdi_sio.ko
license:        GPL
description:    USB FTDI Serial Converters Driver
author:         Greg Kroah-Hartman <greg@kroah.com>, ...
srcversion:     EE9EA6BA3E0DB16B58328D6
...
alias:          usb:v0403p6001d*dc*dsc*dp*ic*isc*ip*in*
...
depends:        usbserial
intree:         Y
vermagic:       3.8.0-44-generic SMP mod_unload modversions 
parm:           vendor:User specified vendor ID (default=0x0403) (ushort)
parm:           product:User specified product ID (ushort)
parm:           ndi_latency_timer:NDI device latency timer override (int)

$ modinfo usbserial
filename:       /lib/modules/3.8.0-44-generic/kernel/drivers/usb/serial/usbserial.ko
license:        GPL
description:    USB Serial Driver core
author:         Greg Kroah-Hartman <gregkh@linuxfoundation.org>
srcversion:     36E7F356170866E98B422BB
depends:        
intree:         Y
vermagic:       3.8.0-44-generic SMP mod_unload modversions 
parm:           vendor:User specified USB idVendor (ushort)
parm:           product:User specified USB idProduct (ushort)

$ ls -l /dev/ttyUSB0 
crw-rw---- 1 root dialout 188, 0 nov.  18 16:34 /dev/ttyUSB0
  • le périphérique USB a été détecté physiquement par le noyau (cf. lsusb et dmesg)
  • c’est une interface DMX USB PRO (idProduct=6001) de “ENTTEC” (idVendor=0403)
  • ce périphérique (idVendor=0403, idProduct=6001) peut être pris en charge par le module chargeable ftdi_sio (cf. lsmod et modinfo)
  • le pilote de périphérique (driver) associé à ce matériel (ftdi_sio) a été chargé par le système (cf. dmesg et lsmod)
  • le périphérique sera accessible par le fichier spécial ttyUSB0 dans /dev (cf. ls)

Attention : le périphérique ne sera accessible en lecture/écriture que par l’utilisateur propriétaire root et les membres du groupe dialout.

Droits d’accès

Par défaut, le système applique la politique des droits d’accès rw-rw---- pour ce type de périphérique USB :

$ ls -l /dev/ttyUSB0 
crw-rw---- 1 root dialout 188, 0 nov.  18 16:34 /dev/ttyUSB0

Ici, le périphérique sera accessible en lecture/écriture par l’utilisateur propriétaire root et les membres du groupe dialout. Tous les autres (other) utilisateurs auront aucun accès.

Pour modifier cette situation, vous avez les possibilités suivantes :

  • changer les droits manuellement (à chaque fois !) : $ sudo chmod 666 /dev/ttyUSB0
  • ajouter l’utilisateur demandeur (ici toto) dans le groupe dialout : $ sudo adduser toto dialout

Pour une gestion automatique, il faudra passer par udev qui est maintenant le service qui prend en charge le répertoire /dev.

$ ls -l /dev/ttyUSB0 
crw-rw---- 1 root dialout 188, 0 nov.  18 16:34 /dev/ttyUSB0

$ sudo vim /etc/udev/rules.d/51-ttyusb.rules
SUBSYSTEMS=="usb", ATTRS{idVendor}=="0403", ATTRS{idProduct}=="6001", MODE="0666"

$ ls -l /dev/ | grep USB
crw-rw-rw-  1 root dialout   188,   0 nov. 18 17:08 ttyUSB0

Il est aussi possible de créer un lien symbolique au choix :

$ sudo vim /etc/udev/rules.d/51-ttyusb.rules
SUBSYSTEMS=="usb", ATTRS{idVendor}=="0403", ATTRS{idProduct}=="6001", MODE="0666", 
SYMLINK+="dmx_pro"

$ ls -l /dev/ | grep "\(USB\|dmx\)"
lrwxrwxrwx  1 root root             7 nov. 18 17:10 dmx_pro -> ttyUSB0
crw-rw-rw-  1 root dialout   188,   0 nov. 18 17:10 ttyUSB0

Ou de fixer le nom du fichier spécial :

$ sudo vim /etc/udev/rules.d/51-ttyusb.rules
SUBSYSTEMS=="usb", ATTRS{idVendor}=="0403", ATTRS{idProduct}=="6001", MODE="0666", 
NAME="ttyUSB1", SYMLINK+="dmx_pro"

$ ls -l /dev/ | grep "\(dmx\|USB\)"
lrwxrwxrwx  1 root root             7 nov. 18 17:12 dmx_pro -> ttyUSB1
crw-rw-rw-  1 root dialout   188,   0 nov. 18 17:12 ttyUSB1

Programmation

L’objectif est de réaliser une application permettant de commander un ensemble d’appareils (lyres, scanners, lasers etc.) compatibles avec le bus DMX512, bus standard du monde du spectacle.

Pour cela, on vous fournit la classe EnttecDMXUSB qui prendra en charge la dialogue avec l’interface Enttec DMX USB PRO (ou OPEN DMX USB).

Séquence 1 : détection de l’interface

On réalise un programme de test de détection utilisant la classe fournie :

#include <iostream>
#include <iomanip>
#include <string>
#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
#include <math.h>
#include <string.h>

#include "enttecdmxusb.h"

using namespace std;

// Par défaut
#define DMXDEVICE "/dev/ttyUSB0"

int main(int argc, char *argv[])
{
    if(argc != 2)
    {
        printf("Usage : %s peripherique\n", argv[0]);
        printf("Exemple : %s /dev/ttyUSB0\n", argv[0]);
        return 1;
    }
    printf("Peripherique : %s\n\n", argv[1]);    
    
    EnttecDMXUSB interfaceDMX(DMX_USB_PRO, argv[1]); // ou : EnttecDMXUSB interfaceDMX(DMX_USB_PRO, DMXDEVICE);
    string configurationDMX;
    
    if(interfaceDMX.IsAvailable())
    {
        configurationDMX = interfaceDMX.GetConfiguration();
        cout << "Interface " << interfaceDMX.GetNomInterface() << " detectee" << std::endl << configurationDMX << std::endl;
    }
    else
        cout << "Interface non detectee !" << endl;
   
    return 0;
}

Code source fourni : activite-test-enttec.zip

  1. Tester l’application fournie avec différentes situations :
  1. en branchant et débranchant l’interface Enttec DMX USB PRO
  2. avec plusieurs fichiers de périphériques (/dev/ttyUSB0, /dev/ttyUSB1, …)
  3. avec l’interface Enttec OPEN DMX USB

Séquence 2 : commander des appareils DMX

On vous demande de compléter l’application GUI fournie qui permet de contrôler à partir d’une console logicielle un ensemble d’appareils DMX512.

Le projet Qt contient les classes EnttecDMXUSB et MySlider à mettre en oeuvre.

Code source fourni : activite-appareils-dmx.zip

Le principe de commande d’un appareil DMX est assez simple :

EnttecDMXUSB *interfaceDMX;
QString interface = "/dev/ttyUSB0";

// instancie la classe EnttecDMXUSB
interfaceDMX = new EnttecDMXUSB(DMX_USB_PRO, interface.toStdString());

if(interfaceDMX->IsAvailable())
{
    // affiche la configuration
    std::string configurationDMX = interfaceDMX->GetConfiguration();
    qDebug() << "Interface DMX USB PRO detectee" << configurationDMX.c_str();

    // remet à zéro les valeurs des 512 canaux
    interfaceDMX->ResetCanauxDMX();
    // émet les valeurs des 512 canaux
    interfaceDMX->SendDMX();

    // fixe et émet la valeur du canal 1
    int canal  = 1;
    int valeur = 127;
    interfaceDMX->SetCanalDMX(canal, valeur);
    interfaceDMX->SendDMX();
}

delete interfaceDMX;
  1. Compléter l’application fournie en réalisant les tâches suivantes :
  1. créer la GUI
  2. assurer la connexion des signaux/slots
  3. définir les slots
  4. tester la commande effective d’au moins un appareil DMX

Retour au sommaire