Tir d'artifice en DMX avec ecran lcd et test de lignes

Bonjour, nouveau dans la programmation d’arduino je me lance dans la programmation d’un banc de tir d’artifice controlé en DMX .
je suis dans le spectacle donc le dmx est obligatoire car ce projet sera controlé via une console lumiere.

pour la suite :

  • un ecran lcd 16/2 qui permettra d adresser l’appareil et qui pourra servir de test de ligne artifices
    a savoir que les amorceurs font a peu pres 1.5 ohms de resistance .

en sortie de ça, 24 contacteurs qui enverront la sauce aux amorceurs

mon premier problème commence avec le shield dmx en mode slave pour pouvoir donner une adresse dmx de départ a l’aide de 3 boutons (+,- et validation)

apres ça j’aimerais bien avec 3 mode avec un contacteur a clé : 1 mode off et assignation dmx;
1 mode test ligne et un mode feu .

j’ai déjà un arduino uno avec le shield dmx pour effectuer les tests de base mais je pense que je serai obligé de passer sur un arduino méga pour avoir le nombre de sorties requises .

qu’en pensez vous et avez vous des idées ???

merci d’avance .

maxi-light: Bonjour, nouveau dans la programmation d'arduino je me lance dans la programmation d'un banc de tir d'artifice controlé en DMX . je suis dans le spectacle donc le dmx est obligatoire car ce projet sera controlé via une console lumiere.

pour la suite : - un ecran lcd 16/2 qui permettra d adresser l'appareil et qui pourra servir de test de ligne artifices a savoir que les amorceurs font a peu pres 1.5 ohms de resistance .

Bonsoir Tu te situes où pour engager ce "projet" : Tu es dèjà artificier ? ( je ne pense pas vu le vocabulaire utilisé :grin: ) Tu es un "homme des lumieres" ?

effectivement je suis éclairagiste !!!!! (bien vu !!) je travaille régulièrement avec du feu froid ,c'est pour cela que j'essai de fabriquer un produit qui est en corrélation avec notre système de commande . je me limite a du feu froid car artificier est un vrai métier et j'ai plein de potes pour ça avec des autorisations de tir voila pour la situation !!!!!!!!

pour l'avancement j'arrive a changer l'adresse dmx de depart mais celle ci reviens a 1 en cas de coupure de jus .(embêtant)

maxi-light: effectivement je suis éclairagiste !!!!! (bien vu !!) je travaille régulièrement avec du feu froid ,c'est pour cela que j'essai de fabriquer un produit qui est en corrélation avec notre système de commande . je me limite a du feu froid car artificier est un vrai métier et j'ai plein de potes pour ça avec des autorisations de tir voila pour la situation !!!!!!!!

pour l'avancement j'arrive a changer l'adresse dmx de depart mais celle ci reviens a 1 en cas de coupure de jus .(embêtant)

Le vrai reel probleme là est "simplement" la gestion de la securité sur les lignes d'ordres . tu prend le probleme à l'envers (DMX ou autre vecteur de commande) Il faut "blinder" la secu avant de penser à commander.

expose déjà ce que toi tu vois "en securité" derriere un pin d'arduino (ou n'importe quoi d'autre) qui injecterait un signal "ON" 8)

j'y est déjà pensé car je suis pas la pour cramer mes potes !!!

déjà , comme toutes table de tir , un contacteur a clé !!

de plus la gestion de l'alim des contacteurs sera validé par un mec du plateau (regisseur backliner etc ) qui pourra verifier que personne ne crains rien !!!!

je pense a un poussoir en NO avec deport de cable pour pouvoir le placer a l'endroit strategique

maxi-light: je pense a un poussoir en NO avec deport de cable pour pouvoir le placer a l'endroit strategique

bonjour Par secu les lignes doivent etre mises en CC franc (gros crossbar) le contacteur clef doit en position de tir/test continuité lever le CC (et en mode test isoler +/- des batteries d'infla.

mets déjà sur papier la secu en partant des infla

j'ai déjà une table vieille table d'artifice ou je vais récupérer ce système il n'y a pas de souci la dessus

voila deja une partie de mon code !!!

#include <Conceptinetics.h>
#include "LiquidCrystal.h" 
LiquidCrystal lcd(3,4,5,6,7,8); //liaison 4 bits de données

#define DMX_SLAVE_CHANNELS   8 
const int bmoins=11;
const int bplus=12;
int etat;
int nombre=1;
int mplus= HIGH;

int mmoins=HIGH;

DMX_Slave dmx_slave ( DMX_SLAVE_CHANNELS );


const int feu1 = 22;
const int feu2 = 23;
const int feu3 = 24;
const int feu4 = 25;
const int feu5 = 26;
const int feu6 = 27;
const int feu7 = 28;
const int feu8 = 29;
void setup() {             
  pinMode(bplus,INPUT_PULLUP);
  pinMode(bmoins,INPUT_PULLUP);
digitalWrite (bplus, HIGH);
digitalWrite (bmoins, HIGH);
etat = HIGH;

 dmx_slave.enable ();  
  lcd.begin(16,2);



 

pinMode ( feu1, OUTPUT );
pinMode ( feu2, OUTPUT );
pinMode ( feu3, OUTPUT );
pinMode ( feu4, OUTPUT );
pinMode ( feu5, OUTPUT );
pinMode ( feu6, OUTPUT );
pinMode ( feu7, OUTPUT );
pinMode ( feu8, OUTPUT );





}

// the loop routine runs over and over again forever:
void loop() 
{etat=digitalRead(bplus);
if((etat != mplus) && (etat== LOW))
{
nombre++;}
mplus = etat;
etat= digitalRead(bmoins);
if((etat!= mmoins) && (etat==LOW))
{
nombre--;}
mmoins=etat;

if(nombre>512)
{nombre=1;}
if(nombre<1)
{nombre=512;}
lcd.clear();
lcd.setCursor(0,1);
lcd.print(nombre);
dmx_slave.setStartAddress (nombre);
 if ( dmx_slave.getChannelValue (1) > 127 )
   digitalWrite ( feu1, LOW );
 else
   digitalWrite ( feu1, HIGH );

     if ( dmx_slave.getChannelValue (2) > 127 )
   digitalWrite ( feu2, LOW );
 else
   digitalWrite ( feu2, HIGH );
       if ( dmx_slave.getChannelValue (3) > 127 )
   digitalWrite ( feu3, LOW );
 else
   digitalWrite ( feu3, HIGH );
   
       if ( dmx_slave.getChannelValue (4) > 127 )
   digitalWrite ( feu4,LOW );
 else
   digitalWrite ( feu4, HIGH );
       if ( dmx_slave.getChannelValue (5) > 127 )
   digitalWrite ( feu5, LOW );
 else
   digitalWrite ( feu5, HIGH );
       if ( dmx_slave.getChannelValue (6) > 127 )
   digitalWrite ( feu6, LOW );
 else
   digitalWrite ( feu6, HIGH );
       if ( dmx_slave.getChannelValue (7) > 127 )
   digitalWrite ( feu7, LOW );
 else
   digitalWrite ( feu7, HIGH );
       if ( dmx_slave.getChannelValue (8) > 127 )
   digitalWrite ( feu8, LOW );
 else
   digitalWrite ( feu8, HIGH );

mes problèmes maintenant sont : -mémoriser ma valeur nombre (dmx) pour ne pas la perdre au redémarrage( en rajoutant un bouton valid par exemple) -pouvoir faire defiler les valeurs dmx plus rapidement en tenant appuyé le bouton

pour la suite du projet : -rajouter un canal dmx en sécurité qui ne me mettrais on le système que pendant un temps donné -rajouter un bouton qui me permettrais de passer de l’Ohmmètre (en cours de rédaction ) a l'assignation dmx

déjà merci d'avance !!!!!!

bonjour
mets ton code entre balises code (icone </>)
Perso je regarderais en fin de journée

Artouste:
bonjour
mets ton code entre balises code (icone </>)
Perso je regarderais en fin de journée

Modifié désolé !!! c’est la première fois que je postais un code !!!

j’ai avancé un peu entre temps , j’ai rajouté un bouton valid et c’est a ce moment que j’aimerais stocker la variable nombre pour pouvoir la rappeler a la remise en route de l’arduino.

#include <Conceptinetics.h>
#include "LiquidCrystal.h" 
LiquidCrystal lcd(3,4,5,6,7,8); //liaison 4 bits de données

#define DMX_SLAVE_CHANNELS   25 
const int bmoins=11;
const int bplus=12;
const int valid=13;
int etat;
int etat2;
int nombre=1;
 int mplus= HIGH;
int mvalid= HIGH;
int mmoins=HIGH;

DMX_Slave dmx_slave ( DMX_SLAVE_CHANNELS );


const int feu1 = 22;
const int feu2 = 23;
const int feu3 = 24;
const int feu4 = 25;
const int feu5 = 26;
const int feu6 = 27;
const int feu7 = 28;
const int feu8 = 29;
void setup() {             
   pinMode(bplus,INPUT_PULLUP);
   pinMode(bmoins,INPUT_PULLUP);
   pinMode(valid,INPUT_PULLUP);
digitalWrite (bplus, HIGH);
digitalWrite (bmoins, HIGH);
digitalWrite (valid, HIGH);
etat = HIGH;
 
  dmx_slave.enable ();  
   lcd.begin(16,2);
 
 

  

pinMode ( feu1, OUTPUT );
pinMode ( feu2, OUTPUT );
pinMode ( feu3, OUTPUT );
pinMode ( feu4, OUTPUT );
pinMode ( feu5, OUTPUT );
pinMode ( feu6, OUTPUT );
pinMode ( feu7, OUTPUT );
pinMode ( feu8, OUTPUT );





}


void loop() 
{etat=digitalRead(bplus);
 if((etat != mplus) && (etat== LOW))
 {lcd.clear();
nombre++;}
mplus = etat;
etat= digitalRead(bmoins);
 if((etat!= mmoins) && (etat==LOW))
 {lcd.clear();
nombre--;}
mmoins=etat;

if(nombre>512)
{nombre=1;}
if(nombre<1)
{nombre=512;}
lcd.setCursor(1,0);
lcd.print("adressage DMX");
lcd.setCursor(0,1);
lcd.print(nombre);
 
 
etat2=digitalRead(valid);
 if((etat2 != mvalid) && (etat==HIGH))
 {lcd.setCursor(14,1);
lcd.print("ok");}
 
 
 
 
 dmx_slave.setStartAddress (nombre);
  if ( dmx_slave.getChannelValue (1) > 127 )
    digitalWrite ( feu1, LOW );
  else
    digitalWrite ( feu1, HIGH );

      if ( dmx_slave.getChannelValue (2) > 127 )
    digitalWrite ( feu2, LOW );
  else
    digitalWrite ( feu2, HIGH );
        if ( dmx_slave.getChannelValue (3) > 127 )
    digitalWrite ( feu3, LOW );
  else
    digitalWrite ( feu3, HIGH );
    
        if ( dmx_slave.getChannelValue (4) > 127 )
    digitalWrite ( feu4,LOW );
  else
    digitalWrite ( feu4, HIGH );
        if ( dmx_slave.getChannelValue (5) > 127 )
    digitalWrite ( feu5, LOW );
  else
    digitalWrite ( feu5, HIGH );
        if ( dmx_slave.getChannelValue (6) > 127 )
    digitalWrite ( feu6, LOW );
  else
    digitalWrite ( feu6, HIGH );
        if ( dmx_slave.getChannelValue (7) > 127 )
    digitalWrite ( feu7, LOW );
  else
    digitalWrite ( feu7, HIGH );
        if ( dmx_slave.getChannelValue (8) > 127 )
    digitalWrite ( feu8, LOW );
  else
    digitalWrite ( feu8, HIGH );
    
  
}

maxi-light: j'ai avancé un peu entre temps , j'ai rajouté un bouton valid et c'est a ce moment que j'aimerais stocker la variable nombre pour pouvoir la rappeler a la remise en route de l'arduino.

L'ideal est de stocker en eeprom l'adresse dmx selectionnée et au reset (setup) simplement la relire.

ok pour le stockage eeprom !!!(meme si ça à été dur et pas forcément catholique lol )!!!

problème suivant :
faire défiler automatiquement les nombres si on laisse son doigt appuyé sur le bouton (pour limiter les appuis )

voici déjà mon code (promis je vais mettre des annotations ) !!!

#include <Conceptinetics.h>
#include "LiquidCrystal.h" 
#include <EEPROM.h>


LiquidCrystal lcd(3,4,5,6,7,8); //liaison 4 bits de données

#define DMX_SLAVE_CHANNELS   25 
const int bmoins=11;
const int bplus=12;
const int valid=13;
int etat;
int etat2;
int nombre=EEPROM.read(0)+EEPROM.read(1)+1;
 int mplus= HIGH;
int mvalid= HIGH;
int mmoins=HIGH;
int dmx1;
int dmx2;
DMX_Slave dmx_slave ( DMX_SLAVE_CHANNELS );


const int feu1 = 22;
const int feu2 = 23;
const int feu3 = 24;
const int feu4 = 25;
const int feu5 = 26;
const int feu6 = 27;
const int feu7 = 28;
const int feu8 = 29;
void setup() {             
   pinMode(bplus,INPUT_PULLUP);
   pinMode(bmoins,INPUT_PULLUP);
   pinMode(valid,INPUT_PULLUP);
digitalWrite (bplus, HIGH);
digitalWrite (bmoins, HIGH);
digitalWrite (valid, HIGH);
etat = HIGH;
 
  dmx_slave.enable ();  
   lcd.begin(16,2);
 


pinMode ( feu1, OUTPUT );
pinMode ( feu2, OUTPUT );
pinMode ( feu3, OUTPUT );
pinMode ( feu4, OUTPUT );
pinMode ( feu5, OUTPUT );
pinMode ( feu6, OUTPUT );
pinMode ( feu7, OUTPUT );
pinMode ( feu8, OUTPUT );


 lcd.setCursor(14,1);


}


void loop() 

 
{etat=digitalRead(bplus);
 if((etat != mplus) && (etat== LOW))
 {lcd.clear();
nombre++;}
mplus = etat;
etat= digitalRead(bmoins);
 if((etat!= mmoins) && (etat==LOW))
 {lcd.clear();
nombre--;}
mmoins=etat;

if(nombre>488)
{nombre=1;}
if(nombre<1)
{nombre=488;}
lcd.setCursor(1,0);
lcd.print("adressage DMX");
lcd.setCursor(0,1);
lcd.print(nombre);
 
 
etat2=digitalRead(valid);
 if((etat2 != mvalid) && (etat==HIGH))
 {lcd.setCursor(14,1);
lcd.print("ok");
EEPROM.write(0, nombre);
if (nombre>255)
{EEPROM.write(1, 255);}
else
{EEPROM.write(1, 0);}
 
 }
 dmx_slave.setStartAddress (nombre);
  if ( dmx_slave.getChannelValue (1) > 127 )
    digitalWrite ( feu1, LOW );
  else
    digitalWrite ( feu1, HIGH );

      if ( dmx_slave.getChannelValue (2) > 127 )
    digitalWrite ( feu2, LOW );
  else
    digitalWrite ( feu2, HIGH );
        if ( dmx_slave.getChannelValue (3) > 127 )
    digitalWrite ( feu3, LOW );
  else
    digitalWrite ( feu3, HIGH );
    
        if ( dmx_slave.getChannelValue (4) > 127 )
    digitalWrite ( feu4,LOW );
  else
    digitalWrite ( feu4, HIGH );
        if ( dmx_slave.getChannelValue (5) > 127 )
    digitalWrite ( feu5, LOW );
  else
    digitalWrite ( feu5, HIGH );
        if ( dmx_slave.getChannelValue (6) > 127 )
    digitalWrite ( feu6, LOW );
  else
    digitalWrite ( feu6, HIGH );
        if ( dmx_slave.getChannelValue (7) > 127 )
    digitalWrite ( feu7, LOW );
  else
    digitalWrite ( feu7, HIGH );
        if ( dmx_slave.getChannelValue (8) > 127 )
    digitalWrite ( feu8, LOW );
  else
    digitalWrite ( feu8, HIGH );
    
  
}

maxi-light:
ok pour le stockage eeprom !!!(meme si ça à été dur et pas forcément catholique lol )!!!

problème suivant :
faire défiler automatiquement les nombres si on laisse son doigt appuyé sur le bouton (pour limiter les appuis )

Il faut te pencher maintenant sur la fonction millis() :grin:

Je me pencherais la dessus ce week si le temps me le permet !!!!!!! Merci de l'info !!!!!

Pour la partie ohmmètre , que pensez vous de ça ????

http://www.circuitstoday.com/ohmmeter-using-arduino

Ça me parais cool en réduisant un peu les résistances car je n'ai pas besoin de toute cette gamme de mesure !!!!!

maxi-light:
Je me pencherais la dessus ce week si le temps me le permet !!! Merci de l’info !!!

Pour la partie ohmmètre , que pensez vous de ça ???

http://www.circuitstoday.com/ohmmeter-using-arduino

Ça me parais cool en réduisant un peu les résistances car je n’ai pas besoin de toute cette gamme de mesure !!!

bonjour
le test de ligne doit etre fait sous une tension faible et une intensité dispo limitée.
en fait c’est plus un test de continuité que de “mesure de resistance”
J’utiliserais un pont diviseur en sortie (pour arriver à une tension injectée de l’ordre de 2/3V et j’intercalerais dans le circuit de test un fusible rapide calibré pour qq mA.
“on” pourrait utiliser le 3.3V dispo , mais passer par un diviseur de tension derriere un pin en 5V output permet de conserver une secu supplemetaire (Imax possible sur un pin en output )
Dans tes presta tu va au max utiliser combien d’infla en serie ?

Artouste: bonjour le test de ligne doit etre fait sous une tension faible et une intensité dispo limitée. en fait c'est plus un test de continuité que de "mesure de resistance" J'utiliserais un pont diviseur en sortie (pour arriver à une tension injectée de l'ordre de 2/3V et j'intercalerais dans le circuit de test un fusible rapide calibré pour qq mA. "on" pourrait utiliser le 3.3V dispo , mais passer par un diviseur de tension derriere un pin en 5V output permet de conserver une secu supplemetaire (Imax possible sur un pin en output ) Dans tes presta tu va au max utiliser combien d'infla en serie ?

10 maxi !!!!!! Ca en fais déjà assez !!!!! A 1 ohm par infla plus la résistance du cable je dois mesurer une résistance entre 5 et 100 ohms !!!! Je pense rajouter les textes : " circuit ouvert " et " court circuit " pour ses cas la .

Bonne idée le petit fusible !!!!!!!!!!

salut !!! de retour après une grosse semaine de prestations !!! (féria de nimes )

je me poserais demain sur cette fonction millis !!!

quelqu’un pourrais me donner des liens vers des exemples car ma dernière recherche est resté tres flou vis a vis de cette fonction .

de plus mon shield dmx au démarrage bugue quand le dmx est envoyé .
quelqu’un a déjà eu ce genre de problème ???