上限オフセットとEEPROM初期値の設定

PWM

はじめに

以前までの記事では、
下限のオフセットのみの設定をしていました。
しかし、上限のオフセットを必要とする器具や現場も
存在しています。
フェーダをマックスまで上げると、チラつくこともあります。

また、PICへの書き込み直後、
フェーダを少し上げるだけで、明るさはMAXになっていました。
このEEPROMの初期値についても見直しました。

今回の回路図

これまで使い続けているものと全く同じ回路となります。
SW1を押せば、オフセットがかけられる設定です。

上限オフセットの計算からプログラム

上限値と下限値を1つのSWで設定するため、
フェーダ位置によって設定内容を判別することにしました。

例えば、フェーダを50%の位置でSWを押した場合、
上限値を設定したのか下限値を設定したのか判断できません。
そこで40%~60%の範囲には設定を割り当てず、
誤設定を防ぐようにしました。

今回の計算式は下記のものです。


if (data_vol <= 2) return 0;
    if(max <= min){
        return 0;
    }
value = min + ((unsigned int) (data_vol - 3) * (max - min)) / 252 ;

min : 下限オフセット値
max : 上限オフセット値
data_vol : DMX値

式の意味は次のとおりです。

DMX値が 0, 1, 2 の時

if文の条件で0になります。

DMX値が3の時

 min + (3 – 3) * (max – min) / 252
= min + 0
= min

となり、下限値が出力されます。

DMX値が255の時

min + (255 – 3) * (max – min) / 252
=min + 252 * (max – min) / 252
=min + (max – min)
=max

となり、設定した上限値が出力されます。

DMX値が4~254の時

DMX値が4~254の場合は、
フェーダ位置に応じて、minとmaxの間の値が出力されます。
これより、フェーダの可動範囲全体を使いながら、
実際の出力範囲だけをmin ~ maxに制限できます。

EEPROM初期値の設定

これまで、下限値のみを設定してPICにプログラムを書き込んだ直後、
EEPROM未設定の状態では
0xFFが読みだされるため、
下限オフセットが255として扱われていました。

そのため、フェーダ少し上げただけでも出力がほぼMAXとなり、
ON/OFFのような動作になっていました。
毎回最初に下限オフセットを設定してから
テストする必要があったため、
今回はEEPROMが未設定の場合の
初期値処理を追加しました。


    for (char i = 0; i < 4; i++) {
        stored_lower_offset[i] = EEPROM_Read(i);
        stored_upper_offset[i] = EEPROM_Read(i + 4);
        
        if(stored_lower_offset[i] == 0xFF){
            stored_lower_offset[i] = 0;
        }
        
        if(stored_upper_offset[i] <= stored_lower_offset[i]){
            stored_lower_offset[i] = 0;
            stored_upper_offset[i] = 255;
        }
    }

EEPROMは、
下限オフセット4chの次に上限オフセット4chが
順番に保存されています。

EEPROMに保存されている下限オフセットは、
変数”stored_lower_offset” へ代入し、
上限オフセットは
変数”stored_upper_offset”へ代入します。

1つ目の条件文で、
下限値が0xFFつまり、
255のマックス値になっていたら、
0にしています。

そして2つ目の条件文で、
上限値と下限値が同じ、
または、
上限値よりも下限値の方が設定されている場合は、
下限を0、上限を255に設定することで、
この不具合を解消しました。

実際の動き

実際に下限オフセットと上限オフセットを設定して動作を確認しました。

フェーダを0~40%の範囲でSWを押した場合は下限オフセット、
60~100%の範囲でSWを押した場合は上限オフセットとして保存します。

設定後もDMXフェーダ自体は0~100%の範囲で操作できますが、
実際のPWM出力は設定した下限値~上限値の範囲へリスケーリングされます。

また、PICの電源を入れ直した後もEEPROMから設定値を読み出すため、
設定した上下限値を維持できることを確認しました。

まとめ

今回は、これまで実装していた下限オフセットに加えて、
上限オフセットを設定できるようにしました。

DMX値3~255を設定した下限値~上限値へ比例変換することで、
フェーダの可動範囲をそのまま使いながら、
実際の出力範囲だけを制限できるようになりました。

また、1つのSWで上下限を設定するため、
フェーダ位置によって下限設定と上限設定を判別するようにしました。

EEPROMについても、
下限4ch・上限4chを別々のアドレスへ保存し、
未設定値0xFFや上下限が逆転した場合には、
下限0・上限255へ戻す処理を追加しました。

これで、電源投入直後でも上下限オフセットが
未設定なら通常の0~100%調光として動作し、
必要な場合だけ出力範囲を制限できるようになりました。

下限オフセットだけだったときよりも、
実際の照明器具に合わせた調整機能らしくなってきました。

次回予告

次回は、DMXアドレスの自由パッチに挑戦します。

現在はPWM出力1~4chに対して、
DMXアドレス1~4を固定で割り当てています。

これを、各PWM出力ごとに任意のDMXアドレスを設定できるようにし、
より実際の照明制御装置に近い構成へ発展させていきます。

設定したDMXアドレスをEEPROMへ保存し、
電源を入れ直しても保持できる仕組みまで実装する予定です。

ソースコード

今回使用したPIC16F1938のプログラムはGitHubに公開しています。

https://github.com/nichebebe/embedded-learning/blob/main/Upper_Lower_Offset.X/Upper_Lower_Offset.c

コメント

タイトルとURLをコピーしました