実際の制作に取り掛かる
前回OBD2アダプタでの通信に成功したので、早速HUDのディスプレイの制作に取り掛かった。用意したディスプレイはAdafruit製のI2C接続1.2インチLEDマトリクス基板。スイッチサイエンスで購入した。
この基板はI2C通信によりわずか4本の線で8個までのLEDマトリクスをコントロールできる。また、Arduino用のライブラリが用意されているので非常に簡単なコードで済んでしまう優れもの。
上記の写真はLED基板を並列に繋げてサンプルスケッチを実行した結果だが、I2Cアドレスが同一なので全く一緒の内容が表示されている。これでは駄目なので、Adafruitの解説ページを見ながらアドレスの変更を行った。
Adafruit 8×8 1.2インチマトリクスLED I2cアドレスの変更
基板裏面、上記画像ピンク枠の箇所をハンダでショートさせてI2Cアドレスを変更するようだ。A0,A1,A2をショートさせる組み合わせで0x70, 0x71, 0x72, 0x73, 0x74, 0x75, 0x76, 0x77と合計8つのアドレスを指定できる。
2つの基板のうち1つはデフォルト状態で0x70。もう1つはA0をショートさせて0x71に。
処理後。ハンダ付けは相変わらずヘタクソだ。
マトリクスLEDにビットマップフォントを表示
スピード表示のつもり
Adafruitのサンプルスケッチを改変して考えていたイメージを実際に表示させてみた。テキスト表示用のライブラリを使用すれば簡単に文字数字は表示できるが、ディスプレイ全体に表示されてしまうのでわざわざ3×5ピクセルのビットマップフォントを自作。1桁目は1か非表示。2,3桁目は0から9文字の数字を表示できる。
反転表示
ヘッドアップディスプレイなので、コンバイナに投影する事を考えて反転表示させてみた。処理的にはビットマップフォントの配列データをまんま反転させただけ。
HUDもどき
試しにアクリルへ反射させてみると正しく投影されていた。しかしこれで正解かどうかが分からない。最終的にはLED→レンズ→ミラー→コンバイナといった流れを考えているので、そもそも文字を反転させなくても良いのかもしれない。検証したい所だが、ブレッドボードに仮配置した状態では不便なので、LED基板を本番と同様の状態に配線処理をする事にした。
LED基板の配線処理
SF映画に出てくるクリーチャーっぽい
まず片方の基板のVCC、GND、SCL、SDAにそれぞれケーブルをハンダ付け。
そのケーブルの端をもう片方の基板に同じくハンダ付け。
それぞれのケーブル中間にホームセンターで買ってきた車用の配線分岐パーツを取り付けてケーブルを分岐させた。
問題なく点灯した
配線したケーブルは最終的な仕様が決まるまで取り敢えず買ってきたまま2mの長さにしているので乱雑としているが、問題なく表示する事できた。これで検証がしやすい。
車に接続してテスト
テスト時の配線図
マトリクスLEDへの表示が成功したので、次はOBD2アダプターから読み込んだ数値をディスプレイに反映させてみたい。現状のスケッチでは単純にビットマップフォントを表示させているだけなので車載テスト前に書き換えた。
OBD2アダプタのライブラリを使用すると
obd.read(PID_SPEED, value)
で数値(value)を読み込めるので、その数値を桁ごとに分解してビットマップフォントに変換させるコードを書いた。
int spd[2];
整数型の配列を宣言(3桁分)
spd[0] = (value % 10); value /= 10;
spd[1] = (value % 10); value /= 10;
spd[2] = (value % 10); value /= 10;
これで各桁の数値を判別できるので、後は条件分岐で各桁にビットマップフォントを表示させるコードを記述。
以前勉強したUnityでのスコア表示実装が非常に役にたった(作りかけゲーム)。
ちょっと暗いのはLEDの照度を最低に落としている為
では車でのテストを。上記の配線図の通りArduino、LED、OBD2アダプターを接続し、エンジン始動。すると狙い通り数値を取得し、LEDに表示させる事に成功した。以前の躓き様が嘘のようだ。※このテストではスピードの代わりに回転数の下2桁を表示させている。
次はLED基板、Arduinoのケースを3Dプリンタで作る予定。