全年全月9日の投稿[43件](4ページ目)
2022年3月 この範囲を時系列順で読む この範囲をファイルに出力する
Art-Netを受信した後、送信元別だった受信値をミックス(HTP)する方法。
numpy.maxを用いれば簡単
受信値を3次元のnumpy.arrayで保存します。
3次元のnumpy.arrayはエクセルでイメージするとわかりやすいかなと。
1スロットの受信値は0-255の数値で、これが横方向(行)に512個並んだ状態をユニバースとします。
これをルート別に縦方向(列)で並べます。ここまでは縦横の1枚のシートです。
この1枚を送信元別のシートとし、レイヤーとして重ねます。もちろん、スロットアドレスとルートは同様にします。
あとはレイヤーを串刺しで最大値を得ればHTPでミックスしたルートとスロットの2次元のnumpu.arrayを得られます。
numpyをnpの名前でimportし、3次元のnumpy.arrayをan_cache_senders_route、最大値の2次元のnumpy.arrayをan_cache_htpとすると次の様になります。
an_cache_htp = np.max( an_cache_senders_route, axis=0 )
こんな感じの1行で計算出来ます。axis=0は最大値を得る次元方向の指示です。3次元なら、axis=2は横で、axis=1は縦で、axis=0は奥行という指示です。
以下、ちょいとオレメモ
受信値、付随するデータ
an_bytes 受信したArt-Netパケットのデータ(type=bytes、別途デコード必要)
an_sender_ipaddress 受信したArt-Netパケットの送信元IPアドレス(type=string、4つのドット切り10進数 IPv4の一般的な表記)
an_received_datetime 受信された時点でdatetime.datetime.now()により取得した日時(type=datetime.datetime)
処理の処理を指示するデータ
an_universes2route 対象ユニバースの1次元配列 ( Net, Subnet, Universe )[ ルート ]
受信値を処理、管理するデータ
an_ipaddress_senders 送信元のIPアドレスの1次元配列 IPアドレス [ 送信元 ]
an_datetime_senders 送信元ごとの最終受信日時の1次元配列 最終受信日時 [ 送信元 ]
an_datetime_senders_route 送信元ごとにルートの最終受信日時の2次元配列 最終受信日時 [ 送信元, ルート ]
an_cache_senders_route 送信元とルートごとに受信値を保存する3次元配列 受信値 [ 送信元, ルート, スロットアドレス ]
an_cache_htp 次の処理へ渡す処理済み受信値の2次元配列 受信値 [ ルート, スロットアドレス ]
※ [ ]内はインデックスの要素([3次元目,2次元目,1次元目])
※ 同名のindexは同じ値になるように設定
#an_ipaddress_senders から an_sender_ipaddress と同じIPアドレスを持つ[ 送信元 ]のindex配列を得る
list( zip( *np.where( an_ipaddress_senders == an_sender_ipaddress ) ) )
※ 受信した際に重複しない様に送信元情報を保存してインデックスを発行し、送信元別に日時と受信値を保存するために使う。
※ ただし、対象のユニバースを送って来ない送信元は無いものとする。早い段階でフィルタしないと後が面倒。
#an_datetime_senders から現在日時より1秒以上前の日時を持つ[ 送信元 ]のindexの配列を得る
list( zip( *np.where( an_datetime_senders < ( datetime.datetime.now() - datetime.timedelta( seconds=1 ) ) ) ) )
※ 送信元の存在を確認するために使う。1秒間受信が無い送信元は無いものとする。
#an_datetime_senders_route から現在日時より1秒以上前の日時を持つ[ 送信元, ルート ]のindexの配列を得る
list( zip( *np.where( an_datetime_senders_route < ( datetime.datetime.now() - datetime.timedelta( seconds=1 ) ) ) ) )
※ ユニバースの存在を確認するために使う。1秒間受信が無いユニバース(=送信元,ルート)はゼロデータにする。
#Python #[Art-Net]
numpy.maxを用いれば簡単
受信値を3次元のnumpy.arrayで保存します。
3次元のnumpy.arrayはエクセルでイメージするとわかりやすいかなと。
1スロットの受信値は0-255の数値で、これが横方向(行)に512個並んだ状態をユニバースとします。
これをルート別に縦方向(列)で並べます。ここまでは縦横の1枚のシートです。
この1枚を送信元別のシートとし、レイヤーとして重ねます。もちろん、スロットアドレスとルートは同様にします。
あとはレイヤーを串刺しで最大値を得ればHTPでミックスしたルートとスロットの2次元のnumpu.arrayを得られます。
numpyをnpの名前でimportし、3次元のnumpy.arrayをan_cache_senders_route、最大値の2次元のnumpy.arrayをan_cache_htpとすると次の様になります。
an_cache_htp = np.max( an_cache_senders_route, axis=0 )
こんな感じの1行で計算出来ます。axis=0は最大値を得る次元方向の指示です。3次元なら、axis=2は横で、axis=1は縦で、axis=0は奥行という指示です。
以下、ちょいとオレメモ
受信値、付随するデータ
an_bytes 受信したArt-Netパケットのデータ(type=bytes、別途デコード必要)
an_sender_ipaddress 受信したArt-Netパケットの送信元IPアドレス(type=string、4つのドット切り10進数 IPv4の一般的な表記)
an_received_datetime 受信された時点でdatetime.datetime.now()により取得した日時(type=datetime.datetime)
処理の処理を指示するデータ
an_universes2route 対象ユニバースの1次元配列 ( Net, Subnet, Universe )[ ルート ]
受信値を処理、管理するデータ
an_ipaddress_senders 送信元のIPアドレスの1次元配列 IPアドレス [ 送信元 ]
an_datetime_senders 送信元ごとの最終受信日時の1次元配列 最終受信日時 [ 送信元 ]
an_datetime_senders_route 送信元ごとにルートの最終受信日時の2次元配列 最終受信日時 [ 送信元, ルート ]
an_cache_senders_route 送信元とルートごとに受信値を保存する3次元配列 受信値 [ 送信元, ルート, スロットアドレス ]
an_cache_htp 次の処理へ渡す処理済み受信値の2次元配列 受信値 [ ルート, スロットアドレス ]
※ [ ]内はインデックスの要素([3次元目,2次元目,1次元目])
※ 同名のindexは同じ値になるように設定
#an_ipaddress_senders から an_sender_ipaddress と同じIPアドレスを持つ[ 送信元 ]のindex配列を得る
list( zip( *np.where( an_ipaddress_senders == an_sender_ipaddress ) ) )
※ 受信した際に重複しない様に送信元情報を保存してインデックスを発行し、送信元別に日時と受信値を保存するために使う。
※ ただし、対象のユニバースを送って来ない送信元は無いものとする。早い段階でフィルタしないと後が面倒。
#an_datetime_senders から現在日時より1秒以上前の日時を持つ[ 送信元 ]のindexの配列を得る
list( zip( *np.where( an_datetime_senders < ( datetime.datetime.now() - datetime.timedelta( seconds=1 ) ) ) ) )
※ 送信元の存在を確認するために使う。1秒間受信が無い送信元は無いものとする。
#an_datetime_senders_route から現在日時より1秒以上前の日時を持つ[ 送信元, ルート ]のindexの配列を得る
list( zip( *np.where( an_datetime_senders_route < ( datetime.datetime.now() - datetime.timedelta( seconds=1 ) ) ) ) )
※ ユニバースの存在を確認するために使う。1秒間受信が無いユニバース(=送信元,ルート)はゼロデータにする。
#Python #[Art-Net]
PICでDMX512を出力する際、面倒なのがBreakTimeです。
一般的なUARTでDMX512の様に長いBreakTimeが使われることは無いためか、PICにはそのような機能がありません。何らかのチカラ技で作らないといけません。
私が最終的にたどり着いた方法は、
1)USARTが出力されるI/Oピンをプルダウンしてアイドル・ローにしておく。
2)BreakTimeは0x00の空送信で作る。ただし、0x00送信でもStopBit(H)が発生するので、以下(3)の方法で消す。
3)BreakTimeの空送信が始まってからStopBitが始まるまでの間(Lが続く間)にTRIS(I/Oピンの入出力方向を決めるフラグ)を入力に切り替える。入力にするとI/Oピンがハイインピーダンス(Z)になり、プルダウンされているためRS485ドライバに届く信号はLを維持する。
4)BreakTimeの時間に相当する空送信する。
5)BreakTimeの終わりというか次のフレームの送信開始前に0x00を送信してTRISを出力に切り替える。0x00送信のStopBitがMarkAfterBreakとなる。ただ、MarkAfterBreakは少し長い方が安定するので、0xCO(b11000000)などのMSB詰めの数値を使ってMarkAfterBreakを長くしてもいい。
といった内容です。
これならタイマー処理をせずにBreakTimeを作れます。
BreakTimeを表すデータをBreakTimeZero、BreakTimeZeroの始まりのバイトをBreakTimeNose、最後をBreakTimeTailと勝手に呼んでますが、RaspberryPiからのSPIデータをBreakTimeTailから始まるモノにしておけばPIC側の処理は凄く簡単です。
0)RaspberryPiからRESET信号(実際にはCSを用いる)をPICに送り、PICはこれを見て送信カウンタをクリアしてUSART.TXピンのTRISを入力に切り替えておく。アイドル・ロー。
1)SPIの最初のバイト(BreakTimeTail)を受信したら、USARTに渡して送信し、3bit分待ってからUSART.TXピンのTRISを出力に切り替える。以下、受信値を1バイト送信するごとに送信カウンタをインクリメントする。
2)512スロットを送信した後のバイトはBreakTimeNoseになる。ただ、PICのUSARTは1ワード分のキャッシュを持っているので、BreakTimeZeroの2バイト目をUSARTに渡した後(BreakTimeNoseが送信開始された後)、3bit分待ってからTRISを入力に切り替えてBrakTimeとする。送信制御は送信カウンタを用いる。
3)以下、SPIのデータが終了(RaspberryPiからのCSで確認)したら、送信カウンタをクリアしてSPIを受信待機にする。=>(1)に戻る。
4)BreakTimeZeroを送信する前にSPIが終わってしまったらエラー。TRISを入力に切り替えてBrakTimeにしておくなど、エラー処理を行う。
5)TRISの切り替えの前に3bit分待つのは、次の送信バイトの受け入れがStopBit中に可能になるからです。
こんな感じかな。
#電子工作
一般的なUARTでDMX512の様に長いBreakTimeが使われることは無いためか、PICにはそのような機能がありません。何らかのチカラ技で作らないといけません。
私が最終的にたどり着いた方法は、
1)USARTが出力されるI/Oピンをプルダウンしてアイドル・ローにしておく。
2)BreakTimeは0x00の空送信で作る。ただし、0x00送信でもStopBit(H)が発生するので、以下(3)の方法で消す。
3)BreakTimeの空送信が始まってからStopBitが始まるまでの間(Lが続く間)にTRIS(I/Oピンの入出力方向を決めるフラグ)を入力に切り替える。入力にするとI/Oピンがハイインピーダンス(Z)になり、プルダウンされているためRS485ドライバに届く信号はLを維持する。
4)BreakTimeの時間に相当する空送信する。
5)BreakTimeの終わりというか次のフレームの送信開始前に0x00を送信してTRISを出力に切り替える。0x00送信のStopBitがMarkAfterBreakとなる。ただ、MarkAfterBreakは少し長い方が安定するので、0xCO(b11000000)などのMSB詰めの数値を使ってMarkAfterBreakを長くしてもいい。
といった内容です。
これならタイマー処理をせずにBreakTimeを作れます。
BreakTimeを表すデータをBreakTimeZero、BreakTimeZeroの始まりのバイトをBreakTimeNose、最後をBreakTimeTailと勝手に呼んでますが、RaspberryPiからのSPIデータをBreakTimeTailから始まるモノにしておけばPIC側の処理は凄く簡単です。
0)RaspberryPiからRESET信号(実際にはCSを用いる)をPICに送り、PICはこれを見て送信カウンタをクリアしてUSART.TXピンのTRISを入力に切り替えておく。アイドル・ロー。
1)SPIの最初のバイト(BreakTimeTail)を受信したら、USARTに渡して送信し、3bit分待ってからUSART.TXピンのTRISを出力に切り替える。以下、受信値を1バイト送信するごとに送信カウンタをインクリメントする。
2)512スロットを送信した後のバイトはBreakTimeNoseになる。ただ、PICのUSARTは1ワード分のキャッシュを持っているので、BreakTimeZeroの2バイト目をUSARTに渡した後(BreakTimeNoseが送信開始された後)、3bit分待ってからTRISを入力に切り替えてBrakTimeとする。送信制御は送信カウンタを用いる。
3)以下、SPIのデータが終了(RaspberryPiからのCSで確認)したら、送信カウンタをクリアしてSPIを受信待機にする。=>(1)に戻る。
4)BreakTimeZeroを送信する前にSPIが終わってしまったらエラー。TRISを入力に切り替えてBrakTimeにしておくなど、エラー処理を行う。
5)TRISの切り替えの前に3bit分待つのは、次の送信バイトの受け入れがStopBit中に可能になるからです。
こんな感じかな。
#電子工作
SPIでレガシーDMXを出力する回路の基本要素は揃いました。PICをプログラムして実験する段階です。
本業が忙しくなってしまったので棚上げですが、PICの基本設計は進めましょう。
PICは12F1822を使います。PIC12とありますが、PIC16系の8ピン版と思っていい製品です。
ピンアサインは次の通りです。
拡張ミッドレンジPICにはモジュールのアサインピンをある程度切り替えられる機能があります。
TRISとはI/Oピンの入出力方向を設定する要素です。
VDD
VSS(GND)
RA0 TX_Pilot_LED TRIS-OUTPUT(汎用I/Oとして使い、送信が行われるとLEDを点灯させます)
RA1 SPI.SCK TRIS-INPUT
RA2 SPI.SDI TRIS-INPUT
RA3 DMX.RESET TRIS-INPUT
RA4 USART.TX TRIS-OUTPUT(ただし、BreakTimeを作るためにINPUTにすることがあります)
RA5 CSC1 TRIS-INPUT(クロックの設定は優先順位が高いので、TRISはどちらでも機能します)
これには隠れたコツがあります。
SPIを使うならSPI.SDOがあります。使わないI/Oですがどこかにアサインしなければなりませんので、USART.TXと同じRA4にアサインします。被って出力がおかしくなりそうですが、SPIよりも優先順位が高いUSART.TXが出力されますから大丈夫。逆だったら困りましたけどね。
クロック発信子にはクリスタルオシレータ(8MHz)SG-8002DC(3.3V)を使います。普段はPIC1個に対し水晶発振子を1個使うのですが、今回は同じクロックレートで動く複数のPICを1枚の基板に載せますので、部品点数を減らす意味も含めてこれを使います。PICのI/Oピンも減るし。
#電子工作
本業が忙しくなってしまったので棚上げですが、PICの基本設計は進めましょう。
PICは12F1822を使います。PIC12とありますが、PIC16系の8ピン版と思っていい製品です。
ピンアサインは次の通りです。
拡張ミッドレンジPICにはモジュールのアサインピンをある程度切り替えられる機能があります。
TRISとはI/Oピンの入出力方向を設定する要素です。
VDD
VSS(GND)
RA0 TX_Pilot_LED TRIS-OUTPUT(汎用I/Oとして使い、送信が行われるとLEDを点灯させます)
RA1 SPI.SCK TRIS-INPUT
RA2 SPI.SDI TRIS-INPUT
RA3 DMX.RESET TRIS-INPUT
RA4 USART.TX TRIS-OUTPUT(ただし、BreakTimeを作るためにINPUTにすることがあります)
RA5 CSC1 TRIS-INPUT(クロックの設定は優先順位が高いので、TRISはどちらでも機能します)
これには隠れたコツがあります。
SPIを使うならSPI.SDOがあります。使わないI/Oですがどこかにアサインしなければなりませんので、USART.TXと同じRA4にアサインします。被って出力がおかしくなりそうですが、SPIよりも優先順位が高いUSART.TXが出力されますから大丈夫。逆だったら困りましたけどね。
クロック発信子にはクリスタルオシレータ(8MHz)SG-8002DC(3.3V)を使います。普段はPIC1個に対し水晶発振子を1個使うのですが、今回は同じクロックレートで動く複数のPICを1枚の基板に載せますので、部品点数を減らす意味も含めてこれを使います。PICのI/Oピンも減るし。
#電子工作
2022年2月 この範囲を時系列順で読む この範囲をファイルに出力する
オレメモです。
socket受信の待ち受けで処理が一時停止するなら、threading用いた並列処理でsocket受信を実行し、メイン側へはqueueを使って通信する。
socketから受信したデータはqueue.putでメイン側に送る。block=True,time_out=Noneとし、block要因はメイン側での取り出し作業だけなので終了を待つ。
メイン側はqueue.getをtry:配下で実行する。block=Falseとし、queueにデータがあれば取り出し、データが無いかsocket受信側がアクセス中でデータが取り出せないと例外:Emptyになるのでtry:でスルーする。
queueでやりとりするデータはintのNet,SubNet,Universeとレベルデータのnumpy.arrayをタプルにした物とする。タプルに入れ込んだnumpy.arrayをqueueで扱えるかは今後の実験で確認する。
受信したArt-NetのUniverseが対象かどうかはメイン側で判別する。
これならsocketの受信待ちで全体を止めることなく動かせる、といいな。
#Python
socket受信の待ち受けで処理が一時停止するなら、threading用いた並列処理でsocket受信を実行し、メイン側へはqueueを使って通信する。
socketから受信したデータはqueue.putでメイン側に送る。block=True,time_out=Noneとし、block要因はメイン側での取り出し作業だけなので終了を待つ。
メイン側はqueue.getをtry:配下で実行する。block=Falseとし、queueにデータがあれば取り出し、データが無いかsocket受信側がアクセス中でデータが取り出せないと例外:Emptyになるのでtry:でスルーする。
queueでやりとりするデータはintのNet,SubNet,Universeとレベルデータのnumpy.arrayをタプルにした物とする。タプルに入れ込んだnumpy.arrayをqueueで扱えるかは今後の実験で確認する。
受信したArt-NetのUniverseが対象かどうかはメイン側で判別する。
これならsocketの受信待ちで全体を止めることなく動かせる、といいな。
#Python
客席テーブルに塗布したポリエステル樹脂は硬化していました。一安心。
ただ、アセトンが抜けるのに時間がかかりそうです。急がず焦らず今日は手を付けず、1日なのか2日なのか、アセトンが抜けたのを確認出来てから2層目にかかりましょう。
2層目は濃い目で肉付けをします。原液ままでは硬いのでアセトンを入れて少し柔らかくするつもりですが、塗り伸ばせる範囲で固めが望みです。熟練者なら室温で判断がつくのでしょうけど。
3層目は顔料を入れて色付けです。
単に1層目だからかもしれませんが、アセトンを多めに入れると硬化した表面が半艶になるようです。顔料を入れた3層目がツヤツヤ過ぎるなら、トップコートを兼ねてサラサラを塗ってみましょう。
小学生の頃、シンナーで溶かした発砲スチロールで紙を固められないか?と実験したのを思い出しました。
表面が固まっても中が固まらなくてガッカリした思い出ですけど、約半世紀後もやってることに大差がない。「三つ子の魂百まで」という格言がありますがその通りかもしれません。
ひょっとすると、発砲スチロールはアセトンで溶けるので、ポリエステル樹脂を半艶にする添加剤代わりになるかもしれません。ポリエステル樹脂は不純物を入れると艶が落ちるような気がするのです。
#ガチ工作
ただ、アセトンが抜けるのに時間がかかりそうです。急がず焦らず今日は手を付けず、1日なのか2日なのか、アセトンが抜けたのを確認出来てから2層目にかかりましょう。
2層目は濃い目で肉付けをします。原液ままでは硬いのでアセトンを入れて少し柔らかくするつもりですが、塗り伸ばせる範囲で固めが望みです。熟練者なら室温で判断がつくのでしょうけど。
3層目は顔料を入れて色付けです。
単に1層目だからかもしれませんが、アセトンを多めに入れると硬化した表面が半艶になるようです。顔料を入れた3層目がツヤツヤ過ぎるなら、トップコートを兼ねてサラサラを塗ってみましょう。
小学生の頃、シンナーで溶かした発砲スチロールで紙を固められないか?と実験したのを思い出しました。
表面が固まっても中が固まらなくてガッカリした思い出ですけど、約半世紀後もやってることに大差がない。「三つ子の魂百まで」という格言がありますがその通りかもしれません。
ひょっとすると、発砲スチロールはアセトンで溶けるので、ポリエステル樹脂を半艶にする添加剤代わりになるかもしれません。ポリエステル樹脂は不純物を入れると艶が落ちるような気がするのです。
#ガチ工作
socketの送受信は簡単ですが、受信は待ち受けになり、タイムアウトはあるものの、有効な受信があるまで全体の動作が一時停止になります。待ち受けをしながら他の処理を止めずに動かす方法の確立が当面の課題になります。
ネットを探すとそれらしい方法がいくつかあります。たぶんこの中に望んでいる方法があるのだと思いますが、それがどれかをこれから検討するワケです。
#Python
ネットを探すとそれらしい方法がいくつかあります。たぶんこの中に望んでいる方法があるのだと思いますが、それがどれかをこれから検討するワケです。
#Python
今週来週はコロナ騒動で現場が飛びまくり、急ぎの要件はありませんので工作を徹底的に進めます。
客席テーブルが現場から帰ってきたので天板表面の再塗装です。
先日も書きましたが、問題はウレタン塗料の柔らかさです。私の施工が間違っていたのかもしれませんが、ゴム脚の当たっていたところが凹んでしまったのです。硬さを増さないといけません。オービタルサンダーで前の塗装を削り落とし、FRPで使うポリウレタン樹脂を塗ります。
一層目は表面に塗るというよりポリウレタン樹脂を木の繊維に染み込ませるイメージです。気温が低いので硬化剤を重量比1.2%(夏季の2.0倍強)加え、アセトンを重量比40%加えてシャバシャバというかサラサラにし、塗ったというより濡らした感じにしています。
アセトンの量は変質しないギリギリかと思います。硬化しなかったら笑うしかありませんが、モノ作りの神様に見放されないことを祈りつつジックリ取り組みましょう。
#ガチ工作
客席テーブルが現場から帰ってきたので天板表面の再塗装です。
先日も書きましたが、問題はウレタン塗料の柔らかさです。私の施工が間違っていたのかもしれませんが、ゴム脚の当たっていたところが凹んでしまったのです。硬さを増さないといけません。オービタルサンダーで前の塗装を削り落とし、FRPで使うポリウレタン樹脂を塗ります。
一層目は表面に塗るというよりポリウレタン樹脂を木の繊維に染み込ませるイメージです。気温が低いので硬化剤を重量比1.2%(夏季の2.0倍強)加え、アセトンを重量比40%加えてシャバシャバというかサラサラにし、塗ったというより濡らした感じにしています。
アセトンの量は変質しないギリギリかと思います。硬化しなかったら笑うしかありませんが、モノ作りの神様に見放されないことを祈りつつジックリ取り組みましょう。
#ガチ工作
2022年1月 この範囲を時系列順で読む この範囲をファイルに出力する
友人と新年会をしてきました。
想うことは人それぞれ色々あるのだなと思ったり。
されど、自分評価かもしれませんが、今までやってきたことを有難がってくれるご意見があることには感謝であります。
#日常
想うことは人それぞれ色々あるのだなと思ったり。
されど、自分評価かもしれませんが、今までやってきたことを有難がってくれるご意見があることには感謝であります。
#日常
ここ数日、地元の消防団の出初式やら成人式のイベントでホール管理の増員に出ていました。
つて、基本の式典仕込みをするだけなので、仕込んでしまえば操作盤の置物になるだけ。
ちょうどいい空き時間が出来たので書き物を進める。
タイムコードのネタが随分進みました。
解説コーナーというより、自分で製品を作る際の資料整理と基本設計の場になっています。
けど、誰かが読むかもしれない文書としてまとめる作業は自分しか読まないメモとして殴り書きするより具体的に整理できるかもしれません。
読んでわかる人は少ないかもしれませんが、自分向けにはわかりやすく書くことになるので後日の自分向けのメッセージとしては価値が高いと思われます。オレメモの新しい書き方ってことで。
#ガチ工作
つて、基本の式典仕込みをするだけなので、仕込んでしまえば操作盤の置物になるだけ。
ちょうどいい空き時間が出来たので書き物を進める。
タイムコードのネタが随分進みました。
解説コーナーというより、自分で製品を作る際の資料整理と基本設計の場になっています。
けど、誰かが読むかもしれない文書としてまとめる作業は自分しか読まないメモとして殴り書きするより具体的に整理できるかもしれません。
読んでわかる人は少ないかもしれませんが、自分向けにはわかりやすく書くことになるので後日の自分向けのメッセージとしては価値が高いと思われます。オレメモの新しい書き方ってことで。
#ガチ工作
2021年12月 この範囲を時系列順で読む この範囲をファイルに出力する
切った貼ったの工作も大好きですが、ちょっと胃モタレ気味(w
電子工作にガチで取り組みたい今日この頃。
仕掛品ラックを作らないと作業スペースがありませんので、工作部屋の整理整頓が自宅での優先作業となりますが・・・
優先して手をつけたいのはDMXのパッチマシンです。
どれくらいの規模にするかはRaspberryPiを主軸にしたハードウェアの処理能力によりますが、小規模なディナーショーや野外コンサートで過不足なく使えるものにしたいとイメージしております。
以前、DMX切替機を頼まれて作ったことがあります。フェスで卓を2枚組んでどちらを使うか選択するための装置です。信号はBreakTimeを見て切り替えを行いますので受信側にとっては値が変わっただけのことになり、コネクタの抜き差しで稀に起こるパケットエラーからのアオリが発生しません。本卓とバックアップ卓の切り替えみたいな用法も出来ますので、可能ならこういった機能も搭載したいものです。
今思い付いたのですが、Art-NetなどのEtherNetベースなら切り替え器簡単かも。
debian系のOSでなら、3つのNICをbridge接続し、2つを卓側にし、1つを受信側にします。LinuxでHUBを作る方法の応用です。
で、卓側のNICの1つをiptablesで全DROP(NICは生きているがIPパケットをすべて破棄)にするのです。受信側にはもう1つのNICのパケットしか行きません。
切り替えは一端卓側のNICを2つとも全DROPにしてから有効にしたい方だけ改めてACCEPTにする手順です。
iptablesの設定変更だけで可能ならbashを数行書けば出来てしまいます。
ちょっと乱暴な方法に感じますが、これは実験してみたい。
#電子工作
電子工作にガチで取り組みたい今日この頃。
仕掛品ラックを作らないと作業スペースがありませんので、工作部屋の整理整頓が自宅での優先作業となりますが・・・
優先して手をつけたいのはDMXのパッチマシンです。
どれくらいの規模にするかはRaspberryPiを主軸にしたハードウェアの処理能力によりますが、小規模なディナーショーや野外コンサートで過不足なく使えるものにしたいとイメージしております。
以前、DMX切替機を頼まれて作ったことがあります。フェスで卓を2枚組んでどちらを使うか選択するための装置です。信号はBreakTimeを見て切り替えを行いますので受信側にとっては値が変わっただけのことになり、コネクタの抜き差しで稀に起こるパケットエラーからのアオリが発生しません。本卓とバックアップ卓の切り替えみたいな用法も出来ますので、可能ならこういった機能も搭載したいものです。
今思い付いたのですが、Art-NetなどのEtherNetベースなら切り替え器簡単かも。
debian系のOSでなら、3つのNICをbridge接続し、2つを卓側にし、1つを受信側にします。LinuxでHUBを作る方法の応用です。
で、卓側のNICの1つをiptablesで全DROP(NICは生きているがIPパケットをすべて破棄)にするのです。受信側にはもう1つのNICのパケットしか行きません。
切り替えは一端卓側のNICを2つとも全DROPにしてから有効にしたい方だけ改めてACCEPTにする手順です。
iptablesの設定変更だけで可能ならbashを数行書けば出来てしまいます。
ちょっと乱暴な方法に感じますが、これは実験してみたい。
#電子工作