logo

OksiD DMX 3/1

3 sorties 1 entrée !

Copyright © 2004 Jean-Marc Lienher

prototype

Introduction :

OksiD DMX 3/1 est une interface DMX 512  utilisant le port parallèle standard (SPP) des ordinateurs compatibles IBM.

Elle comporte trois « univers » DMX en sortie et un « univers » DMX en entrée. Les deuxième et troisième « univers » de sortie sont optionnels.

Toutes les entrées et sorties comportent 512 canaux bufférisés.

Les performances en écriture vont de 40 écritures par secondes pour un « univers » complet et 9.8 lectures/écritures pour 3 sorties + 1 entrée. (Le maximum donné par la norme DMX 512 étant de 44 écritures par secondes).

L’interface fonctionne sous Linux et Windows 95, 98 et XP.

Le développement hardware et logiciel se fait de manière ouverte sous une licence de type BSD, ce qui signifie que tous les schémas et codes sources sont librement disponibles.

L’électronique :

L’interface est basée sur trois PIC18F452 cadencés à 32 MHz.

Le PIC « master » est relié au port parallèle du PC par un connecteur Centronics et gère l’entrée DMX, ainsi que le premier « univers » de sortie DMX. Il est aussi connecté au deux autres PIC par son interface série synchrone, deux broches servent également à indiquer quel est le « slave » auquel il s’adresse.

Les 5 broches de sorties du PIC « master » sont protégées contre les courts-circuits par des résistances de 100Ω, tant dis que les 8 broches d’entrées sont tirées vers la masse et protégées des surtensions par des résistances de 47Ω.

L’entrée DMX se fait par un connecteur XLR 3 ou 5 broches mâle, une résistance de terminaison de 120Ω 0.6W est insérée en parallèle sur les deux lignes différentielles de données. Le signal est converti par un driver de ligne RS-485 et est dirigé vers le PIC.

Les signaux des trois sorties DMX venant des PIC sont convertis par des drivers de lignes RS-485 et sont ensuite câblés à un connecteur XLR. Une résistance de pull-down est insérée à l’entrée du convertisseur qui servira à créer la séquence « BREAK » du protocole DMX 512 en plaçant la broche de sortie du PIC en haute impédance.

Une alimentation 5V stabilisée, un oscillateur 32MHz  et des condensateurs de découplages sont également présents.   

Le protocole de communication PC <-> PIC

Le protocole utilise les 8 bits « DATA » (D0-D7) sorties du port parallèle de PC et les 5 bits « Error, SelectIn, PaperEnd, Ack, Busy » d’entrées (IN3-IN7).

D7 indique si D0-D3 sont des données (0) ou si tout l’octet est une commande (1).

IN4-IN7 sont les demis octets renvoyés par le PIC.

Commandes :

D5-D6 indiquent le numéro du PIC (00 = master, 01 = slave1, 10 = slave2, 11=pré-reset)

 

D0-D3 indiquent la commande :

0000 : pas d’opération

0001 : écriture d’un bloque de 32 octets

0010 : lecture d’un bloque de 32 octets

0100 : numéro du block de donnée à lire/écrire

0101 : lecture de l’état des changements de valeur des bloques d’entrée DMX (4 octets)

1000 : reset

 

D4 et IN3 servent d’horloge.

Séquence :

Au départ D4 et IN3 sont à 1.

Le PC met la commande et les données sur D0-D3,D5-D7.

Le PC met D4 à 0.

Le PIC met les données sur IN0-IN3.

Le PIC met IN4 à 0.

Le PC met la commande et les données sur D0-D3,D5-D7.

Le PC met D4 à 1.

Le PIC met les données sur IN0-IN3.

Le PIC met IN4 à 1.

Les données sont lues et écrites par paquets de 32 octets pour un gain d’efficacité.

Le firmware du « master » spp2dmx.asm :

La boucle principale du programme, qui contient le code lié au port parallèle du PC, débute par la détection du flanc descendant sur le signal D4. Ensuite, selon l’état des signaux D0-D7, la boucle fait appel aux sous fonctions de lectures et écritures.

La sous fonction GetNibble est appelée quand D0-D3 sont des données. Quand les données sont destinées au « master », elle assemble des demis octets et les copie en mémoire en fonction du bloque courant. Quand la cible est un « slave », elle envoie directement les demis octets sur le port série synchrone (SendNibble).

La routine d’interruption est appelée par le  timer 0, qui sert à créer, en émission, le temps (88μs) pour le signal « BREAK », puis elle envoie le « start code ». En réception, elle sert aussi à détecter le « reset » de plus d’une seconde sur l’entrée DMX.

La routine est aussi appelée par l’UART.

En réception, le « start code » et les 512 octets sont lus et placés en mémoire. Le signal « BREAK » est détecté grâce au fait que le « stop bit » durant le « BREAK » n’est pas valide et donc, provoque une erreur.

En émission, les 512 octets des canaux sont envoyés successivement.

Le firmware des « slaves » slave2dmx.asm :

Le code des « slaves » est similaire à celui du « master », à la différence près que ce qui était dans la routine d’interruption a été déplacé dans la boucle principale.

La routine d’interruption sert quant à elle à la réception des données sur le port série synchrone.

Le driver Windows XP sys/okdmx31.c :

Ce code est destiné a être exécuté en mode noyau sous Windows NT/XP, il donne accès à tout les ports du PC et peut être une source de plantage total du PC.

Il contient le code destiné à initialiser l’interface et communiquer avec elle. Il fournit 3 appels systèmes qui seront utilisés par la dll : IOCTL_WRITE_DMX, IOCTL_READ_DMX, IOCTL_GET_STATUS_DMX.

La dll Windows dll/okdmx31.c:

Ce code est destiné à être exécuté en mode utilisateur et à être lié au programme utilisateur final.

Il contient deux fonctions : Okdmx31Read, Okdmx31Write. Cette dll sert aussi à installer automatiquement le driver sous Windows XP et sous Windows 95/98, elle utilise le code d’accès direct situé dans okdmx31_95.c.

Dans un souci de gain de performance, les fonctions de la dll font appellent au driver uniquement si les données contenues dans un bloque de 32 octets ont subies un changement.

Le programme final :

Il appel, à intervalles réguliers ou lors de changement d’état, Okdmx31Read et Okdmx31Write en leur passant l’adresse du port parallèle, le numéro de « l’univers » DMX et un buffer de 512 octets représentant l’état des canaux DMX.

Les points forts :

 

1 entrée et 3 sorties sur un seul port parallèle.

Port parallèle standard, utilisable sur les vieux PCs.

Ecriture par paquets de 32 canaux.

Pas d’utilisation du temps CPU lorsqu’il n’y a pas de changement d’état.

Les points faibles :

 

Grande consommation du temps CPU lors des changements d’états très rapides, une interface purement USB serait beaucoup plus efficace.

Références :

Schémas + firmware

http://www.oksid.ch/spp2dmx/index.html#source

Driver Linux

http://www.oksid.ch/spp2dmx/index.html#linux

Driver Windows

http://www.oksid.ch/spp2dmx/index.html#windows

Protocol DMX 512

http://membres.lycos.fr/epatix/

PIC18F452

http://ww1.microchip.com/downloads/en/DeviceDoc/39564b.pdf