そんな大層な事をしようとはしていません。
ECUモニター(プロトタイピング中)
以前に製作したA/Tシフトインジケータと電源電圧計、それにターボメータなどを1つに取りまとめて分散している筐体を1つにまとめようと計画中です。
実はアクセルスロットルのモニターディスプレイを追加しようと考えたのですが、表示器類の置き場所に余裕が無いことから処理本体と表示部を分離して、表示をひとまとめにして機能を追加する方針へ変更しました。
以下のECUなどから得られる信号を元にして表示させる事を目的とします。
- A/T ソレノイド信号(デジタル/12V系)
- アクセサリ電源電圧(アナログ/12V系)
- インテークマニホールド圧(アナログ/5V系)
- アクセルスロットル開度(アナログ/5V系)←追加
- アクセルスロットルオフ(デジタル/5V系)←追加
- メーターパネルバックライト(デジタル/12V系)
このうち、インテークマニホールド圧とアクセルスロットル開度はそのままアナログ処理としてLM3914Nを使ってバーグラフ表示させる予定なので、それ以外を処理する部分を個別で製作していた処理部をArduinoで一括処理を行い、先に試したTM1630ディスプレイドライバを使って表示させます。
ダイナミック表示を専用ドライバに任せるとプログラム的にはすごくスッキリします。特にライト点灯時に暗くする様な輝度を変更させる処理はドライバの輝度設定を行うだけで単純に変化させられるので楽チンです。また表示部との接続が信号線3本だけで済むのも配線省力化できて使用するメリットが大きいですね。
今回はシフトポジション、アクセサリ電源電圧とアクセルスロットルオフ信号を表示させるところまでプロトシールド基板上に作ってプログラムの開発を行いました。計算が入るのはアクセサリ電源電圧の表示の部分だけで、それ以外は信号の状態によって特定の表示させるだけなのでプログラムの開発規模としては全然大した事ありませんね。
アクセサリ電源電圧は頻繁な更新を必要としていないので1秒ごとに測定して表示させていますが、この間隔の決定にMsTimer2ライブラリを用いて1秒ごとの割り込みで測定させています。元々ArduinoのファームウェアライブラリはPWM出力を制御するために内部でタイマー割り込みを使用していますが、このMsTimer2ライブラリを使用するとPWM出力を行うanalogWrite()とそこで用いられているタイマーおよびPWM出力ができるピンの関係で競合するピンが存在します。当初、この点に気づかずにanalogWrite(x,n)でn=255は点灯するのですが、それ以下にすると消灯はするもののPWM出力にならず、途中の明るさにLEDが表示されない理由を探すのにかなり遠回りしました。
結局、デジタルPWMのピン3、ピン11がMsTimer2と競合することがわかりましたので、ピンと接続先の割り当てを見直しして再配置することで解決しました。Timer1ではピン9、ピン10が競合する様なのでタイマー1を使用するときには注意が必要です。