ArduinoによるDMX512制御（DmxSimpleを使う）

# 概要
ArduinoUnoを使って照明用のDMX512を制御します。
先人がすばらしいライブラリ(DmxSimple)を作っているので、これを利用します。
ArduinoUnoの出力をEIA-485(RS485)にするために、シールド（ハードウェア）を作成し、次に動かすためのスケッチ（ソフトウェア）を作成します。

DmxSimpleを使っている事例
【Arduino】ArduinoでDMX信号を出して照明を制御しちゃう【DMX】(http://moonwalkers.blog20.fc2.com/blog-entry-157.html ) 
[Arduino]:DmxSimpleで電球を光らせる(https://sites.google.com/site/mathrax2010/arduino/-processing-arduinoto-no-tsuushin )

# DMX512について

参考資料
DMX512 ウィキペディア　（https://ja.wikipedia.org/wiki/DMX512-A ）

# ハードウェア(シールド)
DMX512を使うためには電気的にEIA-485に合わす必要があり、そのためにLT1785,SN75176,LTC485等のRS485トランシーバICをArduinoに接続する必要があります。
引用した回路図
![fig04.jpg](https://qiita-image-store.s3.amazonaws.com/0/211560/b65a6e85-a658-6d31-8d7a-2a7ba6414e76.jpeg)

引用元( https://playground.arduino.cc/DMX/DMXShield )
作成したシールド
100均で買ったプラスチックの箱に、USBとキャノンの穴をあけました。Arduino Unoがぴったり入ります。LTC485はキャノンコネクタに直接ハンダ付して空中配線しています。
![fig11.jpg](https://qiita-image-store.s3.amazonaws.com/0/211560/f07c9cc5-40a4-fde3-0c5a-6bbdc8e2ef4d.jpeg)

# ソフトウェア
### DmxSimpleライブラリのインストール
 Arduino用のライブラリに「DmxSimple」というライブラリがあり、それを使うと簡単にプログラムを作ることができます。
1.  DmxSimpleをdownloadします
　ここ（http://www.arduinolibraries.info/libraries/dmx-simple )からDｍxSimple-3.1.0.zip(39KB)をdownloadし、解凍します。
1. DmxSimpleを解凍します
　ファイルが圧縮されているので右ボタン⇒解凍　で解凍します。
1. 解凍したDmxSimpleをlibrariesフォルダにいれます。
　エクスプロ―ラを起動し、ドキュメント⇒Arduino⇒と順に開いてください。librariesがありますか？　もしなければlibrariesというフォルダを作ってください。そのlibrariesフォルダの中に先ほど解凍したDmxSimple-3.1.0のフォルダごと入れてください。
1. Arudinoでライブラリの「DmxSimple」を確認
　ファイル⇒スケッチ例⇒カスタムライブラリのスケッチ例⇒DmxSimple　が見えることを確認してください
1. Arudinoでライブラリの「DmxSimple」があるかどうかを確認する
![fig01.jpg](https://qiita-image-store.s3.amazonaws.com/0/211560/eb3fdabc-72ac-f7e0-16df-0ebd84c8a4d4.jpeg)

 
### ライブラリ内のスケッチFadeUpの解説
プログラムのみを抜き出すと、

```cpp
#include <DmxSimple.h>
void setup() {
 DmxSimple.usePin(3);
 DmxSimle.maxChannnel(4);
}
void loop() {
  int brightness;
  for (brightness = 0; brightness <= 255; brightness++) {
    DmxSimple.write(1, brightness);
    delay(10);
 }
}
```
となるので、「DmxSimple」というライブラリをインクルードし、Pin3をDMX512出力に設定して、brightnessを０から255まで10ミリ秒ごとにデータ出力し、それを繰り返すプログラムだとわかる。
DimmerにDMXのアドレス１を設定し、接続してソフトを動かすと、明るさが徐々に増加していく。
またRGBライトを接続していると赤の明るさが徐々に増加していく。

### ライブラリ内のスケッチFadeUpDownの解説
プログラムのみを抜き出すと、

```
#include <DmxSimple.h>
int brightness = 0;
void setup() {
 DmxSimple.usePin(1);
 DmxSimle.maxChannnel(4);
}
void loop() {
  for (brightness = 0; brightness <= 255; brightness++) {
    DmxSimple.write(1, brightness);
    delay(15);
  }
  for (brightness = 0; brightness <= 255; brightness++) {
    DmxSimple.write(1,255- brightness);
    delay(15);
  }
　delay(400); 
}
```
となるので、「DmxSimple」というライブラリをインクルードし、Pin1をDMX512出力に設定して、チャンネル１で０から255まで15ミリ秒ごとにデータ出力し、さらに255から０まで15ミリ秒ごとに順に変化させデータ出力し、400ミリ秒待って、繰り返すプログラムだとわかる。
DimmerにDMXのアドレス１を設定し、接続してソフトを動かすと、明るさが徐々に増加し、最大になったら逆に明るさが減少していく。
またRGBライトを接続していると赤の明るさが徐々に増加し、最大になったら逆に明るさが減少していく。

### ライブラリ内のスケッチSerialToDmxの解説
プログラムのみを抜き出すと、

```cpp
#include <DmxSimple.h>
void setup() {
 Serial.begin(9600);
}
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);
     Serial.println();
    }
    value = 0;
  }
}
```
となるので、「DmxSimple」というライブラリをインクルードし、シリアル通信を9600bpsで使っている。シリアル通信はPin0とPin1を使っており、プログラムの中でDmxSimple.usePinが設定されていないので、DmxSimpleのdefaultの3番pinがDMX512の出力になる。PCからのシリアルデータ（ASCIIコード)を１文字ずつArduinoが受け取り、文字'c'が来るまでの数値を変数'channel'に入れて、その後の数値を変数'value'に入れて文字’ｗ’が来たらDMXとして出力するようになっている。
実際の動作は、プログラムをArduinoに書き込み、ツール⇒シリアルモニタ⇒速度を9600bpsに設定すると、パソコン画面に次のように表示される。一番上の欄に灯体のチャンネルと数字を1c128ｗのようにキーボードから入力すると、1チャンネルに128というデータがDMX512として出力される。
![fig02.JPG](https://qiita-image-store.s3.amazonaws.com/0/211560/802f49ea-b17c-4f34-7dd8-553bd433f872.jpeg)