Re: note

技術的な知見やポエムなど役に立たない情報を書き連ねる場所

ArduinoでDMXを受信する

f:id:hik0leaf:20190526104224j:plain

前回DMX Shield for Arduino使ってDMXを受信してみましたが、もっとコンパクトにオリジナルのDMX機器を作れるようにShieldを使わない方法でArduinoDMXを受信してみたいと思います。

準備物

  • Arduino
  • LTC485 (LT1785, SN75176等のRS485トランシーバIC)
  • ブレッドボード、ワイヤー等

回路図

ArduinoとLTC485を図のように接続します。今回はArduino UNOを使いました。

f:id:hik0leaf:20190526113726j:plain
回路図

ライブラリ

DMXを処理するためにDMXSerialというライブラリを使用します。git cloneするかzipダウンロードしてローカルに保存します。保存したライブラリフォルダをArduino IDEのインストールフォルダにある libraries に配置するとArduino IDEからライブラリを読み込めるようになります。

github.com

DMXSerialクラスのリファレンスがあるので詳しく知りたい場合は参照すると良いでしょう。

DMXSerialのメインページはこちら

スケッチの書き込み

下記のスケッチをArduinoに書き込みます。その際、ArduinoのD0ピンに接続したワイヤーを外してください。なぜかというと、Arduino UNOはスケッチの書き込みにハードウェアシリアルのD0/D1ピンを使用するためD0ピンがLTC485と繋がっていると書き込めなくなってしまうからです。

#include "DMXSerial.h"

int startCh = 1;//DMX Start Channel

void setup() {
  DMXSerial.init(DMXReceiver);
  pinMode(13, OUTPUT);
}

void loop() {
  unsigned long lastPacket = DMXSerial.noDataSince();

  if (lastPacket < 5000) {
      byte data = DMXSerial.read(startCh);
      
      if (data >= 127) {
        digitalWrite(13, HIGH);
      } else {
        digitalWrite(13, LOW);
      }
  }
}

書き込みが終わったらD0ピンへワイヤーを接続します。 デバッグ等で頻繁に書き込む場合は、スイッチなどを取り付けて簡単に接続を切り離せるようにすると良いかもしれません。

(DMX Shield for Arduinoは実際そうなっています)

動作確認

LTC485の5, 6, 7pinを適当なDMXコントローラーと接続します。スケッチ上でこのDMX機器のスタートチャンネルを1としているので、DMXコントローラーから1chに対して値を127以上にしてLEDが点灯すれば成功です。

おまけ:Arduino Leonardo編

Arduino Leonardo(ATmega32u4系Arduino)はスケッチの書き込みにハードウェアシリアルを使用していないため、書き込みの際にワイヤーを外したりする必要がありません。さらにこれによって、DMX信号の値をシリアルコンソールで出力できるようになるため、DMX信号のモニタリングができるなどArduinoDMXを扱う場合はArduino Leonardoを使用するのがおすすめです。

f:id:hik0leaf:20190526130251j:plain
A-Star 32U4 Micro (Arduino Leonardo互換)との接続

写真ではArduino Leonardo互換のA-Star 32U4 Microと接続しています。A-Star 32U4 Microは小型のためブレッドボードとも相性が良くおすすめです。

Arduino Leonardo用スケッチ

以下のスケッチをArduino Leonardoに書き込みます。LTC485との配線はUNOと同じですが書き込み時にワイヤーを外す必要はありません。

#include "DMXSerial.h"

int startCh = 1;//DMX Start Channel

byte preData = 0;

void setup() {
  DMXSerial.init(DMXReceiver);
  pinMode(13, OUTPUT);
  Serial.begin(9600);
}

void loop() {
  unsigned long lastPacket = DMXSerial.noDataSince();
  
  if (lastPacket < 5000) {
      byte data = DMXSerial.read(startCh);

      if (data == preData) return;// 値の更新判定
      
      if (data >= 127) {
        digitalWrite(13, HIGH);
      } else {
        digitalWrite(13, LOW);
      }

      preData = data;

      Serial.println(data);      
  }
}

動作確認

適当なDMXコントローラーから1chの値を127以上にしてLEDが点灯すれば成功です。さらにシリアルモニタを開くとコントローラーからの値の変化を確認することができます。

f:id:hik0leaf:20190526124614p:plain

それでは良いDMXライフを。

参考サイト

magcho.hatenablog.jp