りんご 小麦粉 バター

舞台照明とポストドラマ演劇とアップルパイとクィア障害学

ArduinoとPythonでsACNノードを作ってみた

3万円くらい出せばELATIONの2ポートノードが買えてしまうらしいので自作するメリットはあまりないんだけど、とりあえず勉強も兼ねて作ってみました。MacArduinoをUSBでつないでArduinoからDMXを出力するので、イメージ的にはETC NomadDMX Gadgetのほうが近いかも。

f:id:appleflourbutter:20200329094505j:plain

PythonsACNライブラリArduinoDMXライブラリを単純に組み合わせただけのもので、スペック的な制約から使えるアドレスは96までになっています。工夫すればもっと使える気もする。

github.com

github.com

コードは以下の通りです。
まずは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;
  }
}