12chアッテネータ2検討(製作編28)

製作編28

モーターボリューム制御ソフトにミュート処理と、パネル表示処理を追加します。

ミュート処理追加

現状のモーターボリュームAssy制御ソフトは下記のステートをswitch文で分岐処理しています。モーター制御中はローカルループを無くして、制御精度を極力上げるようにしています。

k_stat=0:キーオン検出

k_stat=1:キーオンチャタリング処理

k_stat=2:キーオフ検出

k_stat=3:キーオフチャタリング処理

k_stat=4:キー確定&減衰量更新

k_stat=5:モーター制御1

k_stat=6:モーター制御2

k_stat=0では、Up/Downキーの両方をモニタしていますが、k_stat=1以降はk_stat=0でオン検出したキーのみ確認を行います。モーター制御1とモーター制御2が2つありますが、モーター制御1でモーター停止後に一定時間おいてから同じ処理をもう1度行っています。この処理にミュート処理を追加します。k_stat=0~k_stat=3までは、処理するキーを1つ増やすだけです。k_stat=4で確定キーがミュートの場合、ミュートの状態(on/off)をトグルで遷移させます。合わせてミュート出力ポートD12を切り替えます。初めにdemo23でミュートキーを追加する為にキーアサインを変更しました。

このソースでは従来どおりの動作の確認のみです。次にdemo24でミュート処理を追加しました。

シリアルモニタ上の_Mute=0でミュートオンです。念のため、D12の信号も確認しました。

上の波形がモーター駆動波形で、下がD12ミュート制御信号です。Up/Downの処理の間にミュートボタンを押していますが、それに応じてミュート制御信号が切り替わっています。このdemo24でアッテネーション値変更後の処理の為にk_stat=100を追加しました。

表示処理追加

別のソースでOLEDパネル表示処理の確認を行ってきましたが、この処理を上で作成したdemo24に追加してdemo25を作成します。demo24はsetup()関数内でモーターボリュームの初期化(-34dB移動)を行っています。その初期化処理の前にデモ画面表示処理を、初期化処理後にデモ画面から通常画面切り替え処理を追加します。一部変数名が同じものがあったので、OLEDパネル処理側の変数名を変更しました。単純に2画面分の表示をさせるだけなので、容易に処理を追加できました。次は通常画面の減衰量の表示を動作と連動させます。減衰量の書き換え処理はk_stat=100内で行います。処理としては、減衰量の10進数をストリング変換して、1文字づつOLEDパネルコントローラのCGRAMへ書き込むだけです。実行画面は以下のとおりです。

表示の実画面は以下のとおりです。

ようやく製品らしい表示になってきました。

ミュート表示処理

ミュート時は減衰量表示を点滅させます。前回の記事でタイマー割り込みによる点滅処理はあきらめたので、ソフト処理で対応します。点滅処理はmain loopの先頭で行います。点滅の間隔は500msとし、点灯と消灯の表示切り替え時にタイムスタンプを保存し、実時間とタイムスタンプの差が500ms以上となった時点で点灯と消灯の状態を切り替えます。k_stat=5と6のモーター制御への影響が気になりましたが、問題はなさそうです。下記が上記処理を追加したdemo26の実行画面です。

次回はリモコン処理を追加します。

 

つづく(製作編29)