Playing with MIDI, reading a lot, browsing through musical equipments… and DMX cames out.
DMX is like a custom RS-485 network. A master device sends data at 250 kHz to slave devices, each of them listening to a different “channel” or address. Typical DMX devices (“fixtures”) are stage lights but you can find fog machines, laser projectors, bubble machines, relay boards, analog interfaces…
On a studio scenario you can even join MIDI with DMX so you can create a performance combining music and lights or other kind of effects.
Generating a 250 kHz stream of data isn’t difficult, there are FTDI devices that can do that. I could use the same kind of setup I use to generate LEGO Power Functions IR signals to generate DMX signals.
In fact, people are already doing it. There are a few tutorials on how to create a DMX controller for less than $10 but I prefer this one (it costed me a bit more than 10€ but it was really straightforward, just a FTDI485 cable and a XLR 3-pin female connector.
It can be used with QLC+ (an open source DMX controller software) but that’s overkill for a MINDSTORMS EV3 so after a short search I found a python library to use it directly (dmx485).
So you connect your DYI DMX adapter to your EV3:
[1218334.312176] usb 1-1.2: New USB device found, idVendor=0403, idProduct=6001
[1218334.312248] usb 1-1.2: New USB device strings: Mfr=1, Product=2, SerialNumber=3
[1218334.312287] usb 1-1.2: Product: USB-RS485 Cable
[1218334.312322] usb 1-1.2: Manufacturer: FTDI
[1218334.312355] usb 1-1.2: SerialNumber: FT4NMHF6
[1218334.800717] usbcore: registered new interface driver usbserial
[1218334.936770] usbcore: registered new interface driver ftdi_sio
[1218334.937337] usbserial: USB Serial support registered for FTDI USB Serial Device
[1218334.938673] ftdi_sio 1-1.2:1.0: FTDI USB Serial Device converter detected
[1218334.939512] usb 1-1.2: Detected FT232RL
[1218334.956748] usb 1-1.2: FTDI USB Serial Device converter now attached to ttyUSB0
Here it is assigned to ‘/dev/ttyUSB0’
Now we just need to install ‘dmx485’:
pip3 install dmx485
(if you have a fresh ‘ev3dev’ installation you probably need to install ‘pip3’ first)
For testing, the script on ‘dmx485’ homepage is enough but I adapted it for my first python DMX script to control my cheap DMX RGB PAR spotlight (after reading the manual to find how it works – it uses 4 DMX channels for Master, Red, Green and Blue values)
!/usr/bin/env python3 import time import dmx import random random.seed() CMD = [0]*512 CMD[3] = 255 # Master Dimmer CMD[4] = 0 # Red Dimmer CMD[5] = 0 # Green Dimmer CMD[6] = 0 # Blue Dimmer BLANK = [0]*512 DELAY = 0.2 sender = dmx.DMX_Serial('/dev/ttyUSB0') sender.start() # WHITE CMD[4] = 255 CMD[5] = 255 CMD[6] = 255 sender.set_data(bytes(CMD)) time.sleep(2) sender.set_data(bytes(BLANK)) # RED dimmer CMD[4] = 0 CMD[5] = 0 CMD[6] = 0 for i in range(0, 256, 8): CMD[4] = i sender.set_data(bytes(CMD)) time.sleep(DELAY) sender.set_data(bytes(BLANK)) # GREEN dimmer CMD[4] = 0 for i in range(0, 256, 8): CMD[5] = i sender.set_data(bytes(CMD)) time.sleep(DELAY) sender.set_data(bytes(BLANK)) # BLUE dimmer CMD[5] = 0 for i in range(0, 256, 8): CMD[6] = i sender.set_data(bytes(CMD)) time.sleep(DELAY) sender.set_data(bytes(BLANK)) # MASTER dimmer CMD[4] = 255 CMD[5] = 255 CMD[6] = 255 for i in range(0, 256, 8): CMD[3] = i sender.set_data(bytes(CMD)) time.sleep(DELAY) sender.set_data(bytes(BLANK)) # RGB random CMD[3] = 255 CMD[4] = 0 CMD[5] = 0 CMD[6] = 0 for step in range(50): CMD[4] = random.randint(0,255) CMD[5] = random.randint(0,255) CMD[6] = random.randint(0,255) print(CMD[4], CMD[5], CMD[6]) sender.set_data(bytes(CMD)) time.sleep(DELAY) sender.set_data(bytes(BLANK))
It was amazingly easy.
Now the tough part is using this same USB DMX adapter to listen to DMX signals and make my own LEGO MINDSTORMS DMX fixture. I am not keen to continuously polling the bus so I probably have to spend a few more euros to buy a smarter USB DMX adapter that offloads the reception task.