構想編5
Arduino UNOを使ったアッテネータ用リレー制御システムの表示ブロックを構想します。
表示ブロック
Arduinoに対応した表示モジュールは豊富にあります。簡単なものではLEDを敷き詰めたものから、7セグLEDやグラフィックに対応したLCDパネル等など、どれも比較的安価に購入できます。今回は、I2Cインターフェースに対応した4桁の7セグLEDモジュールを選択しました。
購入したのは、sparkfunのSerial7SegmentDisplayです。使い方はいたって簡単で、電源5Vの他にI2C用の配線2本で機能を利用できます。
このモジュールは、I2C以外にもSerial UART、SPIインターフェースにも対応しているので状況に応じて選択できます。
I2Cバス
せっかくなのでバス仕様について調べてみました。1980年代初めにフィリップス社が周辺ICとの低速通信用に作った2線式のシリアル通信仕様で1992年に標準化が行われてVer1.0がリリースされました。1個のマスターと複数のスレーブがバス上に接続され、そのバス上で通信が行われます。7bitのアドレス空間のうち16の予約アドレスを除く112のノードが同一バス上に接続可能です。2本の通信線はSDA(シリアルデータ)とSCL(シリアルクロック)でArduino UNOは専用のポートをもっています。(汎用ポートとしても使用可)
前回の記事で紹介したとおり、Arduinoはwire.hをIncludeするだけでI2C関連の関数を使用する事ができます。
表示ブロックの実装
先に説明したとおり、7セグモジュールとUNOの接続は+5V/GND/SDA/SCLの4本です。今回は、デバッグ用に7セグモジュールをシールド仕様のユニバーサル基板に実装し、それをUNO本体基板の上に装着しました。
デバッグ環境はこんな感じになりました。
表示処理の実装
標準ライブラリwire.hで提供され、今回使用する関数を簡単に紹介します。
これらの関数をつかって、7セグモジュールがサポートする下記のコマンドを発行して必要な機能を実装していきます。
7セグモジュールの紹介サイトに便利な関数サンプルが提供されていましたのでそれを参考に必要な関数を作成しました。準備した関数(一部サンプル関数そのまま)をまとめます。
スタート表示
まずは使い方に慣れるために、電源オン後のスタート表示を実装してみます。処理はdemo()関数にまとめて、void setup()関数内でコールする事にします。内容は以下とします。
①無表示の状態から「ATT1」表示が1秒かけて浮かびあがる
②1秒間表示をホールド
③「ATT1」表示を1桁づつ上位の桁にシフトさせて4桁シフトさせて終了
さっそく実装して動作させてみました。写真ではリアルな印象は伝えられませんが、まあまあな感じです。
所詮7セグ表示は表現がプアで、特に「T」が「ヒ」に見えてしまう点がご愛敬です。
ATT表示
リレーの状態制御用にATTstateレジスタを設定し、この値で表示も制御します。電源オンでATTstate=0でスタートし、UpでATTstat=++ATTstate,DownでATTstate=--ATTstateとします。ATTstateが範囲外(0未満または9以上)になる場合はキーを無効とします。表示データは、ATTdisp[]配列(0~8)に事前に設定しておきます。
実装してデバッグします。C++は身になっていないのでつまらないミスを連発し、何回確認コンパイルを行ったことか。デバッグ中はスタート表示は時間がかかるだけなので処理を無効としておきます。なんとかできあがったのがこんな感じになりました。
これでATT表示の処理の実装は完了しました。残るはミュート関連の表示です。次回は、残ったミュート関連の表示を構想します。
つづく(構想編6)