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

今年は開発案件を進めたい

or 管理画面へ

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

Icon of admin
 あ、回路間違えた!
 とりあえずジャンパーして発注済みの基板を使いますが、後で改修基板を作りましょう。

#ガチ工作 #器具の製作
Icon of admin
 3Dプリンタは壁面に横穴を開けると上下に少し潰れてしまいます。マイナス寸法ですからドリルで仕上げればいいのですが、ある程度見越した寸法にした方が良いようです。トライアンドエラーになるので様子を見ながら調整です。
 来週には部品が揃いそうですから、ファームウェアも書き始めています。表示は10/60進数ですが、16進数から変換するのではなく、23:59:59.9で折り返す10/60進数のインクリメントカウンタです。この部分は単純なので空き時間にサクッと書けました。
 DMXの受信は過去書いたファームウェアから拝借し、7zeg表示のコントロールは新規作成です。7zeg表示は桁送りをするサーチ式ですが、桁をONにする時間長で輝度調整が出来る様にします。日中の屋外もあれば暗い屋内もありますから調整出来た方がいいと思うのです。設定値の保存まではしませんけど。

#ガチ工作 #器具の製作

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

Icon of admin
 DMXtimer の基板を発注しました。
 ドル立てでは値上がりしていませんが、為替相場の影響で円にすると高くなった感じがします。
 194x50mmの基板が10枚で60USD、送料含み日本円で12,500円くらい。無加工の感光基板より安いのですから、高いと言ったらバチがあたります。

 基板の姿図です。
20260331152926-admin.jpg
202603311529261-admin.jpg

追記
 火曜日に発注したものが木曜日の今日すでに飛行機に乗ってるみたい。早いのはありがたいけど、そんなにヒマなの?って心配してしまうかも。

#ガチ工作 #器具の製作
Icon of admin
 時間が空いたので DMXtimer の回路図を書いてみました。短時間で描いたのですこし雑です。
20260331120407-admin.jpg
 基板を書いて中華基板に発注しましょう。
 ※ 基板の都合に合わせて回路を変更しました。

#器具の製作
Icon of admin
 「DMXタイマー」は私が作るモノに興味を示さない部下ですら「欲しい!」ときました。興味を示さないのは話や図だけでは物の想像が出来ないからですが、DMXタイマーは伝わり易かったようです。
 こりゃ作るしかありません。
 必要な技術は大したことありませんが、7ゼグを点灯させるのに電力をそこそこ喰うのと、時計としてどれくらいの精度を求めるかによって労力が違います。
 分を二桁、秒を二桁、1/10秒を一桁にしようと思います。時間値をどうするかは思案中ですが、24時間表示にしとけば後でタイムコードの表示にも使えるかな?
 フィクスチャープロファイルを自作出来ない調光卓もありますのでディマーとして扱えればいいかなと。動作はDMXアドレスを512ch固定、値000で停止クリア、値001以上でカウントとします。これでカウント開始を255と打ち込めばゆっくりF.Iでもそれほど遅れないかなと。

#器具の製作
Icon of admin
 お世話になっている他社さんからの依頼で現地照明の増員でした。
 そこで話をしていたところ、調光卓のGOボタンで動くストップウォッチが欲しいとのこと。ストリートダンスなどの音源演目の現場で調光卓とストップウォッチを両方叩くのは手が足りないことがあると。うん、よくわかります。
 条件を整理しますと、曲に対する最初のCUEでストップウォッチが動き出し、曲が終わったところで停止というか次の曲の開始までにリセットされていればいいと。まさにその通り!
 以前、音源に合わせたタイムコードを出力する研究をしていました。これとは違ったアプローチですが求める本筋は同じです。
 さてどうするか。MA系の卓ですと接点出力がありますのでこれを用いてストップウォッチを制御する方法もありますが、汎用性を考えるならDMXで動くストップウォッチがあればいいのでは?と閃く。
 例えば、512chが000なら停止、255ならカウント開始みたいにしておいてディマー感覚でCUEにデータを入れておけばいいってことです。ストップウォッチはカウント開始、停止、クリアの3つの動作が基本になりますのでそれぞれに値を割り振っておけばいい。F.Iの始まりでも動いて欲しいので001でカウント開始がいいのかな?卓とは無関係のストップウォッチを手操作で動かすよりは便利になればいいので厳密さはボチボチでいいと思う。
 なんにしても、「DMXタイマー」って名前で試案してみましょう。

#器具の製作
Icon of admin
 Art-Net / ArtDMX を受信して何かをするプログラムを書けそうな気になってきました。
 まずはコンソールを1台とし、ループバッファに Art-Net をひたすらスタックし、最新の ArtDMX を dump 表示させるものを製作しましょう。これが出来なきゃ何も出来ないってくらいシンプルなものです。
 ここから複数コンソール対応など、データの取り扱いを色々実験していきます。[コンソール]-[ユニバース]-[データ] の3階層のデータ管理を十分に煮詰めずに先に進んでも良いことはありません。以前の試作から進んでいなかったのはこの辺りに原因があります。このところ AIさんとやり取りしていたのはデータ管理を整理するためです。

#器具の製作 #[Art-Net]
Icon of admin
 AI/Geminiさんに聞いたところ、RaspberryPiでは4byte単位、4kB単位でキリ良く考えるとストレスが少ないのだそうな。1byte単位のデータでも4byteで扱った方が良いってことです。
 パディング対策して詰め々々がイイって話を振ってきたのもGeminiさんですが、知識のある年寄りに時間を開けて話を聞いた時のような困惑を感じたりしたり。。。

追記
 4byte、64byte、4096byte区切りでメモリを扱う様に構造体などを定義すると良いのだそうです。更に、構造体のメモリ上のアドレスをアトリビュートで64の倍数値にするのもお勧めとのこと。
 4byteはCPUのレジスタの長さ、64byteはキャッシュの転送単位、4096byteはメモリページの扱い単位です。
 気にしなくても動きますが、CPUやOSの挙動において無駄を省くことに繋がるらしいです。

#C言語
Icon of admin
 C言語の共用体(union)ですが、教科書やら動画を見ますと「あまり使い道が無い」的な解説が多いような気がします。
 されど、今回のArt-Net系の装置では便利です。Art-Net のポート番号 0x1936(6454) の受信値をとりあえず突っ込むだけで要素毎に取り出すことも出来るからです。例えば ArtDMX は530バイトのパケットですが、受信値を uint8_t[530] (または unsigned char[530]) の配列として保存するだけで ArtDMX の構造体としても扱えます。パディングに注意は必要ですが、便利に使えると思うのです。ID、OpCode、ProVer をまとめて評価するのに先頭12バイトを uint8_t[12] としておいて memcmp で判別することも出来ます。AertDMX と別種の Art-Net パケットもシームレスに扱えそうです。
 天才を超越した神たちが何故 union を作ったのかを考えるとワクワクします。

 とまぁ、最近C言語の理解が進んで一人笑いが止まらないアホの戯言でした。

 オレメモです。
 gccで構造体のパディングを回避する書き方。struct に続いて「__attribute__((__packed__))」を入れるそうな。gcc独特の書式らしいので、コンパイラに合わせた書式を使ってください。

typedef struct __attribute__((__packed__)) {
 uint8_t ID[8];
 uint8_t OpCode[2];
 uint8_t ProVerHi;
 uint8_t ProVerLow;
 uint8_t Sequence;
 uint8_t Physical;
 uint8_t SubUni;
 uint8_t Net;
 uint8_t LengthHi;
 uint8_t Length;
 uint8_t Data[512];
} ad_t;

ad_t ad_data;


 ArtDMXを保存する構造体はこんな感じに書けばよいのでしょう。たぶん。
 この型を sizeof で見て530バイトならヨシです。

 ついでに共用体の定義(案)です。

// Art-Netの受信値を収める構造体
typedef struct __attribute__((__packed__)) {
 uint8_t resv[530];
} an_t;

// ArtDMXを取り出す構造体
typedef struct __attribute__((__packed__)) {
 uint8_t ID[8];
 uint8_t OpCode[2];
 uint8_t ProVerHi;
 uint8_t ProVerLow;
 uint8_t Sequence;
 uint8_t Physical;
 uint8_t SubUni;
 uint8_t Net;
 uint8_t LengthHi;
 uint8_t Length;
 uint8_t Data[512];
} ad_t;

// Art-Netの受信値を保存する共用体ループバッファ
union {
 an_t an_resv;
 ad_t ad_data;
} an_stack[8192];


 こういうことでいいのかな?
 共用体の書き方はまだよくわかってないのですけど。

 共用体の配列を作って Art-Net のポートで受信したパケットを延々と保存します。8191番まで記録したら0に折り返すループバッファです。
 8192個あれば44fps、8センダー、各16ユニバースで最短でも1.45秒分の保存が出来るハズです。十進数で8192なのは2進数(16進数)でキリの良い数値のため折り返し評価が少ない処理で出来るからです。十進数8192は16進数0x2000でキリがよく処理しやすいのです。このあたりはアセンブリ言語だけでPICマイコンと会話をしてきた者にとって自然な着想です。10進数は人が日常的に使い慣れているだけで特筆するほど合理的な数体系ではありませんし、今どきのコンピュータ(論理回路)に合わせた方が便利です。

 ヘッダーチェックは当該の配列要素(例えば an_stack[1024] )を示すポインタからmemcmpで12バイトをチェックすれば済みますので共用体には定義しません。
 ArtDMX以外のパケットにも使えるチェック方法です。

#C言語
Icon of admin
 先日の現場はヒマな時間が長かったのでC言語の教科書を読みまくってみましたがかなり整理出来ました。
 昨今の教科書はポインタの説明が丁寧です。ハードウェアとしてのメモリの動作がアタマに入っていないと分かり難いことですが、私はPICのアセンブラで普通に扱ってきたことなので改めてではありますが素直に理解出来ました。わかってしまえばむしろ便利だなと。変数の読み書き方法が何種類もあることになるので混乱すると思いますが、どれもメモリへのアクセス手段だと捉え直せばいいだけでした。このあたりが整理できるとmmapも自然に理解出来ます。
 ヘッダーファイルはコピペでテキトウに書いていましたが、意味と書き方が整理できました。後はmakefileが整理出来れば良さそうです。

#C言語

■思ってみた

春が近づいてきた感じがします。

編集

■複合検索:

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

■日付検索:

■カレンダー:

2026年4月
1234
567891011
12131415161718
19202122232425
2627282930

■カテゴリ:

■最近の投稿:

最終更新日時:
2026年4月5日(日) 09時59分54秒