見出し画像

マイコンによるDMX512受信

はじめに

DMX512-A信号を受けて動作する照明機器(パーライト、ウォッシャー、ムービングライトなどの灯体)を作るため必要な情報を提供します。
照明機器を作るという方であれば、電子回路についての知識があり、何らかのマイコンを使用することを想定されていると思いますので、そのマイコンについての解説は割愛します。
また、DMXについての情報(プロトコル)はESTAの資料「E1.11、USITT DMX512–A」や、インターネットを検索すると、さまざまな情報が載っていますのそちらを参照してください。

画像1

Photo: https://en.wikipedia.org/wiki/DMX512

ハードウェア

DMXの信号は、電気的にはいわゆるRS-485 (EIA-485)を使ったシリアル通信です。
基本としてはマイコンのUARTポートにRS-485ドライバIC(LTC485やその類似品)をつないで回路を作ります。

画像4

照明機器であればDMXを受信するだけでよいので、RS-485ドライバのRE/DE端子は受信専用に固定してもよいでしょう。
ただし、RDM (Remote Device Management) 対応としたい場合は双方向通信をする必要があるため、RE/DE端子をマイコンのGPIOポートへ接続しておくとよいでしょう。
RDMについての資料「ANSI E1.20」も参考になります。

機器間ではD+(A)、D-(B)、GNDを接続します。
現場では様々なメーカーの機器が接続される可能性があり、ときに同相電圧による通信異常や、グラウンドループなどの問題が起きることがありますが、照明システムを構築するライティングエンジニアの理解の範疇を超えてしまい、よくわからないトラブルとして処理されていることがあります。
スプリッター(絶縁、アイソレーター)を入れることもあります。
(灯体の選択や照明の演出についてはプロフェショナルだが、電気の知識があるとは限らない)

コネクタ

5ピンのXLRコネクタを使用することになっていますが、伝統的に古い照明器具では3ピンが使用されていたため、今でも混在していることが多いです。
これから作るのであれば5ピンに統一すべきでしょう。
・1: GND
・2: D-(B)
・3: D+(A)
・4: (D2-)
・5: (D2+)
まれに古い機器ではD+とD-のピンアサインが逆転しているものもありました。

8P8C (RJ-45) のモジュラーコネクタを使ったLANケーブルを流用することもあり、ピンアサインが定められています。
・1: D+
・2: D-
・3: (D2+)
・4,5: 未接続
・6: (D2-)
・7,8: GND
これも困ったことにD+とD-が逆転しているものがあります。

ターミネーター(終端抵抗)

照明機器側ではターミネーターを外付けるすることが多いですが、ターミネーター用の抵抗器(120Ω)を内蔵しスイッチでONできるようになっているものもあります。
ターミネーターはなくても動作しますが、灯体への配線が長いときは信号の反射により意図しない動作を引き起こすことがあります。

ソフトウェア

UARTペリフェラルの設定は 250Kbps、データ8bit、ストップビット2bit、パリティなし。
UART受信割り込みをうまく使うとよいでしょう。
DMXにはbreak→スタートコード→データという一連の流れがありますので、現在のステートを管理しながら、受け取るデータを処理するとよいでしょう。

break検出

DMXの一連のデータの頭はbreakがあるので、これを検出したときはデータの区切りと認識します。
UARTで普通のシリアル通信だけを扱う場合はbreakを意識することはありませんが、データが連続して0の状態が続くときをbreakと認識します。
割り込みステータスレジスタにbreak検出フラグがある場合はそれを確認します。

画像3

break検出がない場合は、フレーミングエラー検出等と受信データが0x00であるかで判断しましょう。

画像2

データレジスタには0x00が入ると思われますので、リードしてクリアしておきます。
breakと同時にデータオーバーランのフラグも立つことがあるため、割り込みから復帰する前にクリアしておきましょう。
マイコンによっては、berak受信時に独特の挙動をすることがあるので、テスト環境でよく確認します。

スタートコード受信

breakの次にはスタートコードとして0x00を受信するはずです。(ほかの値の時はRDM等別のデータの可能性がある)
breakに続いてスタートコードを受信できれば、次からはDMXの調光データの受信へ進みます。

データ受信

データ数は通常は512バイト連続して受信されるはずですが、実際には512よりも少ないときもあります。 その場合は、受信データが512に達する前に次のbreakを受信することになります。
データは連続して送られてきますので、取りこぼさないようにしましょう。

照明機器の動作

一般的に照明機器は、ディップスイッチ等で自身のDMXアドレス(スタートアドレス)をユーザーが指定できるようになっています。 受信したデータを数えていきDMXアドレスに達したところからを自身あての調光データと認識します。
照明機器が単体のライトであれば、マイコンのタイマーペリフェラルを使ったPWMで調光することになるでしょう。
ムービングライトであれば、ステッパーモーターやサーボモーターなどを駆動することになると思います。

開発キット

半導体メーカーが提供する開発キットを利用すれば、簡単に開発を始めることができます。
参考:NXP - DMX512 Software Development Kit
参考:Using a PIC Microcontroller for DMX512 Communication

おわり

これら一連のDMXのデータは絶え間なく1秒間に30~40回送られてきます。
昔の処理速度の遅いマイコンではデータを取りこぼすことがあり、ちらつきやカクカクするといった問題(「相性」で片づけられていたことでしょう)がおきていましたが、現代の8bitマイコンのAVRやPIC等では問題なく受信できます。32bitマイコンであるArm等であれば何ら問題はないでしょう。
なお、DMXのデータはチェックデジットもなく、送りっぱなしでデータ化けが起きてもエラーを検出する方法がありません。今からでもデータの最後にCRCなどを付ける拡張をしたいところです。

サンプルのプログラムは Mbed のライブラリとして公開しています。
https://os.mbed.com/users/okini3939/notebook/dmx512/

----
菅工房

この記事が気に入ったらサポートをしてみませんか?