概要
ArduinoUnoを使って照明用のDMX512のための3ch DMXコントローラを安価に製作しました。ボリュームで制御します。
ソフトは、先人がすばらしいライブラリ(DmxSimple)を作っているので、これを利用しています。
また、DmxSampleを使わないプログラムも紹介します。
ArduinoUnoの出力をEIA-485(RS485)にするために、シールド(ハードウェア)を作成し、次に動かすためのスケッチ(ソフトウェア)を作成します。
ハードウェア
DMX512を使うためには電気的にEIA-485に合わす必要があり、そのためにLT1785,SN75176,LTC485等のRS485トランシーバICをArduinoに接続する必要があります。
引用元( https://playground.arduino.cc/DMX/DMXShield )
電子回路(今回はボリュームを3個使いましたが、ArduinoUnoは全部で6個のアナログ入力ができるので6chに拡張することができます)
作成したシールド
100均で買ったプラスチックの箱に、USBとキャノンの穴をあけました。Arduino Unoがぴったり入ります。LTC485はキャノンコネクタに直接ハンダ付して空中配線しています。ふたの所に3か所穴をあけてボリュームを取り付けました。
ソフトウェア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);
}