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
001xxxxx.MP3
</pre>
#include <DMXSerial.h>
const int TrigPin = 8; // digital 8 to trigger mp3.
void setup () {
DMXSerial.init(DMXReceiver);
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 (DMXSerial.read(1) >= 128) digitalWrite(TrigPin,LOW); // trigger if dmx ch 1 is 128 or higher
if (DMXSerial.read(1) <= 127) digitalWrite(TrigPin,HIGH); // don't trigger if dmx c1 is 127 or lower
}
}
// End.
<pre>
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:
http://robertsonics.com/wav-trigger-online-user-guide/#chapter9
test code. havent tested with dmx input .. yet!
https://github.com/dargs/dargstronixDMXwavTrig
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
}