ArduinoとPythonでsACNノードを作ってみた
3万円くらい出せばELATIONの2ポートノードが買えてしまうらしいので自作するメリットはあまりないんだけど、とりあえず勉強も兼ねて作ってみました。MacとArduinoをUSBでつないでArduinoからDMXを出力するので、イメージ的にはETC NomadのDMX Gadgetのほうが近いかも。
PythonのsACNライブラリとArduinoのDMXライブラリを単純に組み合わせただけのもので、スペック的な制約から使えるアドレスは96までになっています。工夫すればもっと使える気もする。
コードは以下の通りです。
まずはMac側。sACNの信号を受信してシリアル通信でひたすらArduinoに送り続けます。数値に変化があったところだけ送ったりもしてみたけど、全部送ったほうがよさそう。
import sacn import serial ser = serial.Serial('/dev/cu.usbmodem14111',230400, timeout=None, parity=serial.PARITY_EVEN) receiver = sacn.sACNreceiver() receiver.start() @receiver.listen_on('universe', universe=1) def callback(packet): for addr in range(96): ser.write(str.encode(str(addr + 1) + "c" + str(packet.dmxData[addr]) + "w")) receiver.join_multicast(1)
Arduino側。こちらはDMX Simpleのサンプルコードとほとんど同じ。データを受け取ってDMXに反映するだけ。
ArduinoのUARTをLTC485につないで、その出力がDMXとなります。
#include <DmxSimple.h> void setup() { Serial.begin(230400, SERIAL_8E1); DmxSimple.maxChannel(96); } int value = 0; int channel; void loop() { int c; while(!Serial.available()); c = Serial.read(); if ((c>='0') && (c<='9')) { value = 10*value + c - '0'; } else { if (c=='c') channel = value; else if (c=='w') { DmxSimple.write(channel, value); } value = 0; } }