*Created by KevinMcArthur
DMX512 tester display / receive or transmit the level of 1 of 512 DMX control channels.
Things used in this project
Hardware componentsSoftware apps and online services
MA Lighting onPC Software
Conceptinetics.h DMX library
Hand tools and fabrication machines
MA Lighting 2 port Node
MA Lighting GMA1 onPC Software
Cable, DMX 5M/3F XLR, Shielded
Cable, DMX 5F/3M XLR, Shielded
Story
DMX512 has proven a rugged, reliable serial data interface specification for two decades now. Adopted as a standard in the entertainment lighting industry, it is often the best and most convenient way to control OEM equipment.
Having a small handheld tester is crucial to troubleshooting any system.
This collection of shields and associated code provide the basis for a simple tester. The "Select" button toggles between the Transmit and Recieve modes of operation. The "UP" and "DOWN" buttons provide scrolling channel selection, while the "LEFT" and "RIGHT" keys provide adjustment of the selected channels intensity.
In some of the documentation, the 4 Relay Shield is shown, preparation for a future project.
Schematics
Code
/*
*******************************************************************************
DMXino DMX512 Transmitter / Reciever
***************************************************************************** */
// set Variables used throughout program:
const int ledPin = 13; //non dim indicator of current channel status
// Variables that will change:
int dimmer_val; //Value to be output in Transmit Mode
int CHNumber = 1; //channel number in either mode
float ChannelValuePER; //recieved channel value percent
int ChannelValuePERint; //recieved channel value percent integer
int TesterMode = 1; // Mode Flag (Transmit/Recieve)`
#include
// Select the pin used on LCD
LiquidCrystal lcd(8, 9, 4, 5, 6, 7);
// define the buttons;
int lcd_key = 0;
int adc_key_in = 0;
#define btnRIGHT 0
#define btnUP 1
#define btnDOWN 2
#define btnLEFT 3
#define btnSELECT 4
#define btnNONE 5
//read the button value
int read_LCD_buttons()
{
adc_key_in = analogRead(0); // read analog A0 value
// when read the 5 key values in the vicinity of the following0,144,329,504,741
// By setting different threshold, you can read the one button
if (adc_key_in < 50) return btnRIGHT;
if (adc_key_in < 250) return btnUP;
if (adc_key_in < 450) return btnDOWN;
if (adc_key_in < 650) return btnLEFT;
if (adc_key_in < 850) return btnSELECT;
return btnNONE;
}
#include
//
// CTC-DRA-13-1 ISOLATED DMX-RDM SHIELD JUMPER INSTRUCTIONS
//
// If you are using the above mentioned shield you should
// place the RXEN jumper towards G (Ground), This will turn
// the shield into read mode without using up an IO pin
//
// The !EN Jumper should be either placed in the G (GROUND)
// position to enable the shield circuitry
// OR
// if one of the pins is selected the selected pin should be
// set to OUTPUT mode and set to LOGIC LOW in order for the
// shield to work
//
//
//
//
#define DMX_SLAVE_CHANNELS 512
#define DMX_MASTER_CHANNELS 512
//
#define RXEN_PIN 2
//DMX_Slave dmx_slave ( DMX_SLAVE_CHANNELS );
// If you are using an IO pin to control the shields RXEN
// the use the following line instead
DMX_Slave dmx_slave ( DMX_SLAVE_CHANNELS , RXEN_PIN );
// Configure a DMX master controller, the master controller
// will use the RXEN_PIN to control its write operation
// on the bus
DMX_Master dmx_master ( DMX_MASTER_CHANNELS, RXEN_PIN );
void setup()
{
// initialize the LED pin as an output:
pinMode(ledPin, OUTPUT);
// Enable DMX slave interface and start recording
// DMX data
// Set start address, this is also the default setting
// You can change this address at any time during the program
dmx_slave.setStartAddress (CHNumber);
dmx_master.setChannelRange ( 1, 512, 00 );
lcd.begin(16, 2); //This routine initializes the display,
lcd.setCursor(0, 0); //
lcd.print("DMXino TESTER");
lcd.setCursor(0, 1);
lcd.print("DMX512");
delay(1000);
// scroll 16 positions (string length) to the left
// to move it offscreen left:
for (int positionCounter = 0; positionCounter < 16; positionCounter++) {
// scroll one position left:
lcd.scrollDisplayRight();
// wait a bit:
delay(30);
}
lcd.begin(16, 2); //Start in recieve mode
RecieveMode();
}
void loop()
{
if (TesterMode == 1)
{
RecieveMode();
}
if (TesterMode == 0)
{
TransmitMode();
}
// ************LCD BUTTON INPUT************
lcd_key = read_LCD_buttons(); // read key
switch (lcd_key) // display key
{
case btnRIGHT:
{
lcd.setCursor(13, 1);
lcd.print(" " );
dimmer_val++;
delay (200);
break;
}
case btnLEFT:
{
lcd.setCursor(13, 1);
lcd.print(" " );
dimmer_val--;
delay (200);
break;
}
case btnUP:
{
if (CHNumber < 512)
{
lcd.setCursor(5, 1);
lcd.print(" " );
CHNumber++;
}
delay (200);
break;
}
case btnDOWN:
{
if (CHNumber > 1)
{
lcd.setCursor(5, 1);
lcd.print(" " );
CHNumber--;
}
delay (200);
break;
}
case btnSELECT:
{
lcd.begin(16, 2);
lcd.setCursor(0, 0);
lcd.print(" TESTER MODE");
delay (200);
TesterMode = !TesterMode;
break;
}
case btnNONE:
{
lcd.print(" ");
break;
}
}
// EXAMPLE DESCRIPTION
//
// If the selected channel comes above 50% the led will switch on
// and below 50% the led will be turned off
// NOTE:
// getChannelValue is relative to the configured startaddress
if ( dmx_slave.getChannelValue (CHNumber) > 127 )
digitalWrite ( ledPin, HIGH );
else
digitalWrite ( ledPin, LOW );
}
void RecieveMode()
{
dmx_slave.enable ();
lcd.setCursor(0, 0);
lcd.print("DMXino Recieve");
lcd.setCursor(0, 1);
lcd.print("CHAN#");
lcd.setCursor(9, 1);
lcd.print("LVL");
lcd.setCursor(5, 1);
lcd.print(CHNumber );
lcd.setCursor(13, 1);
//lcd.print ( dmx_slave.getChannelValue(CHNumber));
ChannelValuePER = dmx_slave.getChannelValue(CHNumber) / 2.55;
ChannelValuePERint = int( ChannelValuePER);
lcd.print (ChannelValuePERint);
}
void TransmitMode()
{
dmx_master.enable ();
lcd.setCursor(0, 0);
lcd.print("DMXino Transmit");
lcd.setCursor(0, 1);
lcd.print("CHAN#");
lcd.setCursor(9, 1);
lcd.print("LVL");
lcd.setCursor(5, 1);
lcd.print(CHNumber );
lcd.setCursor(13, 1);
lcd.print(dimmer_val);
dmx_master.setChannelValue ( (CHNumber), dimmer_val );
}