Arduino
DMX512
DmxSimple
DMXコントローラー

Arduinoを使った3ch DMXコントローラーの製作

概要

ArduinoUnoを使って照明用のDMX512のための3ch DMXコントローラを安価に製作しました。ボリュームで制御します。
ソフトは、先人がすばらしいライブラリ(DmxSimple)を作っているので、これを利用しています。
また、DmxSampleを使わないプログラムも紹介します。
ArduinoUnoの出力をEIA-485(RS485)にするために、シールド(ハードウェア)を作成し、次に動かすためのスケッチ(ソフトウェア)を作成します。

ハードウェア

DMX512を使うためには電気的にEIA-485に合わす必要があり、そのためにLT1785,SN75176,LTC485等のRS485トランシーバICをArduinoに接続する必要があります。
RS485.jpg
引用元( https://playground.arduino.cc/DMX/DMXShield )

電子回路(今回はボリュームを3個使いましたが、ArduinoUnoは全部で6個のアナログ入力ができるので6chに拡張することができます)
arduino2.JPG
作成したシールド
100均で買ったプラスチックの箱に、USBとキャノンの穴をあけました。Arduino Unoがぴったり入ります。LTC485はキャノンコネクタに直接ハンダ付して空中配線しています。ふたの所に3か所穴をあけてボリュームを取り付けました。
photo03.JPG

ソフトウェア1(DmxSimpleを使う)

ArduinoのDmxSimpleライブラリを使って簡単にDMXコントローラーが製作できます。
DmxSimpleライブラリのインストール方法については、「ArduinoによるDMX512制御DMXSimpleを使う」 (https://qiita.com/Ina3/items/9af8e14d991e8b1791d4 )を参照してください。
プログラムは、DmxSimpleをインクルードしてDmxの出力ピンを指定します。今回は、Pin1を出力にしました。
3個のボリュームを使って、その値を読み込みDmx出力します。analogReadでは0Vから5Vまでの電圧を0から1023までの値に変換するので、4で割ってDmxの0から255の値(8ビット)に変換しています。ArduinoのanalogReadは0から5の6chあるので、そのままで最大6chのDMXコントローラが製作できます。
ボリュームをスライド式に変えると本物のDmxコントローラらしくなります。

#include <DmxSimple.h>
int ch1   = 0;
int ch2   = 0;
int ch3   = 0;
void setup() {
  DmxSimple.usePin(1);
  DmxSimple.maxChannel(6);
}
void loop() {
ch1   = analogRead(0)/4;
ch2   = analogRead(1)/4;
ch3   = analogRead(2)/4;
    DmxSimple.write(1, ch1);
    DmxSimple.write(2, ch2);
    DmxSimple.write(3, ch3);
    delay(15);
}

ソフトウェア2(DmxSimpleを使わない)

ArduinoのDmxSimpleライブラリを使わなくても、DMXコントローラーが製作できます。
プログラムの詳細は、ArduinoによるDMX512制御(DmxSimpleを使わない)(https://qiita.com/Ina3/items/4a596d8f0849917c5058 )を参照してください。

int ch1   = 0;
int ch2   = 0;
int ch3   = 0;
int Tx = 1;//DMXoutputPin

void setup() {
}

void loop() {
  ch1   = analogRead(0)/4;
  ch2   = analogRead(1)/4;
  ch3   = analogRead(2)/4;

   pinMode(Tx,OUTPUT);
        digitalWrite(Tx,0);//Send a Low data of Break Signal
        delayMicroseconds(88);
        digitalWrite(Tx,1);//Send a High data of Mark after Break
        delayMicroseconds(8);
        Serial.begin(250000,SERIAL_8N2);//Set a Serial mode
        Serial.write(0x0);//Send a Start Code as 0
        Serial.write(ch1);//Send a Ch1 Data
        Serial.write(ch2);//Send a Ch2 Data
        Serial.write(ch3);//Send a Ch3 Data
        Serial.end( );//Reset a Serial mode
        delay(10);
 }