🗐 電装工芸日記 - 舞台照明機器の製作とか -

能登半島地震で被災された方々にお見舞い申し上げます。

or 管理画面へ

2022年2月 この範囲を時系列順で読む この範囲をファイルに出力する

Icon of admin
 Art-Netの受信データをデコードする処理を書いてみました。
 製作環境はRspberryPi4、Rasbian_buster、Python 3.7.3です。
------

import numpy as np

class coding:
 def decode(self, artnet_packet):
  """ Art-Netのbyte列を要素に分解する """
  id = artnet_packet[0:8]
  opcode = int.from_bytes(artnet_packet[8:10], 'little')
  prover = int.from_bytes(artnet_packet[10:12], 'big')
  sequence = int.from_bytes(artnet_packet[12:13], 'little')
  physical = int.from_bytes(artnet_packet[13:14], 'little')
  subuni = int.from_bytes(artnet_packet[14:15], 'little')
  sub = subuni // 16
  uni = subuni % 16
  net = int.from_bytes(artnet_packet[15:16], 'little')
  length = int.from_bytes(artnet_packet[16:18], 'big')
  data = np.frombuffer(artnet_packet, dtype=np.uint8, count=length, offset=18)
  return (id, opcode, prover, sequence, physical, net, sub, uni, length, data)

if __name__ == '__main__':
 an = coding()
 id, opcode, prover, sequence, physical, net, sub, uni, length, data_uint8 = an.decode(test_artnet_packet)

※ 行頭の空白には全角を使っています。
------
 test_artnet_packetに受信データを入れ、codingのインスタンスanでdecodeを呼び出します。
 書いてみたら案外スッキリした物になったので記念に掲載しました。

 socketで受信するのはバイナリデータ(Pythonで言うところのバイト列)ですが、これを一発でnumpy.arrayに変換してくれるnumpy.frombufferは便利です。
 int.from_bytesもバイト列をエンディアン指定でint数に一発変換してくれて便利です。
 私はPICマイコンと協調させて使うことが多いので、こういった機能があると助かります。

 上記ですとdataの戻り値がnumpy.uint8ですが、計算するためにはnumpy.uint16の方が良いと思います。
 data_uint16 = data.astype(np.uint16)
 とかで型変換するといいかもしれません。

#Python #[Art-Net]
Icon of admin
 Art-Netのアプリは画面表示とキー操作まで一応の完成をみました。
 キー操作はレスポンスに少しムラがあるので改善したい点です。使えるレベルなので今のところは将来課題としておきますが、ユーザーがご機嫌をうかがいながら使うユーザーインターフェースは大嫌いなのでとても重要です。

 余談ですが、売れている卓とそうでもない卓の違いにはこういった点の僅かなストレスの差もあります。卓は手段としての道具ですが、国内メーカーはカタログスペックばかり求めて手に馴染む道具を作ろうとしない。買うのは使う人ではありませんから仕方ないことでもありますが、国産のホール卓がダメな点です。国産で唯一、松村さんの卓にはこういったストレスが少ないのですが・・・。

 とまぁ愚痴はおいといて、これで本丸であるArt-Netの受信に取り掛かれます。
 単純な受信は別回しするThread内のsocketで受けるだけなので難しくないと思うのですが、パケットのデコードが少し面倒かもしれません。Art-Netのパケットはバイト列ですが、これらをPythonで扱いやすい様に分解して変換しなければなりません。Pythonはバイト型の扱いが少し苦手ですし、パケットにはアスキーテキスト、LSBの2バイト数、MSBの2バイト数、バイト型が混在しているので、よく考えて作らないといけません。実行回数が多い処理なだけに軽さも重要です。

#[Art-Net] #Python
Icon of admin
 ありがちな1液式の塗料は1週間以上放置しないと現場で使えませんが、ポリエステル樹脂は2日もあれば完全硬化して使えます。扱いが面倒なところや少なくない制限もありますが、現場投入までの工程としてはむしろ使いやすいかもしれません。
 そんなポリエステル樹脂を塗布した客席テーブルは今日から現場に出向です。自分は行きませんが、在籍園児が数百人いる幼稚園のお遊戯会で部下が一週間ほど使います。客席に卓を仮設するので客席テーブルの本業であります。使い勝手の確認はもとより、荷重をかけ続ける状況なのでロードテストにはうってつけです。
 この幼稚園は若園長が好き者で、スモーク炊いてムービング使って有名アイドルのアリーナコンサートよろしくゴリゴリにしたいとか。過去映像を見ましたが、明かりは頑張ってイイ感じに作ってますが、園児たちが自由過ぎてアンバランスなのか面白いのかよーわからん。お遊戯会でここまでしてどうする!?ってのが本音ですが、園児たちの思い出になって親御さんが楽しんでくれるなら仕事としては成立。
 ということで、ダメなところと傷みやすいところがもっともっと見えてくるといいかな。

#ガチ工作
Icon of admin
 PythonのThreadとQueueの使い方はだいたい理解しました。
 0.005秒のsleepで動作周期を持たせたThreadで512個の整数を延々と加算してqueue.putに出力し、本処理では0.001秒のsleepで動作周期を持たせたqueue.get_nowaitで取り出しながら0.1秒毎に表示を更新しています。処理負荷が小さくメモリ使用量も安定していてスムーズです。本処理での時間軸の管理はアセンブラっぽいカウンタ処理ですが、厳密な処理周期は不要なのでsignalを使うほどでもありません。
 Threadを使うメリットは高速化だと書く人が多いですが、私にとっては、処理によって違う要求時間を仕分け出来て、ポーリングだけど割り込みっぽいことが出来ることです。画面の更新はそれほど頻繁でなくていいけど、毎秒44回更新されるDMXの信号の処理は遅れたくないのですが、シングルスレッドでこの辺りを制御するのは案外面倒なのです。
 気を付ける点はQueueのputやgetのタイミングです。Queueは変数ではなくFIFO特性のスタックなことが肝ですが、C言語のスタックやポインタにセマフォが混ざった構成なので、C言語のこのあたりを知ってないと理解しにくいかも。PythonにC言語っぽい作法が残っているのが不思議ですが・・・
 ThreadとQueueを使ってキーボードの入力も作り直します。

#RaspberryPi #Python
Icon of admin
 RaspberryPiにRTC(リアル・タイム・クロックを取り付けてみました。
 RaspberryPiは無電源だと時計が動きませんので、起動すると前回終了した時刻から時計がカウントされます。
 これでは気持ちが悪いし、ファイルの更新時刻がおかしくなると開発作業ではトラブルのもとです。
 リンクの商品以外にもRTCはいろいろありますが、この製品は小型でGPIOに挿すだけで使えて何かとよいと思います。安価だし。
 設定方法はこのサイトがわかりやすいと思います。/boot/config.txtを更新した後に再起動を忘れずに。

#RaspberryPi
Icon of admin
 3層目は無事硬化しました。
 コテバケは掃除機で毛クズを除去して使いましたが完全にとはいきません。なでるとバリのようなのがあって気分が悪い。
 #120-#240-#400と研ぎ進め、アセトンを噴霧しましたが、削り目を無くすことはできませんでした。
 どうしようかと考えていたところ、倉庫の隅からダブルアクションのポリッシャーを発掘。今は無いホームセンターのシールが貼ってありましたのでかなり前に買ったのでしょう。
 バフを取り付けてコンパウンドで磨いたところ解決。ペーパーは#400までしかなくコンパウンドも中目しかありませんでしたので鏡面にはなりませんが、毛クズバリを除去し削り目は十分に抑えられました。よいんでないか?
 明日から一週間ほど現場に出ますが、その後にポリエステル樹脂をもう一層塗布し、もっと目の細かいペーパーとコンパウンドを使って仕上げるつもりです。

#ガチ工作
Icon of admin
 3層目を塗布してみました。#240で表面を均し、2層目と同じレシピに顔料を混ぜた物をコテバケで塗りつけです。
 昨日よりも気温が5度以上高いためか硬化反応が早い。24時間かからず、今日中に硬化しそうです。
 顔料を入れましたが半透明です。制限量に近い量を入れましたが、1度で完全に色が乗るモノでもないようです。
 明後日から現場使用なので作業は一旦中断です。

 ポリエステル樹脂の表面仕上げですが、ペーパーとスコッチブライトで磨いた後にアセトンを噴霧したらどうかと。深く溶かすのではなく細かい磨き目を消すだけですから、ほんのわずかに表面を溶かして均せればよい。
 ただ、アセトンに耐えられるスプレーボトルを近所で求めると高価な製品しかありません。恒久的に使うならアリですがお試しには高い。手元にラッカーシンナーやエタノールに対応したスプレーボトルが沢山あるので、アセトンに対応するかは確認出来ませんが、まずはコレでお試ししてみようかと。入れて15分くらい様子を見ればわかるっしょ。
 噴霧するのはジクロロメタンでもいいのかな?ジクロロメタンは3Dプリンタの造形品(PLAやABS)の表面を均すのに使っていますが、ポリエステル樹脂も溶かすっぽい。すぐ乾くのでアセトンより良い?

#ガチ工作
Icon of admin
 2層目を塗って気が付いたのですが、バリっぽいのはコテバケから出た毛クズが固まったモノでした。
 刷毛で塗っても毛クズが出ますし、ローラーなどもってのほか。スポンジ系はアセトンで溶けそうなので使えない。
 ペーパーで簡単に落とせるのでトップコート以外ではいいのですが、肝心のトップコートは何で塗りましょう。
 ガンを使えばいいのですが、準備や片付けに手間暇がかかるし周辺への飛散も多い。量を塗るとか特別に綺麗に仕上げたいとかなら使いますが、さほど仕上げにこだわらない5尺2尺の板を1枚塗るのに使いたくはありません。
 目の細かいスコッチブライトで固まった毛クズを落としてポリッシャー磨きが王道?
 ゴムベラで塗ればいいのかな?
 スコッチブライトで削ってヒートガンやバーナーで目潰し?
 どうしよう。。。

#ガチ工作
Icon of admin
 ポリエステル樹脂は24時間経過でいい感じに硬化していたので2層目を塗布しました。
 混合はポリエステル樹脂100g、硬化剤2g弱、アセトン10g。計量に使っている量りが1g単位なので0.1g単位のが欲しいかも。
 細いバリが固まったのを#320で軽く砥ぎ、削りカスを取り除いてコテバケで塗り込みました。
 気温が低いので硬化が遅いですが気長に待ちましょう。

 3層目を塗る前にはキッチリ砥ぎます。鏡面は目指しませんが、指で触って凹凸を感じない程度に面を出してから塗りたいですね。

#ガチ工作
Icon of admin
 オレメモです。

 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

■当面の課題

桜のライトアップの季節です。花粉症の季節でもあります。
自分は平気ですが、花粉症の部下は死にそうな顔をしています。

編集

■複合検索:

  • 投稿者名:
  • 投稿年月:
  • #タグ:
  • カテゴリ:
  • 出力順序:

■日付検索:

■カレンダー:

2022年2月
12345
6789101112
13141516171819
20212223242526
2728

■カテゴリ:

■最近の投稿:

最終更新日時:
2024年4月27日(土) 21時39分45秒