VDMX PIR Looping vid control trigger


LED ON = Digital pins pulled high (internal pullup) = Motion Sensed (Or Faulty PIR / Wiring)


/* PIR Motion Sensor to MIDI Trigger w timer
 25/3/2017 Dargstronix

 1x PIR Sensor (4 pins to sensor = 12v, GND, 2x alarm pins) * Could add more sensors for increased responsiveness to movement)
 1x 12v 500mA PSU for PIR 
 PIR Alarm Pins to Teensy GND / Pin 0 
 1x Teensy v3.5 (5v version) - Set USB Type to MIDI + Serial * Powered by USB (mac pro)
 Compiled under Arduino v 1.6.13 https://www.arduino.cc/en/Main/OldSoftwareReleases#previous
 Teensyduino 1.35 https://www.pjrc.com/teensy/td_download.html
 VDMX Detect MIDI on Video Layer (Default CC 11)

int pirPin = 0; // Pin for PIR (Normally Closed)
int ledPin = 13; // Built in LED (default pin 13) NO Hardware PWM on Pin 13.
long counter = 0; // counter
long video = 0; // value to store state of if video should play or not.
int ledState = LOW; // ledState used to set the LED
long previousMillis = 0; // will store last time LED was updated
unsigned long currentMillis = millis();

/* User Config */

long duration = 5000; // Time to wait before turning up idle video loop (in mS) 5000 = 5 seconds, 60000 = 60seconds
int fadetime = 20; // fade up/down time in mS ( x 128 ) = 2.5 seconds
int midich = 0; // MIDI Channel: 0 is default
int midicc = 11; // MIDI Control Channel: 11 (MIDI CC Volume) is default 

void setup() 
 pinMode(pirPin, INPUT_PULLUP); // internal pullup to HIGH
 pinMode(ledPin, OUTPUT);
 Serial.begin(9600); // debug

void loop() 
 currentMillis = millis();
 int pirState = digitalRead(pirPin);
 Serial.print(" pirState: "); //debug
 Serial.print(pirState); //debug

if (pirState == HIGH) // If PIR triggered
 digitalWrite(ledPin, HIGH);

 if (video==1)// If video was playing, then make it not play
 Serial.println(" *** WAS PLAYING NOW VIDEO OFF 0 "); //debug
 //usbMIDI.sendControlChange(11, 0, 0); // volume =11, value 0,ch0
 Serial.print(" TRIGGERED - Artwork Active, counter reset, video off: "); //debug
 counter = currentMillis; // reset counter

if (pirState == LOW) // If PIR isn't triggered
 Serial.print(" No Trig "); //debug

if(currentMillis - counter > duration) 
 if (video==0) // If video wasn't playing
 Serial.println(" *** WASN't PLAYING NOW VIDEO ON 127 "); //debug
 Serial.print(" * DURATION Exceeded - ARTWORK INACTIVE - turn up video * "); //debug

 Serial.print(" Millis - counter: "); //debug
 Serial.println(currentMillis - counter); //debug 

 while (usbMIDI.read()) { // ignore incoming messages
 // MIDI Controllers should discard incoming MIDI messages.
 // http://forum.pjrc.com/threads/24179-Teensy-3-Ableton-Analog-CC-causes-midi-crash 
} //end main loop 

void fadeup()
 for (int x = 0; x < 128; x++)   {  usbMIDI.sendControlChange(midicc, x, midich); // volume =11, value x, ch0  delay(fadetime);    int val = x;  val = map(val, 0, 128, 0, 255);  analogWrite(ledPin, val);  Serial.print(" val= "); //debug  Serial.println(val); //debug   Serial.print(" x= "); //debug  Serial.println(x); //debug   } } void fadedown() {  for (int x = 127; x >- 1; x--) 
 usbMIDI.sendControlChange(midicc, x, midich); // volume =11, value x, ch0
 int val = x;
 val = map(val, 0, 128, 0, 255);
 analogWrite(ledPin, val);

 Serial.print(" val= "); //debug
 Serial.println(val); //debug 
 Serial.print(" x= "); //debug
 Serial.println(x); //debug 

void blink(int blinky)
 if(currentMillis - previousMillis > blinky) 
 previousMillis = currentMillis; // save the last time you blinked the LED 
 if (ledState == LOW) // if the LED is off turn it on and vice-versa: 
 ledState = HIGH;
 ledState = LOW;
 digitalWrite(ledPin, ledState); // set the LED with the ledState of the variable: 
Posted in Uncategorized | Leave a comment

Arduino DMX – MP3 Receiver

A stream of consciousness write up on building a DMX- audio trigger device.

So it’s been 5 years or so since I was last playing around with DMX receiving (to control WS2801 led strip, and RGB 12v strips), and the MP3 Trigger from robertsonics (as part of a game show buzzer sound effect player).

Simple enough project this time, when a dmx value is received, play an mp3.

Ideally DMX Address 512 to keep it away from any other lighting addressing, but this could cause problems if there’s any timing/variable storing issues.

DMX Values =

0-127 = stop playing

128-255 = start playing ?

And all it does it make a digital output pin go low/high. which triggers 1 track to play, nothing fancy at all.

Originally I thought 0 could be stop, and 1-255 could be volume levels, to allow for fade ins and outs, but if i’m using the serial port for DMX, I can’t use the same serial port to talk to the robertsonics mp3 trigger. This could be a reason to use a Teensy instead of an ATMega device. Then could also use serial to pick different tracks too.

Anyway, keeping it simple for now (mostly because I don’t have a MAX485 wired into a teensy, but I do have a ATMega 328P with a MAX485 prototype already made.


DMX Library, I had been using the Max Pierson DMX receive code, and so pulled out Arduino v 0018, which was my last known working compiler, but it threw errors straight away, so started looking for a newer option, compatible with the current v1.6.x Arduino IDE.

DMX Serial – http://www.mathertel.de/Arduino/DMXSerial.aspx seems to be a good option, code here: https://github.com/mathertel/DMXSerial/blob/master/examples/DmxSerialRecv/DmxSerialRecv.ino


So using Arduino 1.6.4 on my mac, with a 5v FTDI cable, was able to upload the DMX Receive example, (the switch/jumper on the pcb has to be up to switch the FTDI in program mode. Down to receive DMX via the Max485.

Schematics and board design for my prototype at https://github.com/dargs

Finding info on the mp3 trigger board I have, as I have the  original design is hard.

Trigger pins are active Low, pulled high internally, so to trigger, external uC needs to make the pin low (to ground) to trigger. I think it’ll play the whole track, then look to see if any trigger pins are low, otherwise stop. This is going to make programming annoying, as you’d have to wait until the 30min track finishes before triggering again. Hmm.


SD card fat16 or fat32


#include &amp;amp;lt;DMXSerial.h&amp;amp;gt;
 const int TrigPin = 8; // digital 8 to trigger mp3.
 void setup () {

pinMode(TrigPin, OUTPUT); // sets the digital pin as output
 void loop() {
 // Calculate how long no data backet was received
 unsigned long lastPacket = DMXSerial.noDataSince();

if (lastPacket &amp;amp;lt; 5000) {
 if (DMXSerial.read(1) &amp;amp;gt;= 128) digitalWrite(TrigPin,LOW); // trigger if dmx ch 1 is 128 or higher
 if (DMXSerial.read(1) &amp;amp;lt;= 127) digitalWrite(TrigPin,HIGH); // don't trigger if dmx c1 is 127 or lower

// End.



Waiting on a new WAV Trigger board to arrive, then the plan is to use teensy v3 to make a fancier system.

DMX Ch = Track #

DMX Value = 0-5 = Stop

DMX Value = 6-10 = Pause

DMX Value = 11-15 = Resume

DMX Value = 16-20 = Start (from beginning)

DMX Value = 21-255 = Volume (0-100%)



Update-  Part 2

I’ve realised I probably could use software serial between the atmega and wave trigger, keeping the hardware serial for the DMX connection.

I’d also planned to design a opto and DC isolated interface, but came across the same author of the DMX Serial arduino library,Matthias Hertel, has designed a board already: http://www.mathertel.de/Arduino/DMXShield.aspx So will probably get some pcbs made and order some parts.






I now have a robertsonics wave trigger board, and reading this tutorial: http://robertsonics.com/2015/04/25/arduino-serial-control-tutorial/

That worked almost first go, I had to download an older version of the code- Apr 26, 2015 commit – due to comms issues in Sept 2016 version


Serial protocol for wavTrigger:

WAV Trigger Online User Guide

test code. havent tested with dmx input .. yet!



 if (lastPacket < 5000) { // if DMX received
 for (int x = 0; x < 20; x++){ // checking dmx channels 0 to 20. To Do: add dmx start address in future versions.
 if (DMXSerial.read(x) >= 0 && DMXSerial.read(x) <= 10 ) wTrig.trackStop(x); // Stop Track if DMX Value is between 0-10
 if (DMXSerial.read(x) >=11 && DMXSerial.read(x) <= 20 ) wTrig.trackPause(x); // Pause Track if DMX Value is between 11-20
 if (DMXSerial.read(x) >=21 && DMXSerial.read(x) <= 30 ) wTrig.trackResume(x); // Resume Track if DMX Value is between 21-30
 if (DMXSerial.read(x) >=31 && DMXSerial.read(x) <= 40 ) wTrig.trackPlayPoly(x); // Play Track if DMX value 31-40
 if (DMXSerial.read(x) >=41 && DMXSerial.read(x) <= 255 ) // Volume
 signed int tempLevel = DMXSerial.read(x);
 signed int Level = map(tempLevel,21,255,-70,10);
 wTrig.trackFade(x, Level, 10, 0); // where (a,b,c,d) = a= track #, b=Level, c= fade time in milliseconds, d=0=contine playing, 1=stop playing


Posted in Arduino-Projects | Leave a comment

Getting started with the Gadget Factory Papilio DUO – FPGA dev board

Finally learning some FPGA geeky goodness!

Back in 2014, I supported this campaign – https://www.kickstarter.com/projects/13588168/papilio-duo-drag-and-drop-fpga-circuit-lab-for-mak

And received the board 12 months ago, but haven’t had a play with it until now…

First things first..  check for a missing jumper, mentioned in update #23..

Install softwares.. I’m trying to install Designlab under windows 10, on my 2015 Macbook pro running Parallels


Downloaded ‘Papilio DesignLab IDE 1.0.7


Was able to get the hello world sketch running first time, blinking led and output to serial! Yay. Next to try out something using the computing shield…


Posted in Arduino-Projects, Uncategorized | Tagged | Leave a comment

MIDI Controllers

Midi controllers with knobs,buttons,sliders,encoders,leds,lcd displays…

Teensy Midi info: https://www.pjrc.com/teensy/td_midi.html

Modi kits:




Uses 4051 Multiplexer IC to to read 8 analog inputs into 1 pin on uC. 8×8 = 64 inputs









Circular LED Bargraphs &



SparkFun LED RingCoder Breakout – RGB

demo code haven’t try yet:






Posted in Uncategorized | Leave a comment

Tektronix WFM2200 Portable Waveform Monitor

Posted in acmi av blog | Tagged , , , , , , | Leave a comment

Human Rights Festival, Opening Night – “THE SQUARE” (Skype Q&A)

Human Rights Festival. 8th May 2014. Cinema 2. Skype Q&A.



Posted in acmi av blog | Tagged , , , , , , , , , , , | Leave a comment

VDMX Masterclass with David Lublin

On March 1st 2014, ACMI held a Masterclass with VDMX creator David Lublin via Skype from New York to Melbourne, this is the live stream archive:




Posted in Video | Tagged , , , , | Leave a comment