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 – seems to be a good option, code here:


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

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 <DMXSerial.h>
 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 < 5000) {
 if ( >= 128) digitalWrite(TrigPin,LOW); // trigger if dmx ch 1 is 128 or higher
 if ( <= 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: So will probably get some pcbs made and order some parts.






I now have a robertsonics wave trigger board, and reading this 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 ( >= 0 && <= 10 ) wTrig.trackStop(x); // Stop Track if DMX Value is between 0-10
 if ( >=11 && <= 20 ) wTrig.trackPause(x); // Pause Track if DMX Value is between 11-20
 if ( >=21 && <= 30 ) wTrig.trackResume(x); // Resume Track if DMX Value is between 21-30
 if ( >=31 && <= 40 ) wTrig.trackPlayPoly(x); // Play Track if DMX value 31-40
 if ( >=41 && <= 255 ) // Volume
 signed int tempLevel =;
 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


This entry was posted in Arduino-Projects. Bookmark the permalink.

Leave a Reply

Fill in your details below or click an icon to log in: Logo

You are commenting using your account. Log Out /  Change )

Twitter picture

You are commenting using your Twitter account. Log Out /  Change )

Facebook photo

You are commenting using your Facebook account. Log Out /  Change )

Connecting to %s