チャンネルデバイダーのVR制御(構想編4)

f:id:torusanada98:20180617080519j:plain

構想編4

番外編で2回分間があきましたが、Arduino UNOを使ったアッテネータ用リレー制御を具体的に構想します。

制御回路基本ブロック

今回のシステムを大きく下に示す3つのブロックに分けて構想を進めます。

1)キーブロック(Up/Dwon/Muteの3つのSWで構成)

2)リレー駆動ブロック(6 x stereo x 3 way = 36個のリレーを制御)

3)表示ブロック(ATTがどのポジションにあるかを表示します)

キーブロック

Up/Down/Mute用の3つのタクトSW相当を使います。3つのSWの状態を検出しソフトの状態を遷移させます。ここでソフトの基本処理を作り込みます。表はソフトの状態遷移をまとめたものです。

f:id:torusanada98:20180621124113p:plain

state0(アイドル状態)でSWオンを検出すると各SWに対応した奇数stateに遷移します。各奇数stateの中では、SWのチャタリングを考慮してSWオンを確定し、次のstate(偶数state)へ移行します。偶数stateの中でもSWのチャタリングを考慮してSWオフを確定して、state0(アイドル状態)へ戻ります。アイドルを除く各stateの中では、非同期のタイマを使ってSWオンまたはSWオフ状態を10ms以上継続して検出するとstepを1つ進めます。この処理を繰り返し、step5を越えた時点でSWの状態を確定し、次のstateへ進めます。ここまでの処理の中では、ローカルループ処理となるdelay(ms)関数は使用せずに、プログラムの基本処理をできる限り回すようにしています。

キーブロックコーディング

f:id:torusanada98:20180617080629j:plain

本編はまだ構想編ですが、プログラムが作成できるかあたりをつけるために、基本コードを書いてみます。3つのSWは下記のとおり接続します。

f:id:torusanada98:20180617080722p:plain

ポートの設定にはpinMode(pin, mode)関数を使用します。modeの部分にINPUTの代わりにINPUT_PULLUPを設定するとマイコン内部で対応ポートがPull Upされるため、回路は以下となります。

f:id:torusanada98:20180617080801p:plain

さっそくコーディングを始めます。コンソールがエディタとなっているのでそこに直接記述します。

f:id:torusanada98:20180617080841p:plain

C++のソースと同様に、(SWブロックでは使用しませんが)標準ライブラリwire.h(Serial通信用)を記述(Include)します。続いて変数、定数を宣言してセットアップ用のvoid setup()を記述します。void setup()中では、マイコンのI/O設定と電源投入時の表示(型式表示)を行う予定です。さらに続けてviod main()でプログラム処理本体を記述し、最後に必要な関数を記述します。Arduino用のソースコードはスケッチと呼びますが、上述のとおりC++のソースとほとんどかわりません。

f:id:torusanada98:20180617080925p:plain

コーディングが終わったら確認用に左上のコンパイルボタンを押します。画面下のバーエリアに進捗が表示され、コンパイルが終わった時点(エラー終了を含む)で下のステータスエリアにメッセージが表示されます。上図は、millis()関数の記述を間違えた時のメッセージです。このような場合は直接エラー箇所が示されるのでわかりやすいですが、たとえば'{'ぬけのような場合は、影響を受けた箇所がメッセージとして表示されるので間違った箇所の特定が少しやっかいです。確認コンパイルが正常終了したら、バイナリを基板に送ってデバッグをします。コンソール左上の確認用コンパイルボタン右隣の矢印ボタンを押すと、最初にコンパイル実行し、完了後に基板へバイナリが転送されプログラムの実行がスタートします。

f:id:torusanada98:20180617081009p:plain

メッセージエリアには、コンパイル終了時に使用されたリソース情報が表示されます。標準ライブラリ使用の注意事項に、Includeされたライブラリは、仮に処理で使用されなくてもバイナリに展開されメモリを消費するとありました。試しに今回使用しないI2C用の標準ライブラリを外してコンパイルして、リソースの使用量の差を確認してみました。結果は以下の通りです。

f:id:torusanada98:20180617081057p:plain

それなりにリソースを消費している事が確認できました。注意のとおり使用しないライブラリのIncludeすべきではないようです。早々にデバッグを始めます。デバッグにはシリアルモニタを起動します。現状のデバッグ環境には表示ブロックがないので、代わりにシリアルモニタ画面へ必要なメッセージや数値を表示させて動作状態を確認します。表示にはSerial.print()関数を使用します。

f:id:torusanada98:20180617082413p:plain

上図はキーブロックのデバッグ中のシリアルモニタ画面です。プログラムがスタートすると「start」(void setupで記述したもの)が表示され、Upボタンを押すと「+」が表示されアッテネータのステップ(ATTstate)に1加算されます。Downボタンを押すと「-」が表示されてアッテネータのステップ(ATTstate)が1減ります。Muteボタンを押すと「M」が表示されます。モニタ中の「@」マークは、アイドル状態に戻ったことを示しています。キーのチャタリング処理も問題なさそうです。キーの複数押しもアイドル状態へ戻ったときに最初にオン検出したSW処理に進むので問題なさそうです。当初、SWを確定させるためのstep数を10としていましたが、SW連打したときにキーの取り落としがあったため、現状の5に変更しました。簡単なソフトとは言え、C++言語によるソフト作成の経験がなかった為心配でしたが、第一関門はクリアできたとおもいます。次回は表示ブロックを構想します。

 

つづく(構想編5)