← LightJockey 関連資料目録

開発メモ(限定スタッフ向け) / 測定日 2026-10-06 / 担当: 組込み(Ws)

DMX の波形を、オシロで実測する
USB-DMX-PRO 互換機の BREAK・MAB・出力周波数 — 結果と、測り方の手順

USB-DMX-PRO 互換機(ESP32-S3)が出す DMX512 の信号が、規格どおりの波形になっているかを PicoScope で測りました。 ソフトが「設定した」と返す値(読み戻し)ではなく、実際の波形で確かめるのが目的です。この頁は、結果・波形の読み方・誰でも再現できる測定手順をまとめた記録です。

資料: この頁の PDF 版(10 ページ・1.2MB) / 関連: DmxWaveObserver 使い方と AI 利用(この測り方をアプリにしたもの・スタッフ限定)

1. 結論(先に)

項目規格(DMX512-A)実測(既定設定)判定
BREAK(フレーム頭の Low)92µs 以上99.8µs(設定 100µs)合格
MAB(BREAK のあとの High)12µs 以上15.4µs(設定 16µs)合格
ビット幅(通信速度)4µs ±1%(250kbps)3.98µs(約 251kbps)合格
出力周波数(10〜40Hz、最速)設定どおり10.0 / 20.0 / 30.3 / 40.0Hz合格
40Hz 時のフレーム間の隙間(IDLE)次のフレームと重ならない2.3ms合格
設定値と実測値の差—±1µs 以内オシロの分解能(1.28µs)内
見つかった問題(解決済み): ファーム 2.5 までは BREAK が約 88µs(実測 89.6µs)で、規格の下限 92µs にわずかに足りませんでした。 BREAK 直後の MAB も、設定値より約 25µs 長く出ていました(設定 12µs → 実測 37µs)。 ファーム 2.6 で BREAK と MAB を自前で作る方式に改め、既定を BREAK 100µs / MAB 16µs にして解消しました。

2. DMX の信号と、波形の読み方

DMX512 の 1 フレームは「BREAK → MAB → スロット 0(スタートコード)→ スロット 1〜512(各チャンネルの値)」の順です。 信号は普段 High(アイドル)。BREAK で長く Low に落として「ここから新しいフレーム」と知らせ、MAB で High に戻り、続いて 1 スロットずつ送ります。 1 スロット = スタートビット(Low 1)+ データ 8 ビット + ストップビット(High 2)= 11 ビット = 44µs(1 ビット = 4µs、250kbps)。

フレーム先頭の拡大図
図 1 フレーム先頭の拡大。赤の帯 = BREAK(約 100µs)、緑の帯 = MAB(約 16µs)。そのあとの細かい山谷がスロット。最初のスロット(スタートコード 0x00)は Low が約 36µs、High(ストップビット)が約 8µs。BREAK 中のギザギザは測定時のノイズ。

3. 結果 1 — BREAK と MAB を変えても、設定どおりに出る

ファーム 2.6 では、BREAK・MAB・スロット数・スタートコードをホストから変えられます(検査・調整用。再起動で既定に戻る)。 設定値を変えて実波形を測り、設定どおりに出ているかを確認しました(COM61、PicoScope 2205A、1.28µs 刻み)。

設定 BREAK µs設定 MAB µs実測 BREAK µs実測 MAB µs規格判定
10016(既定)99.815.4合格
1004099.839.7合格
10010099.899.8合格
150100149.899.8合格
300200299.5199.7合格
50050500.548.6合格
20012201.011.5不合格(MAB が 12µs を 0.5µs 下回る。設定が下限ぎりぎりのため。分解能 ±1.3µs 内)
921292.211.5不合格(同上)
881287.0〜88.311.5不合格(BREAK 92µs 未満。規格外を意図した試験)
100099.83.8不合格(MAB をほぼ無くした極端な試験)

不合格の行は、規格を外した波形を意図して作り、きちんと「不合格」と判定できることの確認です(検査装置として、悪い波形を見逃さないための試験)。

BREAKとMABを変えた波形
図 2 BREAK と MAB を変えた 6 通りの実波形。赤 = BREAK、緑 = MAB。各段の題に設定値と実測値を書いてあります。
BREAK長と規格
図 3 BREAK を 88 / 92 / 100µs にした重ね描き。点線 = 規格の下限 92µs。ファーム 2.5 までの約 88µs は点線に届かず規格外。2.6 の既定 100µs は余裕を持って合格。

4. 結果 2 — 出力周波数(rate)と、フレームの隙間

出力周波数(rate)を変えたときの実際のフレーム周期を、BREAK の間隔から測りました。

rate 設定期待周期実測周期実測周波数IDLE(隙間)判定
10100ms99.99ms10.0Hz77.3ms合格
2050ms50.0ms20.0Hz27.3ms合格
3033.3ms33.0ms30.3Hz10.3ms合格(周期は整数ミリ秒に丸め)
4025ms25.0ms40.0Hz2.3ms合格
0(最速)25ms25.0ms40.0Hz2.3ms合格(上限 40Hz)

1 フレームは約 22.7ms(BREAK 100 + MAB 16 + 513 スロット × 44µs)なので、40Hz(周期 25ms)でも約 2.3ms の隙間が残り、次のフレームと重なりません。

rate別のフレーム周期
図 4 rate 別の約 164ms 分の波形。波形が密な塊 = 1 フレーム、塊と塊の隙間 = IDLE。rate を上げると塊の間隔が詰まります。

5. PicoScope 7 の画面の見方

PicoScope 7 の実画面
図 5 PicoScope 7 の実画面(200µs/div)。青 = ch A、赤 = ch B(DMX の +線 と −線。逆の動きになる)。

6. 測り方の手順(再現用)

6-1. 準備

  1. オシロ: PicoScope 2204A / 2205A(旧ドライバ ps2000 系)。USB で PC に接続。
  2. プローブ: 測る機器の DMX OUT の信号線(pin 2 = DMX−、pin 3 = DMX+)と GND(pin 1)に接続。まず片側(DMX+)だけで始めてよい。 レンジは ±5V(RS-485 は数 V)から。
  3. 測る機器の DMX OUT には他の DMX 機器をつながない(他の信号が混ざり、周期が正しく測れません)。終端 120Ω は付けた状態で測る。
  4. PicoScope 7(画面ソフト)と、同じ COM ポートを使うソフト(照明制御ソフト・モニター類)は閉じる。開いたままだと、オシロや COM ポートを開けず失敗します。
安全: プローブをつなぐのは低圧の DMX 信号(DC)だけ。AC 電源側には絶対に接続しないこと(2205A は非絶縁です)。

6-2. 手で測る(PicoScope 7 の画面)

  1. 時間軸を 200µs/div、トリガーを ch A の立下り(しきい値 約 0.2V)に設定。
  2. 図 5 のような波形が出たら、ルーラーを BREAK の落ち込みの始まりと終わりに合わせて長さを読む。
  3. MAB は、BREAK が終わって High に戻ってから、最初のスロットのスタートビット(Low)が始まるまで。
  4. 波形を残すときは「保存」から CSV で書き出す。

6-3. 自動で測る(コマンド)

スコープの取得ツール(PicoScopeBridge)と、解析スクリプトを使います。結果は規格の合否つきで出ます。

# 1. 取得 (BREAK/MAB/ビット幅向け: 1µs 刻み・約 20ms)
PicoScopeBridge.exe capture --ch A --range 5V --coupling DC --samples 16000 --interval-us 1
#   → cap_<日時>.csv (t_us, mV)

# 2. 解析 (BREAK / MAB / ビット幅 / スロット数 / 規格の合否 を JSON で出力)
python scripts/analyze_dmx.py --latest

# 3. BREAK/MAB を順に変えて、設定値と実測値を比較 (対象の COM を指定)
python scripts/wave_check.py COM61

# 4. 配布用のデータ一式と図を作る
python scripts/collect_waveform_set.py COM61 <出力フォルダ>
python scripts/make_figures.py <データフォルダ> <図フォルダ>

6-4. 連続で測る(スコープを開きっぱなしにする常駐ツール)

取得ツールは、実行のたびにスコープを開閉するため、「PicoScope」の起動画面が毎回出て、スコープ内部のリレーも毎回 ON/OFF します(カチッと音がする・接点の寿命にも良くない)。 連続で測るときは、1 回だけ開いて開きっぱなしにする常駐ツールを使います(チャンネル設定も最初の 1 回だけ)。

python scripts/pico_session.py serve          # 常駐 (起動時の 1 回だけ画面とリレー動作)
curl "http://127.0.0.1:8766/capture?interval_us=1&samples=16000"   # 1 回取得して解析
curl "http://127.0.0.1:8766/watch?sec=60&interval_us=1"            # 60 秒の連続計測 (統計と規格外の回数)
curl "http://127.0.0.1:8766/period?interval_us=10&windows=6"       # フレーム周期 / IDLE
curl "http://127.0.0.1:8766/quit"                                   # 閉じる

実測(20 秒の連続): 451 窓を開閉なしで取得。BREAK 99.84〜101.12µs、MAB 15.36〜16.64µs、規格外 0 回、周期 32.99ms(30.3Hz)。 常駐中は PicoScope 7 の画面と取得ツールを使えません(スコープを占有)。画面で見たいときは、常駐を閉じてから使います。

6-5. 判定の目安

項目合格の目安
BREAK92µs 以上(多くの機器は 100〜200µs)
MAB12µs 以上(上限は 1 秒未満)
ビット幅4µs ±1%(3.96〜4.04µs)
スロットスタートビット 1 + データ 8(LSB 先頭)+ ストップビット 2 = 44µs
周期設定した周波数どおり(1 フレーム 約 22.7ms より短くならない)
プローブ位置の確認ビット幅が 4µs 付近、周波数が理論値と一致していれば、正しい場所を測れている

7. できないこと・注意(正直に)

8. 用語

用語意味
BREAKフレームの頭で、長く Low にする区間。「ここから新しいフレーム」の合図。
MABMark After Break。BREAK のあと、High に戻っている短い区間。
スロット1 バイト分(スタートビット + 8 ビット + ストップビット 2)。0 番がスタートコード、1〜512 が各チャンネルの値。
IDLE1 フレームが終わってから、次の BREAK までの High の区間(隙間)。
rateUSB-DMX-PRO の「出力周波数」設定(1〜40Hz、0 = 最速)。
差動DMX の +線 と −線の電圧差。RS-485 は差動で信号を伝える。

この頁は開発の記録です。数値は 2026-10-06 の実測(StampS3・COM61、ファーム 2.6、PicoScope 2205A)。