Accueil > ARDUINO > Communication > DMX : Arduino en mode esclave
lundi 8 février 2016, par
https://fr.wikipedia.org/wiki/DMX_%28%C3%A9clairage%29
http://sitelec.org/cours/abati/dmx/dmx.htm
Le DMX512 est basé sur un bus série multipoint. Il permet de relier l’ensemble des effets de scène à un contrôleur. Il utilise le protocole RS485 pour la couche matérielle.
Le contrôleur est le maitre et les effets de scène sont les esclaves.
Chaque esclave est assigné à une ou plusieurs adresses ce qui lui permet de recevoir des ordres codés sur 8 bit (de 0 à 255).
Par exemple, un ensemble avec 3 led RVB utilisera 3 adresses, ce qui permettra de commander la puissance d’éclairage de chacune des lampes par un code entre 0 et 255.
Si les effets de scène sont motorisés, un canal peut être aussi utilisé pour commander les moteurs (position, vitesse...).
La trame DMX
La trame DMX est constituée de 24 à 512 canaux (valeurs pour chaque adresse). L’ensemble des informations (valeurs de chaque canaux) est transmise par le contrôleur et les effets de scène ne liront que la valeur concernant leurs adresses.
Exemple de trame :
La bibliothèque est issue du site suivant : http://www.mathertel.de/Arduino/DMXSerial.aspx.
Il faut installer les fichiers DMXSerial.cpp et DMXSerial.h dans le répertoire Library/DMXSerial de l’environnement arduino.
Ce schéma utilise un module qui comporte un MAX485 qui permet l’adaptation entre la carte arduino (0V-5V) et RS485.
Les broches :
DI | driver input | DE | driver output Enable |
---|---|---|---|
RO | Receive output | /RE | Receiver output enable |
Vcc | Alimentation 5V | GND | masse 0V |
A | Data + (paire différentielle) | B | Data - (paire différentielle) |
Remarque : RE et DE sont en général reliés ensemble (fonctionnement half duplex du module MAX485. Dans le cas présent, nous n’utilisons que le mode réception.
/RE DE | Etat |
---|---|
0 | Mode récéption RS485 -> Arduino |
1 | Mode émission Arduino -> RS485 |
Remarque : cette manip n’est pas possible avec une carte UNO car il n’y a pas de sortie PWM sur la broche 13 où se trouve la led L.
Pour gérer l’éclairage de la led, j’utilise la commande :
analogWrite(broche 13,rapport cyclique)
qui permet d’avoir une commande PWM sur la broche 13. Le rapport cyclique est codé sur 8 bit et varie donc de 0 à 255. Du fait de la persistance rétinienne (fréquence supérieure à 24Hz), l’œil ne verra pas les impulsions, mais une luminosité moyenne qui dépendra du rapport cyclique.
Signal de sortie PWM :
Dans ce cas, la carte Arduino est à l’adresse 1 et lit donc les informations concernant le canal 1.
La liaison série via USB (Serial) ne sert qu’à visualiser les informations reçues.
#include <DMXSerial.h> int outPin = 13; // void setup () { // initialisation de la liaison en mode réception DMXSerial.init(DMXReceiver); // broche 13 en sortie pinMode(outPin, OUTPUT); Serial.begin(9600); while (!Serial) { } } void loop() { // DMXSerial.read(1) permet de lire le canal1 Serial.print("canal 1 : "); Serial.println(DMXSerial.read(1)); // affichage de la valeur lue // commande de la sortie 13 en fonction de la commande DMX reçue analogWrite(outPin,DMXSerial.read(1)); delay(500); }
Encore une fois, la liaison série (Serial) n’est utilisée que pour afficher les valeurs lues.
#include <DMXSerial.h> const int outPin = 13; // PWM output pin for Light. void setup () { DMXSerial.init(DMXReceiver); pinMode(outPin, OUTPUT); Serial.begin(9600); while (!Serial) { } } void loop() { Serial.print("canal 0 : "); Serial.print(DMXSerial.read(0)); Serial.print("\t canal 1 : "); Serial.print(DMXSerial.read(1)); Serial.print("\t canal 2 : "); Serial.println(DMXSerial.read(2)); delay(500); }