DMX Scanner tester

Hi,

I'm tom and for xmas I got 2 arduinos. I've been busy working away getting to know how to program them.

Well after getting my free sample from maxim chips :stuck_out_tongue: I could make my own DMX shield to interface to my ACME Mobile Spiral disco light.

So below is my code to test the light by going through the gobos and panning the light around.

/*
 * DMX Scanner tester - Tom Buck 2008
 * based on the code of Tomek Ness and D. Cuartielles
 *
 * adapted to arduino 008 by Peter Szakal and Gabor Papp
 * http://nextlab.hu
 */

#include "pins_arduino.h"

int sig = 11; // signal

int gobo = 0;
int pan = 0;
int valueadd = 16;
int panadd = 8;

/* Sends a DMX byte out on a pin.  Assumes a 16 MHz clock.
 * Disables interrupts, which will disrupt the millis() function if used
 * too frequently. */
void shiftDmxOut(int pin, int theByte)
{
  int port_to_output[] = {
    NOT_A_PORT,
    NOT_A_PORT,
    _SFR_IO_ADDR(PORTB),
    _SFR_IO_ADDR(PORTC),
    _SFR_IO_ADDR(PORTD)
    };

    int portNumber = port_to_output[digitalPinToPort(pin)];
  int pinMask = digitalPinToBitMask(pin);

  // the first thing we do is to write te pin to high
  // it will be the mark between bytes. It may be also
  // high from before
  _SFR_BYTE(_SFR_IO8(portNumber)) |= pinMask;
  delayMicroseconds(10);

  // disable interrupts, otherwise the timer 0 overflow interrupt that
  // tracks milliseconds will make us delay longer than we want.
  cli();

  // DMX starts with a start-bit that must always be zero
  _SFR_BYTE(_SFR_IO8(portNumber)) &= ~pinMask;

  // we need a delay of 4us (then one bit is transfered)
  // this seems more stable then using delayMicroseconds
  asm("nop\n nop\n nop\n nop\n nop\n nop\n nop\n nop\n");
  asm("nop\n nop\n nop\n nop\n nop\n nop\n nop\n nop\n");

  asm("nop\n nop\n nop\n nop\n nop\n nop\n nop\n nop\n");
  asm("nop\n nop\n nop\n nop\n nop\n nop\n nop\n nop\n");

  asm("nop\n nop\n nop\n nop\n nop\n nop\n nop\n nop\n");
  asm("nop\n nop\n nop\n nop\n nop\n nop\n nop\n nop\n");

  for (int i = 0; i < 8; i++)
  {
    if (theByte & 01)
    {
      _SFR_BYTE(_SFR_IO8(portNumber)) |= pinMask;
    }
    else
    {
      _SFR_BYTE(_SFR_IO8(portNumber)) &= ~pinMask;
    }

    asm("nop\n nop\n nop\n nop\n nop\n nop\n nop\n nop\n");
    asm("nop\n nop\n nop\n nop\n nop\n nop\n nop\n nop\n");

    asm("nop\n nop\n nop\n nop\n nop\n nop\n nop\n nop\n");
    asm("nop\n nop\n nop\n nop\n nop\n nop\n nop\n nop\n");

    asm("nop\n nop\n nop\n nop\n nop\n nop\n nop\n nop\n");
    asm("nop\n nop\n nop\n nop\n nop\n nop\n nop\n nop\n");

    theByte >>= 1;
  }

  // the last thing we do is to write the pin to high
  // it will be the mark between bytes. (this break is have to be between 8 us and 1 sec)
  _SFR_BYTE(_SFR_IO8(portNumber)) |= pinMask;

  // reenable interrupts.
  sei();
}


void setup()
{
  pinMode(sig, OUTPUT);
  Serial.begin(9600);
}

void loop()
{
  
  /***** sending the dmx signal *****/

  // sending the break (the break can be between 88us and 1sec)
  digitalWrite(sig, LOW);
  delay(10);

  // sending the start byte
  shiftDmxOut(sig, 0);
  
  // Channel 1 - Gobo
  shiftDmxOut(sig, gobo);
  
  delay(1000); // Delay so I can see the different shapes.
  
  // Channel 2 - Pan
  shiftDmxOut(sig,pan);

  for (int count = 1; count <= 510; count++)  // Set the unused channels to 0.
  {
    shiftDmxOut(sig, 0);
  }
  /***** sending the dmx signal end *****/
    
gobo += valueadd;  // Change to next shape
  if ((gobo == 0) || (gobo == 256)) // Test to see if gobo is within range.
  {
    valueadd *= -1;
  }
  
 pan += panadd;  // Pan to new position
  if ((pan == 0) || (pan == 256)) // Test to see if pan is within range.
  {
    panadd *= -1;
  }
  Serial.print ("Channel 1 - Gobo "); // Debug Routine
  Serial.print(gobo); 
  Serial.print("\t");
  Serial.print("Channel 2 - Pan ");
  Serial.println(pan);
}

I hope you find it useful if your trying to test your own dmx scanners. My light is only 2 channels but the code can be modified for more channels if needed.

I hope to learn how to code a receiver so i can build my own lights. Any help would be nice! Also would like to build my own stage console as well!

Cheers,

Tom.