#author("2022-01-10T09:05:20+09:00","","")
#author("2022-01-10T09:07:08+09:00","","")
~ Art-Netの仕様の解説とRaspberryPiで扱った記録です。
~ 現物の開発はこれからですが、仕様について調べた結果を自分向けのメモを兼ねて書いておきます。不定期にて内容が増えていくと思われます。
-----
目次
#contents()
&br;
*Art-Netとは? [#qea6a8c1]
&br; [[%%%ArtisticLicence.com%%%:https://artisticlicence.com/]]が公開している「DMX over EtherNet」の一種です。
&br; 「DMX over EtherNet」とはDMX512をEtherNetで送受信する方法の総称です([[%%%レガシーDMX512をLANケーブルを使って送るだけの使い方%%%:http://www.densokogei.jp/?DMX512#u9566e46]]は含まれません)。Art-Net以外にも「ACN」「sACN」「ETC-Net2」「ETC-Net3」「MA-Net」などがあります。一部は仕様が非公開だったり機器の製作・販売にはライセンス使用料を求められたりします。
&br; Art-Netは仕様が公開されて無料で使える「DMX over EtherNet」です。
&br; 以下、ネットワーク用語が沢山出てきますが、ここでは細かく解説致しませんのでご了承ください。
*Art-Netの概要 [#n8e5272a]
&br; 2021年現在、4世代あります。3世代目のArt-Net3で大きな変更がされておりますが、上位互換ですので下位仕様に合わせて設定すれば世代が違っても共存出来ます。私の考えですが、Art-Net3を前提に装置を製作し、初代Art-Netに合わせた使い方をするのが無難な用法だと思います。
&br; Art-Netは複数のDMX512を1本のEtherNetで送受信出来、直接受信も可能ですが、ノードと呼ばれる装置を用いて任意のユニバースをレガシーDMX512として取り出すことも可能です。ノードの存在が最大のメリットでしょう。もちろん、送受信機間でユニバースを合わせることはユーザーにとって重要な設定要素です。
&br; ハードウェアはIPv4のEtherNetを通せるネットワーク装置です。TCP/IPやUDP/IPを通せるネットワークと言ってもいいでしょう。数ユニバースなら10BaseTやwi-fiなどの比較的遅いネットワークでも送れるようです。
&br; データはUDP/IPと呼ばれる手法で送受信します。UDPは機器間のデータの受け渡しの方法、IPは機器間を結びつける方法を表しています。UDPはユーザーが意識する必要がないことですが、IPにおけるアドレス(IPアドレス)はユーザーが適切に設定しなければなりません(自動的に設定されるケースもあります)。
&br; 送受信方法(送受信モードと呼んだ方が伝わりやすいでしょうか)には2種類あります。「マルチキャスト(ブロードキャスト)」と「ユニキャスト」です。動作の違いを説明すると長くなるので割愛しますが、送受信機間でこの設定が合っていないと動作しませんのでユーザーにとっても重要な設定要素です。
&br; ユーザーは「IPアドレス」「送受信モード」「ユニバース」の3つを設定して使うと思ってください。
&br; 以下、Art-Net3を基準に書きます。
**どれくらいのDMX512が送れるのか [#pf9ca66c]
&br; 仕様書によると、マルチキャストなら最大40ユニバース、ユニキャストなら1000BaseTで4000ユニバース以上とあります。DIY規模では40ユニバースもあれば余る程なので問題にならない上限だと思います。
**ユニバースのナンバリング(アドレッシング) [#b808ae89]
&br; DMX512自体にスロットのアドレスがある様に、複数のユニバースを扱うなら識別する何かを割り振らないといけません。
&br; Art-Netには Net(ネット)/SubNet(サブネット)/Universe(ユニバース)というユニバースのアドレッシングが定義されています。大雑把に言うなら、送信側と受信側でこれらを合わせればいいのです。
-Net(ネット):7bit(0-127の数)で表す大枠のアドレス ※ Art-Net3から追加になったので機器によっては設定項目がありません。
-SubNet(サブネット)4bit(0-15の数)で表す中間枠のアドレス
-Universe(ユニバース)4bit(0-15の数)で表す最小枠のアドレス

&br; 分かれてはいますが、実際のところは15bit長の数値で表すユニバースのアドレスです。
&br; ''※ 初代Art-NetとArt-Net2にはNet(ネット)がありません。16bit長のフィールド<Universe>で一括りにされ、下位8bitをSubNet(サブネット)/Universe(ユニバース)と同様に使います。''Art-Net3から拡張された要素ですが、データのバイト長は同じなので、Net(ネット)を0x00とすれば新旧の互換性があります。下記の[[%%%Art-Netのパケットプロトコル%%%>#qd1024cb]]を参照してください。
**物理装置 [#aa6a793d]
&br; IPv4のEtherNetが通るネットワーク装置を用います。
&br; 俗に言うLANですが、物理的な形式は限定されていません。RJ45ケーブル(LANケーブル)を使うLANだけでなく、インターネット経由でもwi-fiでも理屈では使えます。
**IPアドレス [#cd1529c5]
&br; IPv4を用います。クラスAと呼ばれるアドレスの一部です。
&br; ただし、インターネットなどに接続しない、閉じたネットワークで使用しないといけません。インターネットを通す場合はVPNを用いましょう。
***IPアドレスの範囲 [#e5c444ba]
-''2.0.0.0~2.255.255.255'' (ネットワークスイッチがOFFの場合) 
-''10.0.0.0~10.255.255.255'' (ネットワークスイッチがONの場合)
-''サブネットマスクは8bit'' (x.x.x.x/8やx.x.x.x/255.0.0.0などと表現されます)
&br; ※ x.0.0.0はネットワークアドレス、x.255.255.255はブロードキャストアドレスなので機器には与えられません。
&br; ※ 2.0.0.0から始まるIPアドレスはグローバルアドレスとして定義されていますが、何故Art-Netはここを採用したのでしょう??
&br; ※「ネットワークスイッチ」の意味が不明。
***機器へのIPアドレスの割り当て [#z9931359]
&br; 上記の範囲内であれば任意のアドレスを用いて構わないのですが、ネットワーク内での重複は避けなければなりません。
&br; 割り当ての方法は2つあります。
-ネットワーク内にDHCPサーバーを設置してそこから得る。
-ネットワークデバイスのMACアドレスと[[%%%ArtisticLicence.com%%%:https://artisticlicence.com/]]から得られるOEMコードを用いて算出する。

&br; ※ OEMコードは[[%%%ArtisticLicence.com%%%:https://artisticlicence.com/]]が発行するベンダーコードです。Art-Net装置のメーカー(ベンダー)を表すコードですから、一般ユーザーが取得する必要はありません。DIYとはいえ、自作するなら必要かもしれません。
***IPアドレスの算出方法 [#v59d830e]
&br; 重複の可能性を完全に排除出来ませんが、重複の可能性は宝くじで上位を取るくらいだそうです。
&br; OEMコードが分かっていれば自動設定できることなので、ユーザーが手入力しなければならない機器は少ないと思います。装置を作る際に必要なこと、くらいに思っていいでしょう。
&br; 算出に必要な情報
-ネットワークデバイスのMACアドレス (ネットワークデバイスの固有番号。48bit(6バイト)整数)
-[[%%%ArtisticLicence.com%%%:https://artisticlicence.com/]]から得たOEMコード (2バイト整数)

&br; これらを使ってIPv4アドレスの2つ目、3つ目、4つ目の数値を得ます。
&br; 例として次の値を使います。[[%%%ArtisticLicence.com%%%:https://artisticlicence.com/]]の仕様書にある内容です。
-MACアドレス = 12:45:78:98:34:76 (ここでは10進数ですが、機器やOSでの表示では16進数なことが多いので注意)
-OEMコード = 0x0010 -> この数値は2バイト整数ですが、上位バイトと下位バイトを分けて使うので、0x00(10進数で0)、0x10(10進数で16)としておきます。 

&br; IPv4の4つの数値は次の様に得ます。
-''IPv4アドレスの1つ目の数値''
&br; 2 または 10 
-''IPv4アドレスの2つ目の数値''
&br; [MACアドレスの4つ目の数値] + [OEMコードの上位バイト] + [OEMコードの下位バイト]
&br; 98 + 0 + 16 = 144 (256以上になった場合は和の下位バイトを用いるらしい)
-''IPv4アドレスの3つ目の数値''
&br; [MACアドレスの5つ目の数値]
&br; = 34
-''IPv4アドレスの4つ目の数値''
&br; [MACアドレスの6つ目の数値]
&br; = 76
-これらを組み合わせて次の数値になります。
&br; x.144.34.76/255.0.0.0
&br; 1つ目のxの値は2または10です。
***ポート番号 [#w31a0349]
&br; 固定値 ''0x1936'' です。10進数なら ''6454'' です。
**送受信の考え方 [#n032b8af]
***マルチキャスト、ブロードキャスト [#k8161077]
&br; この記事ではマルチキャストを扱いますので、ネットワーク的にはブロードキャスト通信を使います。ブロードキャストとは同じゾーンのすべての機器に一斉送信する方法です。
&br; ブロードキャストアドレスがデータの送り先です。2.255.255.255 又は 10.255.255.255 です。
&br; 通常通信ですと特定のアドレスに向けて送信しますが、この方法ならとにかく全部が全部に送られます。ユニバースが多いと受信側に無用なデータ受信を強いてしまいますが、送信側にとっては負荷が少なく、装置の構築も簡単な方法です。
***UDP送信 [#j97698b7]
&br; 機器間のデータのやり取りの方法です。同類のTCPは相手に届いたデータが正しいか確認しながら行う丁寧な送受信方法ですが、UDPは相手に正しく届いたかなど気にせず一方的に送り付ける荒っぽい方法です。DMX512は後者と同類です。
&br; 一抹の不安を感じる半面、送受信の手続きが簡単なので負荷が少なく処理速度が速いのが特徴です。DMX512のデータは常に変化し保存を前提としませんから、今間違っていても次が正しければ済むのでUDPを使うことにメリットがあります。
**Art-Netのパケットプロトコル [#qd1024cb]
&br; Art-NetはUDP/IPを用いて送受信されますのでEtherNet内ではパケットという単位でデータが扱われます。そのパケットの中身について説明します。
&br; パケットプロトコルには何種類かありますが、今回扱うのは「ArtDmx」だけです。
&br; ArtDmx以外はユニキャストやネットワーク管理で用いるパケットプロトコルですが、マルチキャストでDMX512のデータを送るのならArtDmxだけでも機能します。
|CENTER:|CENTER:|CENTER:|CENTER:|CENTER:|CENTER:||c
|>|>|>|>|>|>|''パケットプロトコル:ArtDmx (Art-Net3基準)''|
|>|フィールドNo.|名前|データ種類|データ長|ビット|CENTER:説  明|
|初代Art-Net&br;Art-Net2|Art-Net3,4|~|~|~|~|~|
|1|1|ID|ASCII&br;テキスト|8byte|-|8バイトのASCIIテキストでArt-Netのパケットだと宣言する。&br;'Art-Net'+0x00&br;文字コード:0x41 0x72 0x74 0x2d 0x4e 0x65 0x74 0x00|
|2|2|OpCode|Int16&br;2バイト整数|2byte|-|別表に定義されたOpCodeを用いてパケットの種類を宣言する。&br;ArtDmxでは 0x5000 を用いる。&br;リトルエンディアンなので、0x00 0x50 の順で送信される。|
|3|3|ProVerHi|Int8&br;1バイト整数|1byte|-|Art-Netプロトコルリビジョン番号の上位バイト&br;※ データとしては次のフィールド<ProVerLow>と合わせた2バイト整数である。|
|4|4|ProVerLow|Int8&br;1バイト整数|1byte|-|Art-Netプロトコルリビジョン番号の下位バイト&br;※ ProVerの送信は、フィールド<ProVerHi>とフィールド<ProVerLow>を合わせ、ビッグエンディアンの2バイト長のデータだと考えていい。&br;※ 現在値は14(0x000E)である。フィールド<ProVerHi>は0x00、フィールド<ProVerLow>は0x0Eとなる。|
|5|5|Sequence|Int8&br;1バイト整数|1byte|-|パケットの順番を0x00から0xFFの範囲でローテーションでカウントする。パケットが順番通りに届かない場合に補正をするためのカウンタ。&br;1バイトのインクリメント・カウンタなので0xFFの次は0x00となる。&br;用いなくても構わないらしく、その場合は固定値(0x00)とする。|
|6|6|Physical|Int8&br;1バイト整数|1byte|-|DMX512が入力された物理ポートの番号を表す。&br;Art-NetのNet(ネット)/SubNet(サブネット)/Universe(ユニバース)を表す物ではない。&br;※ 受信機にとってはNet/SubNet/Universeが絶対であり、送信機側のハードウェアの都合を受信機が認識する必要は無いと思うので、個人的には「蛇足データ」の様に思える。&br;※ 今後の検証によるが、0x00を用いれば良いと思われる。|
|7&br;フィールド&br;<Universe>&br;という名前で&br;Int16&br;2バイト整数|7|SubUni|Int8&br;1バイト整数|1byte|7-4|4bit(0-15の数)でSubNet(サブネット)を表す。|
|&br;|&br;|&br;|&br;|&br;|3-0|4bit(0-15の数)でUniverse(ユニバース)を表す。|
|&br;|8|Net|Int8&br;1バイト整数|1byte|7|※ 使用しない。常に0。|
|&br;|&br;|&br;|&br;|&br;|6-0|7bit(0-127の数)でNet(ネット)を表す。&br;※ Art-Net3以降で使われるフィールド。&br;&color(#FF0000){''[注意] 初代Art-NetおよびArt-Net2ではフィールド<Net>とフィールド<SubUni>を合わせてInt16(リトルエンディアン)のフィールド<Universe>として扱う。&br;この場合、下位バイトはフィールド<SubUni>と同じ、上位バイト(Art-Net3のフィールド<Net>)は固定値(0x00)とする。''};|
|~|~|~|~|~|3-0|4bit(0-15の数)でUniverse(ユニバース)を表す。|
|~|8|Net|Int8&br;1バイト整数|1byte|7|※ 使用しない。常に0。|
|~|~|~|~|~|6-0|7bit(0-127の数)でNet(ネット)を表す。&br;※ Art-Net3以降で使われるフィールド。&br;&color(#FF0000){''[注意] 初代Art-NetおよびArt-Net2ではフィールド<Net>とフィールド<SubUni>を合わせてInt16(リトルエンディアン)のフィールド<Universe>として扱う。&br;この場合、下位バイトはフィールド<SubUni>と同じ、上位バイト(Art-Net3のフィールド<Net>)は固定値(0x00)とする。''};|
|8|9|LengthHi|Int8&br;1バイト整数|1byte|-|フィールド<Data>のデータ長を表す。フィールド<Length>と合わせた2バイト整数の上位バイト。&br;データ長が512スロットなら0x02となる。512=0x0200|
|9|10|Length|Int8&br;1バイト整数|1byte|-|フィールド<Data>のデータ長を表す。フィールド<LengthHi>と合わせた2バイト整数の下位バイト。&br;データ長が512スロットなら0x00となる。ビッグエンディアンの2バイト長のデータと考えていい。|
|10|11|Data|Int8&br;1バイト整数|1-512&br;byte|-|DMX512のスロットデータ。可変長。&br;StartCodeは含まれない(?)。|
&br; ※ 実質2バイト数として扱うフィールドが幾つかありますが、エンディアンが統一されていないので注意が必要です。
*Art-Net機器を作る!? [#sb2e5685]
&br; Art-Net機器を作ってみよう!という無謀ネタです。
&br; Art-Netの部分だけなら、LinuxサーバーとLANを設定出来てプログラムを書けるプロなら数時間で組めると思います。パケットデータを一方的に送って勝手に受けるだけですから。
&br; レガシーDMX512のデバイスまで作ると範囲は広がりますが、幸いレガシーDMX512の製作だけなら実績があります。
**なぜArt-Net? [#h930e334]
&br; 無料で使え、他と比べて簡素で、対応している調光卓が多いからです。ちゃんと動く中華電器のノードが安価なのもあります。
**基本方針 [#uae3e408]
&br; [[%%%RaspberryPi%%%:https://www.raspberrypi.org/]]をRasbianで稼働させPython3でプログラムします。安価なマイコンボードですが、ウェブカメラも構成できる処理能力がありますので、動画に比べたら誤差にも等しいデータ量のDMX512を扱うのは楽勝です。私個人が楽勝でないことは言うまでもありませんが・・・
&br; RaspberryPiの概要は [[この記事:https://www.sejuku.net/blog/48510]] が分かりやすいでしょうか。

~ ・・・以下、まとめ中

トップ   編集 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 検索 最終更新   ヘルプ   最終更新のRSS