Art-Netの規格の解説とRaspberryPiで扱った記録です。
執筆中です。
目次
複数のDMX512を1本のEtherNetで一斉に送ります。IPv4のEtherNetを通せるネットワークなら何でも使えます。数ユニバースなら10BaseTなどの遅いネットワークでも送れるようです。
送信方法には大きく分けて2つあります。ブロードキャストで一斉送信する「マルチキャスト」、個別に送る「ユニキャスト」です。
対応状況は当初からあるマルチキャストに軍配が上がります。どのArt-Net機器もマルチキャストなら100%対応する様です。
ここではマルチキャストを対象とします。マルチキャスト、すなわちブロードキャストがどんなものかを説明するのは大変なので割愛します。
以下、ネットワーク用語が沢山出てきますが、ここでこれらの解説は致しませんのでご了承ください。
以下はArt-Net3をベースに書きます。
規格書によると、マルチキャストなら最大40ユニバース、ユニキャストなら1000BaseTで4000ユニバース以上とあります。DIY規模では40ユニバースもあれば余る程なので問題にならない上限だと思います。
DMX512自体にスロットのアドレスがある様に、複数のDMX512を送るならユニバースごとにアドレスを割り振らないといけません。
Art-Netには Net(ネット)/SubNet(サブネット)/Universe(ユニバース)というユニバースのアドレッシングが定義されています。大雑把に言うなら、送信側と受信側でこれらを合わせればいいのです。
分かれてはいますが、実際のところは15bit長の数値で表すユニバースのアドレスです。
※ 初代Art-NetとArt-Net2の設定は8bit長でNet(ネット)がありません。16bit長のフィールド<Universe>で一括りにされ下位8bitを使います。
Art-Net3から拡張された要素ですが、全体のバイト長は同じなので、Net(ネット)を0x00とすれば新旧の互換性があると言えます。
IPv4のEtherNetです。俗に言うLANです。
ネットワーク装置はIPv4のEtherNetが通れば何でも構わないようです。十分な通信速度があれば、インターネット経由でもwi-fiでもいけると思います。
IPv4を用います。Aクラスと呼ばれるプライベートアドレスの一部を用います。
プライベートアドレスですから、インターネットなどに接続しない、閉じたネットワークで使用しないといけません。インターネットを通す場合はVPNを用いましょう。
原則として範囲内であれば任意のアドレスを用いて構わないけれど、ネットワーク内での重複は避けなければなりません。
割り当ての方法は2つあります。
※ OEMコードはArt-Net装置を作ったメーカーが持っているコードを用います。一般ユーザーが取得する必要はありません。自作するならArtisticLicence社に申請して取得します。
規格書の丸写しですが次の通りです。
必要な情報
これらを使ってIPv4アドレスの2つ目、3つ目、4つ目の数値を得ます。
仮の数値として次を使います。
◆ IPv4アドレスの1つ目の数値
◆ IPv4アドレスの2つ目の数値
◆ IPv4アドレスの3つ目の数値
◆ IPv4アドレスの4つ目の数値
これらを組み合わせて次の数値になります。
1つ目のxの値は2または10です。
固定値 0x1936 です。10進数なら6454です。
「ネットワークスイッチ」の意味が不明。現実にはどちらかで統一すれば使えるみたい。
Art-NetはUDP/IPを用いて送受信されますのでEtherNet内ではパケットという単位でデータが扱われます。そのパケットの中身について説明します。
次の「ArtDmx」以外にもパケットプロトコルが幾つかありますが、これらはユニキャストやネットワーク管理で用いられます。
今回はマルチキャストを使いますので、扱うのは「ArtDmx」だけです。
パケットプロトコル:ArtDmx (Art-Net3基準) | ||||||
フィールドNo. | 名前 | データ種類 | データ長 | ビット | 説 明 | |
初代Art-Net Art-Net2 | Art-Net3,4 | |||||
1 | 1 | ID | ASCII テキスト | 8byte | - | 8バイトのASCIIテキストでArt-Netのパケットだと宣言する。 'Art-Net'+0x00 文字コード:0x41 0x72 0x74 0x2d 0x4e 0x65 0x74 0x00 |
2 | 2 | OpCode | Int16 2バイト整数 | 2byte | - | 別表に定義されたOpCodeを用いてパケットの種類を宣言する。 ArtDmxでは 0x5000 を用いる。 リトルエンディアンなので、0x00 0x50 の順で送信される。 |
3 | 3 | ProVerHi | Int8 1バイト整数 | 1byte | - | Art-Netプロトコルリビジョン番号の上位バイト ※ データとしては次のフィールド<ProVerLow>と合わせた2バイト整数である。 |
4 | 4 | ProVerLow | Int8 1バイト整数 | 1byte | - | Art-Netプロトコルリビジョン番号の下位バイト ※ ProVerの送信は、フィールド<ProVerHi>とフィールド<ProVerLow>を合わせ、ビッグエンディアンの2バイト長のデータだと考えていい。 ※ 現在値は14(0x000E)である。フィールド<ProVerHi>は0x00、フィールド<ProVerLow>は0x0Eとなる。 |
5 | 5 | Sequence | Int8 1バイト整数 | 1byte | - | パケットの順番を0x00から0xFFの範囲でローテーションでカウントする。パケットが順番通りに届かない場合に補正をするためのカウンタ。 1バイトのインクリメント・カウンタなので0xFFの次は0x00となる。 用いなくても構わないらしく、その場合は固定値(0x00)とする。 |
6 | 6 | Physical | Int8 1バイト整数 | 1byte | - | DMX512のデータが入力された物理ポートの番号を表す。 Art-NetのNet(ネット)/SubNet(サブネット)/Universe(ユニバース)を表す物ではない。 ※ 受信機にとってはNet/SubNet/Universeが絶対であり、送信機側のハードウェアの都合を受信機が認識する必要は無いと思うので、個人的には意味が無い「蛇足データ」の様に思える。 ※ 今後の検証によるが、0x00を用いれば良いと思われる。 |
7 フィールド <Universe> という名前で Int16 2バイト整数 | 7 | SubUni | Int8 1バイト整数 | 1byte | 7-4 | 4bit(0-15の数)でSubNet(サブネット)を表す。 |
3-0 | 4bit(0-15の数)でUniverse(ユニバース)を表す。 | |||||
8 | Net | Int8 1バイト整数 | 1byte | 7 | ※ 使用しない。常に0。 | |
6-0 | 7bit(0-127の数)でNet(ネット)を表す。 ※ Art-Net3以降で使われるフィールド。 [注意] 初代Art-NetおよびArt-Net2ではフィールド<Net>とフィールド<SubUni>を合わせてInt16(リトルエンディアン)のフィールド<Universe>として扱う。 この場合、下位バイトはフィールド<SubUni>と同じ、上位バイト(Art-Net3のフィールド<Net>)は固定値(0x00)とする。 | |||||
8 | 9 | LengthHi | Int8 1バイト整数 | 1byte | - | フィールド<Data>のデータ長を表す。フィールド<Length>と合わせた2バイト整数の上位バイト。 データ長が512スロットなら0x02となる。512=0x0200 |
9 | 10 | Length | Int8 1バイト整数 | 1byte | - | フィールド<Data>のデータ長を表す。フィールド<LengthHi>と合わせた2バイト整数の下位バイト。 データ長が512スロットなら0x00となる。ビッグエンディアンの2バイト長のデータと考えていい。 |
10 | 11 | Data | Int8 1バイト整数 | 1-512 byte | - | DMX512のスロットデータ。可変長。 StartCodeは含まれない(?)。 |
※ 実質2バイト数として扱うフィールドが幾つかありますが、エンディアンが統一されていないので注意が必要です。
RaspberryPiをRasbianで稼働させPython3でプログラムします。