bonjour, je suis en train de prêter la main à un plasticien qui désire faire une installation avec des dichros 12v ( une 30taine).
la base est envisagée sous arduino UNO, avec 2 ou 3 TLC5940, et l'utilisation de transistors de puissance ( encore à définir pour des puissances de 40w en 12v)
L'envoi des infos de contrôle de ces dichros se fera en ethernet en protocole art-net ( UDP), avec un shield, l'arduino étant cachée dans l'oeuvre.
J'ai un petit, voir un gros souci avec mon script, hors TLC. Je l'ai allégé au maximum, de façon à essayer de déterminer ce sur quoi je butais.
J'envoies depuis un logiciel tiers une trame art-net qui fait 530 bytes de données, et dont les infos de circuits sont exprimées en bytes, donc en valeur de 0 à 255.
Header + données propres au protocole= 17 bytes
512 circuits dmx
1 caractere de terminaison
Je teste le resultat pour l'instant sur une seule LED en PWM.
lorsqu'une valeur est changée, j'envoies une trame art-net vers l'arduino.
un changement sec d'état est répercuté directement sur la LED.
parcontre si il y a crossfade ( et donc envoi en continu de trames artnet) la LED ne rafraichit pas, ou après un certain temps qui peut aller jusqu'à 4 secondes.
le blocage se produit à plus de 12 trames par secondes
- comme si le buffer de réception ethernet était saturé
- ou que la connexion était en mode bloquant
Donc avant de me lancer dans les TLC, je me dis oulalala.... demandons un coup de main !
#include <SPI.h> // needed for Arduino versions later than 0018
#include <Ethernet.h>
#include <Udp.h> // UDP library from: bjoern@cs.stanford.edu 12/30/2008
// ADRESSES MAC ET IP du shield ethernet
byte mac[] = { 0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED };
byte ip[] = { 192,168,1,177 };
unsigned int localPort = 6454; // port UDP générique art-net=6454
// the next two variables are set when a packet is received
byte remoteIp[4]; // holds received packet's originating IP
unsigned int remotePort; // holds received packet's originating port
// buffers for receiving data
char packetBuffer[UDP_TX_PACKET_MAX_SIZE]; //buffer to hold incoming packet,
const int nombre_de_circuits=512;
int taille_chaine_artnet=8+17+nombre_de_circuits+1;
//8: UDP protocole //17: header + donnees artnet // 1: caractere de fin de chaine
byte buffer_dmx[nombre_de_circuits];
void setup() {
for (int i=0;i<nombre_de_circuits;i++)
{
buffer_dmx[i]=0;
}
pinMode(3, OUTPUT);
Ethernet.begin(mac,ip);
Udp.begin(localPort);
}
void loop() {
int packetSize = Udp.available(); // note that this includes the UDP header
if(packetSize==taille_chaine_artnet)
{
Udp.readPacket(packetBuffer,UDP_TX_PACKET_MAX_SIZE, remoteIp, remotePort);
for(int i=0;i<nombre_de_circuits;i++)
{
buffer_dmx[i]=(byte) packetBuffer[i+17];
}
//report des valeurs sur les PWM
analogWrite(3,buffer_dmx[3]);
}
}