Art-Net Programming
JohnMichnr
Posts: 279
Anybody ever do any Lighting control over Art-Net? It's a DMX over Ethernet control protocol. I'm trying to jump start here instead of pouring through pages and pages of Protocol manuals
0
Comments
On the Artnet side, there's a whole IP Schema, then a poll/response set that happens before the DMX information is broadcast. It's pretty involved to initialize that connection. To make my module for it, I had to trudge through the protocol and DEFINITELY didn't implement the whole thing. Just got it working.
Take a look at sACN - it'll probably suit your needs more.
I use it to control 4 LED par cans using a cheap ArtNet to DMX converter from China.
I needed to send ArtNet packets at least every 0.5s or the lights go dark. This is an issue with non-compliance of the gateway and the lamps rather than an issue with ArtNet.
When my module is idle it sends a DMX packet every 0.5s and when the DMX levels are changing every 50ms.
define_constant
ARTNET_HEADER[] = 'Art-Net';
ARTNET_VERSION[] = {$00,$0E};//14
ARTNET_OPCODE_POLL[] = {$00,$20};
ARTNET_OPCODE_POLL_REPLY[] = {$00,$21};
ARTNET_OPCODE_DMX[] = {$00,$50};
define_variable
volatile char cSequence;
volatile char cSubNet;
volatile integer nUniverse;
volatile char cDMXLevels[512];
define_function ArtPoll()
{
stack_var char _sPacketHeader[18];
_sPacketHeader = "ARTNET_HEADER,$00, // Protocol header
ARTNET_OPCODE_POLL, // ArtDMX op-code
ARTNET_VERSION, // Version 14
$02, // TalkToMe
$00"; // Diagnostic priority
send_string dvSocket, "_sPacketHeader";
}
define_function ArtDMX()
{
stack_var char _sPacketHeader[18];
stack_var char _sPortAddress[2]
_sPortAddress[1] = type_cast(nUniverse & $00FF);
_sPortAddress[2] = type_cast((nUniverse & $7F00) >> 8);
_sPacketHeader = "ARTNET_HEADER,$00, // Protocol header
ARTNET_OPCODE_DMX, // ArtDMX op-code
ARTNET_VERSION, // Version 14
cSequence, // Packet sequence
$00, // Physical port
_sPortAddress[1], // DMX Universe (low 8 bits of 15 bit address)
_sPortAddress[2], // DMX Net (High 7 bits of 15 bit address)
$02,$00"; // Payload length (512 channels)
set_length_array(cDMXLevels, 512);
send_string dvSocket, "_sPacketHeader,cDMXLevels";
cSequence++;
}
Just confirming - you sent stuff out UDP on port 1936? (That might be hex - Manual references it as 0x1936)
DMX is 16-bit, so the best way to deal with it is a 16-bit var, IE a char.
A CHAR is only an 8 bit data type, unsigned 0-255. INTEGER is 16 bit.
Like I said....
DMX is only an 8-bit var, IE a char.... this is what I get for lack of sleep...
What I found out about Art-net: 1) The default IP stuff described in the protocol is only relevant if you don't have a node with a specific IP Address. If you can setup your node, then it is just UDP packets to that address on port 6454. 2) You don't need the Art-Net Poll messages unless you are looking to find art-net nodes on the network. I was able to just start sending artnet dmx commands out to the box with no problems. 3) if you want to query - the art-net poll response is sent back on the broadcast address for the sub net, in my case that was 192.168.255.255. I happened to have wiresharck running and caught the polling responses.
Hi there i've got a huge problem to poll und send the commands to the node.
i dont understand how i could send the correct code to ramp up the dmx dimmer on channel x.
i implemented the code from clintonl and opend a ip client via udp broatcast on port 6454 ip 2.52.255.255
and send the Artpoll in a timeline.
then send a string with artdmx.
Can you help me?