M5Stack 2 台(送信 COM73 → DMX ケーブル → 受信 COM74)の試験で起きた、受信の劣化と「不一致」。電源を疑うところから、原因を見つけて直すまで / 2026-10-18 / スタッフ限定・社外に出さないこと
資料: この頁の PDF 版 / 編集用 Word 版
| 見えていた症状 | 本当の原因 | 直し方 |
|---|---|---|
| 起動から約 4〜5 分たつと、受信が 25Hz → 9〜10Hz に落ち、画面が約 0.4 秒遅れ、「不一致」が毎秒数件に増えて戻らない | 試験用スクリプトが、COM73 から PC へ届く統計データ(1 秒に 1 回)を読んでいなかった。Windows 側の受信バッファが約 4.5 分で一杯になり、COM73 の書き込みが 1 回あたり約 0.1 秒ずつ待たされて、DMX 出力が止まった | スクリプトで COM73 の受信を読み捨てる(1 行)。420 秒動かして劣化しないことを確認 |
| 送信周波数が 26Hz のように揺れる | PC が 1 フレーム届くたびに 1 フレーム出す方式で、PC と USB の揺らぎがそのまま DMX の周期に出ていた | COM73 のファームを「自分のタイマーで 40ms ごとに送る」方式(25Hz 固定)に変更。オシロでも 25Hz で安定 |
| 十数秒に 1 回、512ch のうち一部のチャンネルの値が化ける | 未解決。周波数(20 / 25 / 40Hz)を変えても頻度は変わらない | 次回の撮影で、オシロを見て調べる |
電源(10V 給電、USB の抜き差し)が主な原因ではありませんでした。最初は「電源環境で不安定」と見立てましたが、同じ劣化が、電源を変えなくても毎回、起動の約 4.5 分後に起きていました。
| COM | 役割 | ファーム(環境名) |
|---|---|---|
| COM73 | 送信(DMX 出力)。CoreS3 + DMX-BASE。液晶に DMX の値(60ch ずつの表)を出す | m5cores3-enttec-pro-monitor-fixed(今回新設) |
| COM74 | 受信(DMX 入力)。CoreS3 + DMX-BASE。タイムテーブル再生機。液晶に ch1〜8 の棒と演出の進み(Cue)を出す。表示は 2026-10-18 に直した: 以前は「TX 39Hz / RX 25Hz」と出て数字が合わず紛らわしかったので、いまは「DMX OUTPUT (TX) only」「TX OUTPUT 25 Hz」だけの表示にした(送信周期を 25Hz にそろえる環境 m5s3lj2510-25hz) | m5s3lj2510 → 表示を直した版 m5s3lj2510-25hz |
PC の試験スクリプト tools\dmx_loop_test.py が、なめらかに変わる演出を作り(当初は 8 シーンを 3 秒ずつクロスフェードする 24 秒。撮り直した録画の時点では 255 秒・240 キューの長い演出)、COM74 へ USB で転送してタイマー再生させます。同じ演出を PC 側でも同じ時刻で計算して COM73 から DMX で送り、COM74 が受けた 512ch が、送ったフレームと完全に一致するかを数えます(一致・不一致)。
観察には、PicoScope 7(DMX の A / B 線の波形)と、USB カメラで撮った 2 台の液晶(カメラモニター。M5 の小さな液晶を AI が自分の目で見るための道具)を使いました。

| # | 窓 | 役割 | 使い方 |
|---|---|---|---|
| ①② | 拡大窓(カメラモニターの Zoom 窓) | カメラで写した M5 の液晶を拡大して見る。上が COM73、下が COM74 | 拡大する範囲は、カメラモニターの Zoom ボタンでドラッグ、または HTTP の /roi で指定。右クリックで補間の切替、Ctrl+S または Capture ROI で拡大範囲を PNG 保存 |
| ③ | PicoScope 7 | DMX の電圧波形を、時間を横軸にして見る。A(青)と B(赤)の 2 台を同時に | 左のパネルで、実行/停止・時間軸(いまは 1 目盛 500µs)・トリガー(200mV)・各チャンネルの電圧の範囲(±2V)を決める。上の細い帯が全体、下が拡大。ルーラーで 2 点の時間差と電圧を読み、下の欄に周波数・サイクル時間が自動で出る。波形の乱れやノイズを見る窓 |
| ④ | カメラモニター(2 台) | USB カメラの映像を見ながら、M5 の小さな液晶を拡大して見る道具。AI が HTTP で操作できる(1 台目 :8765、2 台目 :8775) | 上段: カメラ選択・Start/Stop・Capture(全体の静止画)・回転・Zoom(範囲指定)・Auto LCD(液晶を自動で探す)・AI Debug・戻す。右パネル: Auto Focus・Focus・Auto Exp・Exposure・Brightness。AI からは /brightness /focus /autofocus /roi /autolcd /capture /zoomcapture /burst など。露出(/exposure)は動かさない(カメラ 1 で映像が黒く止まることがある。黒が 3 秒続くと自動で開き直す) |
| ⑤ | DMX 連続試験 | PC の python スクリプトの窓。COM73 から送った DMX と、COM74 が受け取った DMX が、完全に一致するかを数える | 起動は PowerShell で python -I tools\dmx_loop_test.py COM73 COM74 30(送信の COM・受信の COM・周波数)。止めるのは Ctrl+C。上の行は、不一致の数・演出の経過と Cue・ループ回数・遅延(平均/最大)・PC の停止時間。下の表は、チャンネルごとの送信値と受信値で、一致していれば右端に OK |
| ⑥ | COM Port Scanner | つながっている COM ポートを、VID/PID で自動識別して一覧にする | 2 秒ごとに自動で再スキャン(USB の抜き差しがすぐ反映)。Refresh で手動。Port が COM 番号、Device Name が機種名(M5 の書き込み台帳の名前も出る)。M5 は USB の差し口で COM 番号が変わるので、試験の前に COM73 / COM74 がどの機械かをここで確かめる |
カメラモニターは、画面を1 秒間に数枚しか取れません。M5 の液晶は 25Hz(40ms ごと)で変わるので、カメラ越しの拡大窓では、数字や棒が飛んで見えます。M5 の表示が飛んでいるのではなく、カメラの取り込みが追いつかないためです。
| カメラ | 画面が変わる回数(実測 2026-10-18) | 間隔 |
|---|---|---|
| カメラ 0(Anker PowerConf C200・2560×1440) | 約 8.8 枚/秒 | 中央 115ms(最大 141ms) |
| カメラ 1(USB Camera・1944×2592) | 約 2.3 枚/秒 | 中央 452ms(最大 484ms) |
| M5 の液晶(比べる側) | 25 回/秒 | 40ms |

/burst(例 /burst?start=now&sec=10)は、ffmpeg でカメラの JPEG をそのまま受けて自前で展開するので、約 17〜21 枚/秒(2026-10-11 の実測。最大 120 秒)。(症状が出ていた当時の画面は、M5 の表示が旧版だったため、載せていません。直したあとの画面は 7 章です。)

| 時刻 | 出来事 |
|---|---|
| 07:14 | 依頼「2 台つなぎの M5Stack のプログラム確認」。COM7 と COM17 の 2 台が見えた |
| 07:16〜07:20 | 各機の MAC を読み、台帳で照合。USB のポート位置で COM 番号が変わっていたので、COM73 / COM74 に戻して、台帳の最終記録のファームを 2 台とも書き込んだ |
| 07:24 | COM74 が DMX 入力、COM73 が DMX 出力で通信試験。3 パターンとも送受信が一致(合格) |
| 07:27〜07:32 | 「常に動くデータで、止めるまで連続試験」。全 512ch を滑らかなサイン波にし、COM73 の液晶を DMX モニターの表示(グリッド)に書き換えた |
| 08:12 | 周波数が違う理由を確認。COM74 の TX 39Hz は COM74 自身の固定出力(25ms 周期)で別物。COM73 の 26Hz は PC が送る速さと一致 |
| 08:14 | 「なめらかに変化する演出再生に」。24 秒の演出を COM74 へ USB 転送してタイマー再生。最初の転送は USB の受信バッファ(4096B)に溢れて失敗したので、2000B ずつ 60ms 間隔に変更 |
| 08:17〜08:23 | COM74 の画面で RUNNING (FADE) / 経過時間 / Cue 5/9 が動くのを確認。このころから、約 8 秒に 1 回、一部のチャンネルが化けるフレームが記録され始めた(60 秒で 7〜8 件、約 0.4%) |
| 08:28 | 不一致が毎秒 5 件ほどに急増。画面は変化なし。10V 給電に切り替えた連絡が 08:34 にあり、時刻が近いので給電が原因と見立てた(後で誤りと判明) |
| 08:36 | 給電を止めても遅延は残ったまま。「ノイズが続いているのではなく、給電切替で一度止まり、溜まりが残った」と説明した(これも誤り) |
| 09:18〜09:21 | 「周波数を落としても安定させる方法を」。過去の記録(2026-05-16)の「PC 経由の送信は 19〜22Hz で揺れ、ESP32 自身のタイマー送信は 35Hz で完全に固定」を参考に、COM73 のファームを自分のタイマーで 40ms ごと(25Hz)に送る方式にして書き込み。液晶とオシロで 25Hz の安定を確認 |
| 09:29 | 不一致の中身を調べると、「値の化け」ではなく約 0.65 秒前の正しい値だった。試験スクリプトの「ずれ量の推定」(1 件 0.1 秒超の重い計算)が、受信の読み取りを遅らせる悪循環を起こしていたと判断して、計算を削除(部分的な原因) |
| 09:40〜09:50 | 遅延(ms)と PC 側の処理停止時間を表示するよう計測を追加。5 分と 7 分の連続測定を 2 回。遅延は最初は約 33ms で正常。起動の約 4.5 分後に突然 430ms に跳ね、受信が 10Hz に落ちて戻らない。PC 側の処理停止は最大 3〜6ms で、PC は止まっていなかった |
| 09:51 | 約 5 分後に COM73 と COM74 の液晶を撮影して比較。COM73 の送信 Hz も COM74 の受信 Hz も 10Hz に落ちていた(取りこぼし drop は増えていない)。COM74 に届く DMX 自体が 10Hz、つまり COM73 の出力が止まっていると判明 |
| 09:53 | 仮説: COM73 は 1 秒に 1 回 USB で統計を書くが、試験スクリプトは COM73 を「書き込み専用」で開いていて受信を読んでいない。バッファが満杯になると書き込みが待たされ、COM73 のループが止まる |
| 09:55 | スクリプトに COM73 の受信を読み捨てる 1 行を追加して 420 秒測定。劣化なし(受信 23〜26Hz、遅延約 30ms)=真因 |
| 09:56〜10:00 | 送信周波数を 20 / 25 / 40Hz に変えて 100 秒ずつ測定。不一致は 9 / 9 / 13 件。周波数は残る問題の原因ではない |
| 10:02〜10:15 | 撮影用の窓を、修正版で再起動(位置は変えず)。10:15 にもう一度起動し直し |
決め手は 2 つでした。
原因は、機器ではなく「測る道具」の側にありました。

drop)が増えないのは、COM74 に届く DMX 自体が 10Hz だったため。
| # | 直し方 | 確かめ方・結果 |
|---|---|---|
| 1 | 試験スクリプトで、COM73 の受信を読み捨てる(1 行) | 420 秒(7 分)動かして劣化なし。受信 23〜26Hz、遅延は約 30ms のまま |
| 2 | COM73 のファームを、PC からフレームが届くたびに出す方式から、「自分のタイマーで 40ms ごと(25Hz 固定)に送る」方式へ変更(TX_FIXED_PERIOD_MS) | 液晶とオシロの両方で 25Hz の安定を確認 |
| 3 | 送信周波数を 20 / 25 / 40Hz に変えて、100 秒ずつ測定 | 不一致は 9 / 9 / 13 件。周波数は「一部チャンネルの化け」の原因ではなかった |
撮り直した録画(12:00〜12:07)の最後の約 80 秒で読んだ数字です。試験は録画の頭(12:00)に動かし直していて、この部分は起動から約 5.5〜7 分後。以前は、起動から 4〜5 分で劣化していました。

| 項目 | 起動から約 5.5 分 | 約 6.2 分 | 約 6.8 分 |
|---|---|---|---|
| COM73 の液晶の周波数 | 25Hz | 25Hz | 25Hz |
| COM74 の画面(TX OUTPUT) | 25Hz | 25Hz | 25Hz |
| 遅延(平均 / 最大) | 32 / 80 ms | 32 / 40 ms | 33 / 80 ms |
| PC の処理停止(最大) | 6 ms | 5 ms | 6 ms |
| 演出の進み(Cue) | 73 / 240 | 109 / 240 | 143 / 240 |
| 不一致の累計 | 22 | 25 | 29 |

受信は落ちず、遅延も 30ms 前後のまま、演出も進み続けました。一方、不一致は約 74 秒で 7 件(約 10 秒に 1 回)、録画全体(約 400 秒)では 28 件(約 14 秒に 1 回)で、ゆっくり増えています(次章)。

m5cores3-enttec-pro-monitor-fixed)は未反映。変更したソース(enttec_pro_monitor_main.cpp・platformio.ini・tools\dmx_loop_test.py)は未コミット。tools\dmx_loop_test.py(演出を COM74 へ USB 転送してタイマー再生し、同じ演出を COM73 から DMX 送信。不一致は記録ファイルに書く)。enttec_pro_monitor_main.cpp(環境名 m5cores3-enttec-pro-monitor-fixed)。2026-10-18 / スタッフ限定。図と動画の画面は、照明を接続せず、試験台の機器だけで撮った画面です(図は、撮り直した録画 12:00〜12:07 と、動画用に作った図解から切り出したもの)。時刻と数字は、担当者とのやり取りの記録、ファイルの更新時刻、試験の表示から拾いました。