Créer une trame DMX

Bonjour, j'aimerais savoir s'il est possible de créer une trame DMX sur arduino sans utiliser de bibliothèque ( puisque après avoir fait des recherches j'ai découvert qu'il existait une bibliothèque DMX simple) mais j'aimerais savoir si sans utiliser cette bibliothèque je peux créer et envoyer une trame DMX, si oui comment faire ? merci d'avance

Oui tu peux effectivement créer ta trame DMX de façon très rudimentaire. Par exemple avec des "HIGH" et "LOW" et des "delay". Est ce à cela que tu penses ? Ensuite il te suffit de connaitre le fonctionnement du protocole DMX. De souvenir, tu as au commencement un break de minimum 90ms, puis une mise a l’état haut de 8ms, et ensuite tu commences à envoyer ton code... As tu ces infos ?

Bonjour,

Oui tu peut, ça s'appelle du "bitbang". En gros tu recrées une trame avec une série de digitalWrite() et de delay().

Exemple avec une carte netduino en C# : http://forums.netduino.com/index.php?/topic/1501-simple-dmx-transmitter/

Bonjour désolé du retard j’ai eu des problèmes de connexion internet, merci d’avoir répondu si rapidement, oui j’ai eu ces informations, voila ce que j’ai eu comme idée de faire :

if (marche == 1){
digitalWrite (DMX,HIGH); // repos
delay(100);
digitalWrite (DMX,HIGH); //pause 1seconde
delay(200);
digitalWrite (DMX,LOW); // break debut paquet
delayMicroseconds(88);
digitalWrite (DMX,HIGH); // MAB
delayMicroseconds(8);
digitalWrite (DMX,LOW); // start bit
delayMicroseconds(4);
digitalWrite (DMX,LOW);//start code
delayMicroseconds(32);
octet = 0;
for (octet = 0; octet < 64; octet++){

digitalWrite (DMX,HIGH);delayMicroseconds(8);//stop
digitalWrite (DMX,LOW);delayMicroseconds(4); //start bit

digitalWrite (DMX,HIGH);delayMicroseconds(4); //octet 1
digitalWrite (DMX,LOW);delayMicroseconds(4);
digitalWrite (DMX,HIGH);delayMicroseconds(4);
digitalWrite (DMX,LOW);delayMicroseconds(4);
digitalWrite (DMX,HIGH);delayMicroseconds(4);
digitalWrite (DMX,HIGH);delayMicroseconds(4);
digitalWrite (DMX,HIGH);delayMicroseconds(4);
digitalWrite (DMX,HIGH);delayMicroseconds(4);

digitalWrite (DMX,HIGH);delayMicroseconds(8);//stop
digitalWrite (DMX,LOW);delayMicroseconds(4); //start bit

digitalWrite (DMX,LOW);delayMicroseconds(4); //octet 2
digitalWrite (DMX,LOW);delayMicroseconds(4);
digitalWrite (DMX,HIGH);delayMicroseconds(4);
digitalWrite (DMX,HIGH);delayMicroseconds(4);
digitalWrite (DMX,LOW);delayMicroseconds(4);
digitalWrite (DMX,HIGH);delayMicroseconds(4);
digitalWrite (DMX,HIGH);delayMicroseconds(4);
digitalWrite (DMX,HIGH);delayMicroseconds(4);

digitalWrite (DMX,HIGH);delayMicroseconds(8);//stop
digitalWrite (DMX,LOW);delayMicroseconds(4); //start bit

digitalWrite (DMX,LOW);delayMicroseconds(4); //octet 3
digitalWrite (DMX,LOW);delayMicroseconds(4);
digitalWrite (DMX,HIGH);delayMicroseconds(4);
digitalWrite (DMX,HIGH);delayMicroseconds(4);
digitalWrite (DMX,HIGH);delayMicroseconds(4);
digitalWrite (DMX,HIGH);delayMicroseconds(4);
digitalWrite (DMX,HIGH);delayMicroseconds(4);
digitalWrite (DMX,HIGH);delayMicroseconds(4);

digitalWrite (DMX,HIGH);delayMicroseconds(8);//stop
digitalWrite (DMX,LOW);delayMicroseconds(4); //start bit

digitalWrite (DMX,HIGH);delayMicroseconds(4); //octet 4
digitalWrite (DMX,HIGH);delayMicroseconds(4);
digitalWrite (DMX,LOW);delayMicroseconds(4);
digitalWrite (DMX,LOW);delayMicroseconds(4);
digitalWrite (DMX,LOW);delayMicroseconds(4);
digitalWrite (DMX,LOW);delayMicroseconds(4);
digitalWrite (DMX,LOW);delayMicroseconds(4);
digitalWrite (DMX,LOW);delayMicroseconds(4);

digitalWrite (DMX,HIGH);delayMicroseconds(8);//stop
digitalWrite (DMX,LOW);delayMicroseconds(4); //start bit
}
//for (Seconde = 0; Seconde < 10; Seconde++){delay(1000);}
}

J’ai l’impression que mon contrôleur arduino ( j’utilise une carte arduino mega 2560), car les bits ne font pas 4 micro secondes mais au minimum 4,8 ce qui dérègle tout mon programme , y aurait il une sortie sur la carte plus rapide qu’une autre ?

P.S : dans la citation je n'ai pas pu mettre tous les octets ( 8 octets pour une trame DMX)

Stiimen: J'ai l'impression que mon contrôleur arduino ( j'utilise une carte arduino mega 2560), car les bits ne font pas 4 micro secondes mais au minimum 4,8 ce qui dérègle tout mon programme , y aurait il une sortie sur la carte plus rapide qu'une autre ?

C'est la faute aux appels à digitalWrite() qui sont trés lent. Utilise la librairie digitalWriteFast ça devrait résoudre ton probléme ;)

Juste une question : pourquoi ne souhaite tu pas utiliser de librairie ? Personnellement j'utilise la lib DMX four universes.

Je n'arrive pas a faire marcher la bibliothèque dmxsimple, pourtant elle est dans mes librairies, et je n'avais pas connaissance de la bibliothèque DMX four universes. Serait il possible d'avoir un screen de la façon dont tu l'utilise ?

skywodd: C'est la faute aux appels à digitalWrite() qui sont très lent. Utilise la librairie digitalWriteFast ça devrait résoudre ton problème ;)

J'ai essayé de mettre des digitalwritefast après avoir intégrer la bibliothèque a mon arduino, j'ai un message d'erreur que je n'arrive pas a comprendre : Error:invalid type argument of 'unary*'

Merci de vos réponse j'en prend note. c'est pas facile Arduino quand on est débutant :sweat_smile:

Stiimen: J'ai essayé de mettre des digitalwritefast après avoir intégrer la bibliothèque a mon arduino, j'ai un message d'erreur que je n'arrive pas a comprendre : Error:invalid type argument of 'unary*'

Ton probléme vient d'un pointeur mal écrit quelque par, montre nous ton code si tu veut qu'on t'aide ;)

d'accord tenez voici un programme test que j'ai fais pour vous faire voir mon utilisation, je n'arrive pas a savoir si l'instruction est "digitalwrite" ou " digitalwritefast" en faisant des recherches j'ai trouver les deux, je n'arrive pas a comprendre d'ou vient cette erreur

La lib DMX four universes est là :

Par exemple un blink sur le cannal 1 (non vérifié) :

#include <lib_dmx.h>
#define    DMX512     (0) 

void setup() 
{
  ArduinoDmx0.set_control_pin(2); 
  ArduinoDmx0.set_rx_address(1); 
  ArduinoDmx0.set_rx_channels(512);
  ArduinoDmx0.init_rx(DMX512); 
}

void loop()
{
  ArduinoDmx0.TxBuffer [1] = 255 ;
  delay(1000);
  ArduinoDmx0.TxBuffer [1] = 0 ;
  delay(1000);
}

Stiimen: je n'arrive pas a savoir si l'instruction est "digitalwrite" ou " digitalwritefast" en faisant des recherches j'ai trouver les deux, je n'arrive pas a comprendre d'ou vient cette erreur

digitalwrite() = version (officielle) d'origine, lente mais qui marche sur n'importe quelle carte digitalwritefast() = version conçu par la communauté, rapide mais qui ne marche pas sur n'importe quelle carte.

Tu as bien pris la librairie ici ? http://code.google.com/p/digitalwritefast/downloads/list (il y a une version modifié pour l'arduino mega2560)

Sinon je ne vois pas d'erreur à première vu au niveau du code.

Bonjour , merci de m'avoir répondu et excuse moi de répondre seulement maintenant j'étais assez occupé, (cela dis ça m'as permit de faire une pose au niveau de la programmation qui me prenait la tête un peu )

Oui j'ai bien pris la librairie ici, et celle prévu pour la mega 2560

Quant au code j'ai trouvé le soucis il faut écrire non pas "DigitalWriteFast" mais "DigitalWriteFast2", grâce a cela j'ai pu arriver a créer un signal correct pour créer la trame dmx ( la trame doit être au minimum de 3.92 µs et au maximum de 4.08 µs, avec des digitalwritefast j'arrive a obtenir un signal de 4µs)