Go Down

Topic: [Projet MEGA2560] Dimmer DMX 220V - 9 x 20A + 3 "aux" (Read 8748 times) previous topic - next topic

Super_Cinci

Pour ceux qui ont vu mes dernières interventions, je me lance dans la diffusion de ce projet.

En gros, je compte faire un truc de ce genre :



Entrées :
- secteur triphasé (ou biphasé, monophasé, au choix) 220V 3 x 60A (rien que ça, on attaque lourd ]:D !)
- signal DMX512

Sorties :
- 9 voies dimmer 220V-20A chaque
- 3 "auxiliaires" : dimmer, on / off ou relais (commandes machine à fumée par exemple), on verra plus tard.

J'annonçais fièrement un dimmer 12 voies, mais malheureusement, la mega2560 a ses limites, et à cause des timers, pas moyen de trouver une solution.

Les fonctions à développer dans l'arduino :
- réception DMX (timer2, USART2)
- interface 0-10V (analog0 à analog11)
- génération signaux dimmer (timer1, timer3, timer4), un timer par phase, trois comparateurs par timer.
- gestion des 3 voies auxiliaires (timer5)
- communication USB (USART0) (*)
- gestion des phases du secteur (INT0, INT1, INT2, timer5)
- configuration (clavier 4x4 + LCD) (*)
- affichage (quelque leds)
- switch DMX (timer2, USART2) (*)
(*) : dans l'idée, mais en option pour l'instant.

J'avais aussi pensé à une version adaptée pour UNO, mais ça nous restreint à 2 voies, ce qui peut paraître un peu léger.

Pour l'instant, j'en suis à la rédaction de l'étude technique avec quelques essais de validation :



On y trouve :
- sur la plaque d'essai : le circuit détecteur 0V délivrant une impulsion TTL de largeur réglable à chaque passage à 0 (ce qui permet de déclencher une interruption un peu avant le passage à 0, histoire que le programme ait le temps de réagir et compenser un éventuel retard du au transfo...)
- une lampe de bureau 12V modifiée pour y brancher le triac sur le 12V (plus facile pour y coller l'oscilo dans un premier temps, le triac commute donc sur 1.8A)
- une petite plaque bleue comprenant 1 optotriac et triac pour les tests de longueur d'impulsions, temps de conduction etc etc...
- du bazar, comme chez tout le monde...

A ce jour, la détection 0V marche, un potar sur A0 permet de commander le timer1, l'optotriac est commandé par la sortie OC1A, et ça marche impeccable!
Code: [Select]

void t134_setup(){     // initialisation des timers 1, 3 et 4
  DDRB |= 0xE0;            // T1 : voies 01, 04, 07
  TCCR1A = 0xFE;         // Utilisation des trois comparateurs du timer 1
  ICR1 = 0xFFFF;
  TCCR1B = 0x1A;         // Préparation du timer 1, mise en attente
}

void raz_ph1() {  // phase de référence, mode 3 phases couplées
  TCNT1 = 0xFFFE;        // RAZ T1 
}

void setup(){
  pinMode(A0, INPUT);  // entrée analogique de commande
  pinMode(21, INPUT);  // entrée INT0 passage à 0 secteur phase 1
  t134_setup();           // initialisation des timers
  attachInterrupt(2, raz_ph1, RISING);  // active l'interruption de passage à O secteur phase 1
}

void loop(){
  OCR1A = analogRead(A0) * 20;    // soit une valeur entre 0 et 20 460 envoyée au comparateur A de T1
}


Je mettrai en ligne mon étude de projet pour ceux qui voudront suivre le développement, il faut que j'ai terminé pour le mois de juin cette année, pour une première sortie grandeur nature.

Artouste


Pour ceux qui ont vu mes dernières interventions, je me lance dans la diffusion de ce projet.


- 9 voies dimmer 220V-20A chaque
- 3 "auxiliaires" : dimmer, on / off ou relais (commandes machine à fumée par exemple), on verra plus tard.


Je mettrai en ligne mon étude de projet pour ceux qui voudront suivre le développement, il faut que j'ai terminé pour le mois de juin cette année, pour une première sortie grandeur nature.

projet ambitieux compte tenu des puissances
tu utilise quoi comme triacs ? du 20A 400V courant ou plus par sécurité  genre 25/30A 600V?
et comme réseau antiparasite ? à self ? , compte tenu des puissances prévues ça commence à faire du poids.

Super_Cinci

Je pars sur du BTA41 : 40A / 800V. Il faut savoir que j'ai cramé un BTA16 (16A) sans radiateur, avec seulement 5A de charge pendant 15 minutes...

Les réseaux antiparasite seront des self maison bobinées sur tore ferrite en 1.5² (dans les appareils du commerce, c'est du 0.75² pour 20A...). Avec en prime un reseau en T (R/C/R) sur triac et opto. Théoriquement, ça suffira bien.

Ce n'est pas le câblage qui me fait peur, mais plus l'arduino à qui je vais demander beaucoup...

Super_Cinci

#3
Feb 12, 2012, 07:47 pm Last Edit: Feb 12, 2012, 08:48 pm by Super_Cinci Reason: 1
On avance aujourd'hui.

La console que j'utilise pour envoyer du DMX :



et tant qu'à faire, je me dis "tiens, on va voir s'il y a quelque chose d'interressant dedans, genre la reprogrammer un jour?" Ben non, les circuits sont gommés, pas de port ISP... Tant pis. Je la remonte, et en la branchant, un poussoir coincé : la console ne voulait pas démarrer. je réouvre, et le fautif :



Il a été soudé de travers, c'est malin! alors je l'ai ressoudé. comment perdre 2 heures...

Puis j'ai rajouté dans mon code la réception DMX. Que de galère! j'avais mis un "espion" dans la routine de réception série (led 13 allumée au début de la trame DMX, éteinte lors de la réception des 12 canaux), mais voilà, pas de signal sur la pin 13! J'y ai passé une heure pour finir par trouver que la pin 13 était une sortie PWM, et qu'en initialisant mes timers, le timer prenait le pas sur la sortie, donc normal de ne pas avoir de signal...

Voilà, ça marche, à part que je dois m'intéresser aux canaux 5 à 17 de la trame DMX pour récupérer les voies 1 à 12 de la console. Comme la console n'est pas adressable et qu'elle envoie bien les canaux dans l'ordre, il faut que je vois pourquoi, je verrai ça avec celui qui a pondu le code de réception DMX (un certain marc Pierson).

Mon espace de travail a aussi évolué, j'avais plein de bouts de contreplaqué de même taille, donc chaque bout contient une fonction :


A3 : une prise 220 contenant un triac et son opto triac (on voit les deux fils qui permettent d'alimenter la led de l'opto)
B3 : a défaut d'avoir un MAX490, j'ai fait un ampli différentiel qui marche plutôt bien, le signal est super propre en sortie!
C3 : vous connaissez la mega2560...
BC2 : plaque d'essai
E2 : un opto et son triac pour commander le 12V de la lampe de bureau
C1 : deux potars pour les tests.

J'suis content, j'ai bien mérité l'apéro!

le code actuel :
Code: [Select]


/******************************* Variables d'adressage *****************************/

#define NUMBER_OF_CHANNELS 12   //Le nombre de canaux que l'on désire recevoir (12 par défaut).
volatile word dmxaddress = 5;  // adresse de départ de réception

#define RX_PIN 17   // PIN RX2 - PH0
#define TX_PIN 16   // PIN TX2 - PH1

/******************************* Variables DMX ********************************/

volatile byte i = 0;              // indexeurs pour dmxvalue[]
volatile byte dmxreceived = 0;   
volatile word dmxcurrent = 0;     //compteur incrémenté à chaque réception de donnée.
volatile byte dmxvalue[NUMBER_OF_CHANNELS];  // tableau des valeurs DMX reçues
volatile boolean dmxnewvalue = false; // indique la reception de nouvelles données DMX
volatile byte zerocounter = 0;  // Pour compter le nombre de zeros consécutifs                                 // reçus sur RX3. 22 zéros signifient un break (88µs). 

/******************************* Variables phases ********************************/

volatile word PERIODE = 20000;  // période du signal redressé, 20 000 par défaut.
volatile boolean ph1, ph2, ph3;  // 1 = présence phase
volatile boolean ph_mesure;  // flag temp
volatile word ph_retard;     // flag temp

/******************************* Variables timers ********************************/

volatile word AVANCE_0 = 5;  // Paramètre d'avance RAZ timer, (2.5µs par défaut)
volatile word ICR1_1, ICR3_1, ICR4_1;  // valeurs de RAZ des timers.

void t134_setup(){     // initialisation des timers 1, 3 et 4
  cli();
  DDRB |= 0xE0;            // T1 : voies 01, 04, 07
  DDRE |= 0x38;            // T3 : voies 02, 05, 08
  DDRH |= 0x38;            // T4 : voies 03, 06, 09
  TCCR1A = 0xFE;         // Utilisation des trois sorties du comparateurs du timer 1
  TCCR3A = 0xFE;         // Utilisation des trois sorties du comparateurs du timer 3
  TCCR4A = 0xFE;         // Utilisation des trois sorties du comparateurs du timer 4
  TCCR1B = 0x18;         // Préparation du timer 1, mise en attente
  TCCR3B = 0x18;         // Préparation du timer 3, mise en attente
  TCCR4B = 0x18;         // Préparation du timer 4, mise en attente
  ICR1 = PERIODE + 500;
  ICR3 = PERIODE + 500;
  ICR4 = PERIODE + 500;
  OCR1A = 0xFFFF;        // initialisation de la sortie voie 01
  OCR1B = 0xFFFF;        // initialisation de la sortie voie 04
  OCR1C = 0xFFFF;        // initialisation de la sortie voie 07
  OCR3A = 0xFFFF;        // initialisation de la sortie voie 02
  OCR3B = 0xFFFF;        // initialisation de la sortie voie 05
  OCR3C = 0xFFFF;        // initialisation de la sortie voie 08
  OCR4A = 0xFFFF;        // initialisation de la sortie voie 03
  OCR4B = 0xFFFF;        // initialisation de la sortie voie 06
  OCR4C = 0xFFFF;        // initialisation de la sortie voie 09
  ICR1_1 = ICR1 - AVANCE_0;  // Valeur pour RAZ T1
  ICR3_1 = ICR3 - AVANCE_0;  // Valeur pour RAZ T3
  ICR4_1 = ICR4 - AVANCE_0;  // Valeur pour RAZ T4   
}

void t134_start(){ // démarre les timers du dimmer
  if (ph1) attachInterrupt(2, raz_ph1, RISING);  // active l'interruption de passage à O secteur phase 1
  TCCR1B |= 0x02;  // démarre timer 1
}

void raz_ph1() {  // phase de référence, mode 3 phases couplées
  TCNT1 = ICR1_1;        // RAZ T1 
}

void dmx_setup() {      // configuration entrée DMX
    // Configuration du port série RX   
  pinMode(RX_PIN, INPUT);  // RX_PIN en entrée
  Serial2.begin(250000);  //chaque bit DMX fait 4uS de long, soit 250Kbps
  cli();                  //Désactivation des interruptions
  UCSR2B &= 0x7F;          //Désactiver l'interruption de réception USART2
    // Timer2 : configuration
  TCCR2A = 0x02;  // timer en mode 2, CTC.  Le TOP sera OCRA.
  TCCR2B = 0x01;  // pas de prescaler, 16Mhz   
  OCR2A = 64;     // Le timer 2 génèrera une interruption toutes les 4µs.
  ASSR = 0x00;
  TIMSK2 = 0x00;  // pas d'interruption timer
  sei();          // Réactiver les interruptions.
}

ISR(TIMER2_COMPA_vect) {   // interruption appelée par timer2 toutes les 4µs
  if (PINH & 0x01) {               // Détection d'un 1 : ce n'est pas un break.
    zerocounter = 0;
  } else {
    zerocounter++;             // incrémentation du compteur de zéros
    if (zerocounter == 20) {   // si 20 zéros reçus consécutivement (80uS : break)
      TIMSK2 &= 0xFD;            //  désactiver timer2, place au travail du USART2
      UCSR2B |= 0x80;            //  activation de USART2
    }
  }
}

SIGNAL(USART2_RX_vect){     //  interruption appelée par le port série.
  dmxreceived = UDR2;
  dmxcurrent++;                        //incrémentation du compteur d'adresse
  if(dmxcurrent >= dmxaddress) {         // vérification de l'adresse de démarrage
    if (i == 0){
      PORTG |= 0x02;             // allumage led DMX : début de réception
    } else {
      PORTG &= 0xFD;               //  extinction led DMX : fin de réception
    }
    dmxvalue[i] = dmxreceived;
    i++;
    if(i == NUMBER_OF_CHANNELS) {  // On a atteint le nombre de cannaux à recevoir, On s'arrête là.
      UCSR2B &= 0x7F;                 // On désactive la réception DMX le temps d'exécuter
      dmxnewvalue = HIGH;                    // le traitement des données reçues
      dmxcurrent = 0;
      zerocounter = 0;
      i = 0;
    }
  }
}

void dmx_in_start() {    // démarre la réception DMX
  TIMSK2 |= 0x02;    //  relancer la recherche de trame DMX
}

void setup(){
  pinMode(40, OUTPUT);  // PG1
  pinMode(A0, INPUT);
  pinMode(21, INPUT);
  t134_setup();
  dmx_setup();
  dmx_in_start();
  t134_start();
}

void loop(){
  if (dmxnewvalue) {     // Réception d'un flot de données : traitement.
    dimmer();
    dmxnewvalue = LOW;       // Réinitialiser les variables de réception DMX
    TIMSK2 |= 0x02;    //  relancer la recherche de trame DMX
  }
}
// j'avais oublié : cette fonction est dans un autre PDE pour mieux s'y retrouver...

void dimmer(){ // gères les données reçues
    OCR1A = word(255-dmxvalue[0X00]) * 79;    // dimmer voie 01
    OCR3A = word(255-dmxvalue[0X01]) * 79;    // dimmer voie 02
    OCR4A = word(255-dmxvalue[0X02]) * 79;    // dimmer voie 03
    OCR1B = word(255-dmxvalue[0X03]) * 79;    // dimmer voie 04
    OCR3B = word(255-dmxvalue[0X04]) * 79;    // dimmer voie 05 
    OCR4B = word(255-dmxvalue[0X05]) * 79;    // dimmer voie 06
    OCR1C = word(255-dmxvalue[0X06]) * 79;    // dimmer voie 07
    OCR3C = word(255-dmxvalue[0X07]) * 79;    // dimmer voie 08 
    OCR4C = word(255-dmxvalue[0X08]) * 79;    // dimmer voie 09
}

je n'ai activé que le timer1 et la phase 1, mais si j'ai le temps demain, je passe en triphasé (heureusement que j'en ai à la maison...)

Artouste



J'suis content, j'ai bien mérité l'apéro!

:smiley-mr-green:  :smiley-mr-green:
t' a pas de probleme de torticoli quand tu travaille à l'oscillo ?  8)
santé

Super_Cinci


:smiley-mr-green:  :smiley-mr-green:
t' a pas de probleme de torticoli quand tu travaille à l'oscillo ?  8)
santé
non ,mais je manque cruellement de place...

osaka

Simple question de néophyte,concernant ta console ce que je vois sur la photo du démontage c'est 1 microcontrôleur par voie ou rien à voir ?

Super_Cinci


Simple question de néophyte,concernant ta console ce que je vois sur la photo du démontage c'est 1 microcontrôleur par voie ou rien à voir ?
Je ne me suis même pas intéressé à ces bêbêtes, ce sont des circuits TTL, des multiplexeurs certainement. le coeur est constitué de trois µP (deux pour lecture des potars et poussoirs certainement, un un qui regroupe toutes les données pour envoyer les trames DMX). ça m'a paru bien trop complet pour aller mettre mon nez dedans...

Super_Cinci

Quelques nouvelles du projet...

la gestion triphasé marche super! j'ai testé avec 3 voies sur trois phases différentes, ça marche! youpi!

pour les circuits qu'on voit sur la photo de la console, ce sont des 74HC4051 (multiplexeurs analogiques) et des 74HC573 (latchs 8bits), ce que je pensais...

Depuis un an, j'ai près de 200Kg de plaques époxy double-face que j'avais sauvées de la poubelle. Elles ne sont pas photosensibles, mais elles étaient gratuites! J'ai depuis 15 ans une imprimante laser... Je me suis enfin fendu d'une petite trentaine d'euros pour me construire un "labo" pour graver des circuits (il était temps!). Une gaine d'aération diam100 (15€ les 6m, ça fait cher!), un ventilo monté dedans (récup) pour une extraction optimale de vilaines vapeurs, de l'acide chlorhydrique et de l'eau oxygénée. J'imprime mes typons sur papier glacé, je transfert avec un vieux fer à repasser (déchetterie) sur ma plaque, je trempe dans la solution (3 eau, 2 acide, 2 eau oxy, ça marche impec, gravure en 20 secondes) avec ma gaine d'extraction à 5cm au dessus du tupperware. dans la série récup, j'ai aussi un millier de forêts (sauvés eux aussi de la poubelle et dans leurs racks de stockage XD ) spéciaux pour machine CNC (de 0.1mm à 4mm, j'ai mis deux jours à les trier...). L'avantage, c'est qu'ils ont une queue de 3mm, donc ça rentre impec dans ma pseudo dremell de chez lidl... Bref, une fois que j'ai terminé mon typon, moins d'une heure après, j'ai le circuit fini sous la main, prêt à souder!

Alors j'ai fait le circuit alim/adaptation de passage à zéro (en premier plan) et une première carte puissance trois voies. coût : 0€, tous les composants viennent de récup diverses...



Bon, de toutes façon, je ne peux plus trop faire mes expérimentations, j'ai un chat...



pas peur le chat quand même...

osaka

Yop yop,
C'est franchement cool et en plus pour 0€, vivement le détail de tes résultats.  :smiley-surprise:
Le chat à l'oscilloscope ça donne quoi niveau ronron ?  :smiley-mr-green:

Super_Cinci


Le chat à l'oscilloscope ça donne quoi niveau ronron ?  :smiley-mr-green:
des p*t**ns d'interférences, grave!quand il miaule, ça disjoncte!

Sans compter les deux souris qui se promènent dans les fils, la minette est en plein crise, elle me ramène des souris vivantes tous les jours, et si j'arrive pas à les choper, elles foutent le camp dans des coins inaccessibles... et elle sont encore bien vivantes même au bout d'une semaine, je les entends régulièrement... il n'en reste qu'une pour l'instant...

A part ça, je suis content de moi... Mais il faut que je mette à jour les 25 pages de l'étude, car il y a du changement...

Artouste



Le chat à l'oscilloscope ça donne quoi niveau ronron ?  :smiley-mr-green:
des p*t**ns d'interférences, grave!quand il miaule, ça disjoncte!

Sans compter les deux souris qui se promènent dans les fils, la minette est en plein crise, elle me ramène des souris vivantes tous les jours, et si j'arrive pas à les choper, elles foutent le camp dans des coins inaccessibles... et elle sont encore bien vivantes même au bout d'une semaine, je les entends régulièrement... il n'en reste qu'une pour l'instant...

A part ça, je suis content de moi... Mais il faut que je mette à jour les 25 pages de l'étude, car il y a du changement...

[Humour]
:smiley-mr-green: :smiley-mr-green:
brancher un chat comme ça  c'est de la cruauté  8)
fais gaffe ! si la SPA tombe sur la photo tu va avoir du temps pour mettre à jour ton étude
http://www.legifrance.gouv.fr/affichCodeArticle.do;?idArticle=LEGIARTI000006418952

osaka


des p*t**ns d'interférences, grave!


Zero crossing ?
220 sur la queue, pin3(patte3) en interruption externe ?  :smiley-mr-green:

Artouste



des p*t**ns d'interférences, grave!


Zero crossing ?
220 sur la queue, pin3(patte3) en interruption externe ?  :smiley-mr-green:


[Humour]
Si vous ne mettez pas le chat à la terre, il va y avoir des problemes  :smiley-mr-green:

Super_Cinci

dès que je le mets à terre, il remonte... Moi qui voulais me la jouer écolo avec des modules en bois, je vais revenir à la faïence aussi blanche que froide! on a une seconde minette à la maison, elle passe son temps vautrée dans l'escalier...

A part ça, je ne peux pas trop avancer mes résultats, car j'attends mes triacs 40A et les optos qui vont avec, et surtout quelque connecteurs. Je me suis fait pas mal hiéch à créer les modèles protéus des cartes arduino...

ISIS :


ARES :


et quand on rajoute de la connectique :




A savoir que la carte arduino se plug par en dessous et les composants et connecteurs sont au-dessus, tout ce qu'il faut pour faire des shield perso...

si ça vous intéresse, je vous enverrai les libs.

Go Up