PIC16F690・Head Up Display (HUD) スピードメーター(改)の製作 (2010/08/17/〜2010/09/17)

(Last update:2011/03/10)


まずはブレッドボードで動作確認 完成品
制御基板表
前作の制御基板を流用したため
不要な部品が残っていたり
ジャンパが飛びまくっていたり ^^;
制御基板裏
表示部基板表
表示部基板は新たに作り直した。
左下のスイッチはテストモード設定用
表示部基板裏
フロントガラスにうまく映り込ませるには
LED の照射軸を少しづつズラすのが有効。
後から角度調整できるよう LED の向きを
揃えて実装するのが吉。
HUD なので数字は上下反転する。
表示色は 5色
走行写真1:
フロントガラスへ直投影で昼間でも十分読める ^^v
走行写真2:
映り込む位置はこのあたり。
(数字が欠けているのは桁内も
ダイナミック点灯しているため)
参考配線レイアウト
(レイアウトには PaaS を使用)

基板表面
(7セグ LED 回りの配線は省略)
参考配線レイアウト
基板裏面
(7セグ LED 回りの配線は省略)
回路図
動作の様子

日産・エクストレイルにお乗りの
matunomidori さんから製作レポートを頂きました!

↓↓↓
matunomidori 版完成品。

7セグLED表示のみで製作してワンボードに収めた。
外形 125mm× 70mm× 18mm

テイシン TB-58 の高さを 18mmに切断し、
黒つや消し加工(サンドペパーをかけて塗装)

セグメントの映りこみ対策で青のセロファンをかぶせて
実験中(これでも輝度が落ち昼間でもつらい)
部品の実装状態。

ケースを含め、あり合わせの部品で製作してみた
実装の様子その2。
7セグ LED も黒塗装して
無駄な映り込みを抑えた
ケースの加工と基板

matunomidori さんからのコメント

 センターメータの車両は当時斬新であった
ようですが、見づらい点があり HUD に関心を
持っていたところ GRANADA さんが製作記事を
掲載されているのを見つけ早速製作することに
しました。

 ハードはあり合わせの部品を利用しながら製作
したため、公開されている回路とは一部異なる
部分もあります。

 さて、いよいよ不得手のソフトの出番です。
まず最初に PIC16F690 の書き込みでつまづき
ました。秋月の PIC プログラマーで書き込む場合は
アダプタが必要とのこと。ただ具体的にどのような
アダプタが必要であるかとの記述はみつからなかった
ので、とりあえず書き込み等の信号線を取り出し
ソケットに展開して、やっと HEX ファイルの書き
込みに成功!

 早速車に搭載したところ、スピードの表示が車の
メータの半分しか表示されず、エクストレイルが
2 パルス車であることが発覚(ディーラーに問い
合わせればすぐわかるはずだが)。

 そこでソースファイル(asm) を書き換える必要が
でてきましたが、asm から HEX ファイルの作成が
出来ずに長期間休止状態が続きました。

 色々質問コーナーで問い合わせてみましたが
理解できる回答が無く、ついに GRANADA さんに
問い合わせたところ、すぐに返事をいただきいろいろ
アドバイスをしてもらってやっと完成にいたりました。

 車に搭載した感じは、速度表示の応答も実に
スムーズであり、車のスピードメータとの誤差も
気にならないことなど完成度の高い作品でした。

 GRANADA さんも記述されていますが逆光時は
見にくいとのことですのが、反射角度の関係か
点灯していないセグメントの映りこみが気になるので
現在青フィルタの実験を継続中です。
擬似車速パルス入力での動作確認
擬似車速パルスによる 80km/hの表示。
実際の表示は反転するので変化のない80表示とした
最終実装の様子。
車種はセンターメータが採用された初期
エクストレイル。(左側にメータ類が見える)

仕様:

 前作での問題点、即ち

 ・2色 7 セグ LED が輝度不足で昼間は読み取れない(致命的)
 ・表示されないスピード値がある(車速カウントの精度不足)

 の解消を目指す。具体的には、

 ・単色ながら超高輝度の 7 セグ LED を投入
 ・車速パルスのカウントをゲートタイム方式からレシプロカル方式へ変更

 で解決する。

 なお前作同様、バー LED 表示は回転計ではなく速度表示とする。オートマなフィット君で平地を走る限り、回転数やシフトポジションを意識する必要はまず無いからだ(それよりも速度の方が関心事。管理人が住むつくば近辺は道幅が広く、気付くと思わぬ速度が出ていることが多々ある)。

 また前作同様、バー LED 表示は別の PIC に行わせる。よって 7 セグ表示だけあればいい、という場合はバー LED 表示周りの部品を省略でき、かなり部品点数が減らせる。


追加機能:

 7 セグ LED を単色にしたことでポートが 3 つも空いてしまった。これを遊ばせておくのはもったいないので、

 ・スイッチを押すことで、速度表示と運転時間(分)表示とを切り替え可能
 ・10 分以上連続して速度 0Km/h にならない限りは「運転中」とみなし、この「運転中」状態が 3時間以上続くと警告 LED を点灯(休憩警告機能)
 ・全 LED を点灯するテストモードを装備(映り込み具合の調整・確認を補助)

 といった機能を追加した。


ハードウエア:

 回路設計の詳細に関しては前作参照。

 LED の型番は回路図に記入しておいた。入手先は、

 ・青 7 セグ LED と紫(ピンク)LED は大阪のシリコンハウス
 ・その他の 5mm LED は秋月

 青 7 セグ LED A-1001UB は 1 セグメントあたり 2 個の LED が入っており Vf = 7.4V。そのため PIC 用の 5V 電源系とは別の電源系が必要となる。もっとも今回のように 12V を一次電源にする場合は三端子レギュレーターの出力電圧を高めに設定することで発熱を低減しつつ輝度を確保できるメリットがあり、むしろ好都合。A-1001UB に流せる最大電流は周囲温度 25℃・1KHz パルス時 60mA だが、必要以上に流すと劣化(輝度低下)が加速するし、ダッシュボードのような厳しい熱環境に設置することを考慮して 50mA ほどに留めておく。

 ちなみに他の 7 セグ LED を使用する場合は実際に輝度を確認しながらディマー回路の抵抗値を再検討する必要があるが、晴天白昼時と夜間時の輝度確認が必要で案外面倒。輝度の観点からも A-1001UB をお勧めするが、どうしても別の 7セグ LED を使いたいなら後日作などもご参考にどうぞ。

 それから車速パルス信号に関しては H=5V を想定している。したがって H=12V 車両に装着する場合は C1815 のベースと GND 間に 24KΩ の抵抗を必ず追加すること。

 なお回路図に記載した回路は前作の制御基板を流用した関係上無駄な部分がある。例えば 7 セグ LED 桁制御用のトランジスタアレイは NPN のデジタルトランジスタ (DTC123 とか) で良いし、7 セグ LED へ流し込む電流が 50mA 程度になったので、2SA950 (Ic=-800mA) は 2SA1015 (IC=-150mA) やデジタルトランジスタ RN2205 (Ic=-100mA) で代用可能。また LM317 は 78M10 や 7810 で代用可。新規に製作される場合は適宜読み替えていただきたい。


ソフトウエア:

【車速計算】

 前作のゲートタイム方式では分解能に問題があったため、パルス周期から周波数を計算するレシプロカル方式に改める。

 具体的な実装方法としては、

 ・TMR1 + コンペア割込みから TMR1 + キャプチャ割込みへ変更
 ・キャプチャ割込みがかかったら CCPR1H/L レジスタの値を保存し、TMR1 をソフトウエアでクリア(次回のキャプチャに備える)

 とする。厳密に言うと TMR1 を割込み処理中で自前でクリアしているため正確な周期は得られないが、今回のようにたかだか数百 Hz 程度の周波数測定ならほとんど誤差範囲に収まるので問題は無い。

 で、速度は PIC 8MHz 動作時、キャプチャ割込み時点での TMR1 カウンタ値から、

 速度 (Km/h) = 250000 / TMR1 カウンタ値 x 1.4128

 で求まる。(ちなみに 4パルス車以外の場合は 1.4128 が変わる。8パルス車で 0.7064、16パルス車で 0.3532 となる。もしくは 250000 をそれぞれ 1/2, 1/4 にしてもよい。逆に 2パルス車なら倍にする)

 実際の計算は、アセンブラで実装する都合上、24bit 四則演算ライブラリを使って、

 速度 = INT (((( 2500000 / TMR1 カウンタ値 ) x 1412 ) + 2000 ) / 10000 )

 として小数点演算を整数演算に置き換えて計算する。なお本来なら 250000 / TMR1カウンタ値とする部分を 2500000 / TMR1カウンタ値にしているのは、ここの小数点 1位をちゃんと拾わないと前作同様「表示されない値」が出てしまうため。なお +2000 は最終的な速度値の小数点 1位を 7捨8入するためのオマジナイであって必須ではない。

 さて、レシプロカル方式は原理上パルス周期が長い(=低速時)と測定に時間がかかる(例えば速度 0 なら待ち時間 ∞ )。よってある程度の時間待ってもパルスが来なかったら「諦める」必要がある。TMR1 は 8MHz 動作時、プリスケーラー 8 で最大 262ms まで設定可能なので、この間にパルスが来ない、即ち速度が 1000 / 262 x 1.4128 ≒ 5.3Km/h 以下の場合は「諦めて」速度を 0 にする。

 具体的には、

 ・キャプチャ割り込みとは別に TMR1 オーバーフロー割込みも有効にしておき、TMR1 オーバーフローが発生した場合は「諦めて」パルスカウント数を 0 にする
 ・TMR1 オーバーフローで「諦めた」場合、その直後 1発目のパルスでキャプチャされるカウンタ値からは正確な周期が得られないので無視する

 とする。

【7 セグ LED 表示】

 今回も完全ダイナミック点灯(全セグメント単位でダイナミック点灯。走行写真 2 を見ると良く判る。)とするが、スタティック点灯より輝度が落ちやすいので表示周期は十分に調整し、比較的に長めに点灯して輝度を確保している。もちろん、通常のダイナミック点灯(桁内はスタティック点灯)にすると輝度は改善できるが、ディマー回路との兼ね合いで部品点数が増える上に消費電流も増える(=三端子レギュレーターの発熱 up )のでかなりマジメに再設計しないといけない( → 参考)。

【バー LED 表示】

 前作同様、メイン側から渡された BCD データに応じて LED をダイナミック点灯する。LED の輝度は十分だが照射角度が狭いため、下記のようにちゃんと光軸を合わせておくことを推奨。光軸さえピタリと合わせれば、真夏の逆光下だろうが偏光サングラス越しだろうが、視認性はまったく問題ない。


実装:

 前作で、LED をフロントガラスへうまく映り込ませるポイントは、LED の光軸をフロントガラスの曲面に合わせることと学んだ(写真参照。LED の実装角度が異なっているのがお判りだろうか)。そこで今回は LED の照射角を微調整できるよう LED のピンの向きを揃えて実装した。テストモードで LED を全点灯してやれば、照射角を容易に調整することができるだろう。

 次に設置場所。他の製作例や市販品ではフロントガラスになるべく密着させるように設置(=輝度面で有利)しているものが多いが、管理人は走行写真 2 の如くフロントガラスから少し離れた場所に設置し、より目線に近い高さで反射するようにした。もっとも設置位置はダッシュボードとフロントガラスの傾斜角で必然的に限定されてしまうので、車種に依存するだろう。

 肝心の視認性は、フィットでは写真の位置で真夏の昼間でもちゃんと 7セグ LED 表示が読めたが、さすがに真夏の逆光時には視認性が落ちた。もちろんフロントガラスにフィルムを貼る(これは車検が通らないので却下)とか、別途自前のターゲットスクリーンを用意する(市販例)等で解決はできるが、あくまで「素のフロントガラス」に映してナンボ、と考える管理人としてはこれで良しとする。

 なお偏光サングラス越しでは 7 セグの視認性は落ちるものの、一応数字は読める(さすがは 2LED/セグメント)。一方、バー表示は真夏の逆光だろうが、偏光サングラス越しだろうが照射軸を合わせれておけばまったく問題なし。超高輝度 LED 様様だ ^^;

 あと周波数 → 速度への変換係数は当初 1.4128 で計算していたが、実走テストで車の速度計と比較したところ、GE 系フィットでは 1.5 ぐらいが最適となった。理由はおそらく保安基準で 1割程度まで「速度水増し表示」が認められているためで(参考サイト)、安全運転にはむしろ好都合なのでメーターと一致するよう 1.5 にしておいた。この変換係数は製造年や車種によって異なる場合もあるので、その場合はソース中の定数を 1ヶ所書き換える必要がある。


苦心点:

 (1) 24bit 四則演算ライブラリの割り算ルーチンが何故か無限ループに入ってしまい大いに悩んだ。結局、原因は割る数が 0 だったため。メインルーチン側で事前に値をチェックすることで解決した。CPU 自体が割り算機能を持たない(= 0 除算エラーがハードウエアで実装されていない)12/16 シリーズ PIC ならではの落とし穴であった ^^;

 (2) TMR0 オーバーフロー、TMR1 オーバーフロー、キャプチャ、と合計 3 種類もの割り込みを使用したことで、TMR0 オーバーフロー割り込み処理中に TMR1 オーバーフローが発生して割込みを取りこぼしたり(=車速が異様に速くなる)、キャプチャ割り込みを取りこぼしたり(=車速が異様に遅くなる)といった症状が出るようになってしまった(爆)。そもそも車速パルスの割込みタイミングは常に変化するわけで、TMR0 のような定期的な割り込みとは相性が悪いことにもっと早く気づくべきであった。

 この症状は、割り込み処理中でもより優先順位の高い割込みを受け付けられる PIC18 シリーズなら根本的な解決を図れる。が、PIC12/16 シリーズでは極力割込み処理を簡潔に書くことで発生確率を下げるぐらいしか方法が無い(=可能性はゼロにはならない)。

 そもそも TMR0 割込みは運転時間管理(秒カウント)のために使用しているだけで、この機能を削除すれば良いのだが、それじゃぁ他のスピードメーターと同じでオリジナリティーが無くなってしまう(汗)。そこで今回はメインルーチン側で速度変化量をチェックし、1周期のパルスで一定値(20Km/h)以上の速度変化があった場合は無効データと判定することでこの問題を回避した。(普通乗用車なら急加速だろうが急ブレーキだろうがこんな速度変化はあり得ない。また 1 パルス間引いたところで応答性にも殆ど影響は無い)

 ただ、汎用性を考えると(例えば回転計に流用する場合とか)、イレギュラー値を永遠に無視し続けるのも問題なので、一定回数イレギュラー値が続いた場合はデータを更新することにした(v2.2〜)。

 (3) バー表示側 PIC が稀に不安定になることがある(起動直後からメイン側 PIC からデータが送られてくるまでの間、高速リセットを繰り返す、点灯数 0 なのに LED 13,14 がうっすら点灯する、あるいは 9個目の LED 表示が LED 9,13,14 の同時点灯となる等)。一応プログラムの一番最初でポートに値 (H) を送り込んで初期化することである程度は解決できたのだが、まだ稀に発生するため原因を究明中。(おそらくは LED を PIC の 5V 系よりも高い 10V 系で駆動しているためと思われる。そもそも 10V で駆動しているのはディマー回路を共用するためで、苦肉の策としてツェナーで 5V まで押さえ込んでいるのだが・・・。おそらく LED を外付けトランジスタを介して制御してやれば解決すると思う・・・)


注意点、改良案など:

 ・4パルス車以外でも簡単に変更できるように (→後日作で対応済)
 ・パルス H=12V 車対応 (→次回作で対応済)
 ・周波数 → 速度変換ファクターを変更できるようにする (→後日作で解決済)
 ・クロックを 2MHz に落として検出下限速度を 1Km/h にする(後日作でクロック 4MHz にして 3Km/h まで対応)
 ・積算距離計の機能を持たせる(アセンブラでは計算が面倒なので当面おあずけ)
 ・電圧計機能を持たせる (→次回作 1次回作 2で対応済)
 ・設定速度以上でトリガ信号を出す(自動ドアロック、スピード出しすぎアラーム等で利用) (→後日作で対応済)
 ・ECU から回転数データを取り出して速度計・回転計にする
 ・シフトポジションを表示する
 ・前作同様、ソースを一ヶ所書き換えるだけで HUD ではないノーマル表示が可能(ソース参照)
 ・「休憩」判定時間は「概ね 10分」で、最長 11分弱かかる場合がある。正確な 10分にするには TMR0 割込み処理がさらに重くなるので今回は見送り。
 ・内蔵クロックではなく外付けクリスタルを使い、速度計算と運転時間管理をより正確に(ポートの割り当て再考必要)


今回学んだこと:

 ・キャプチャ機能
 ・レシプロカル方式によるパルスカウントと周波数変換
 ・複数割込み処理のハンドリング


最後に:

 パルス・サンプリングをレシプロカル方式に変更したおかげで、目論見どおり全ての速度値が表示されるようになり、応答性も十分に改善することができた。また多色バー LED 表示のおかげで数字を読まなくてもだいたいの速度が判るし、ディマー回路のおかげで夜間は目障りにならない程度まで輝度が落ちて非常に実用的な作品に仕上がった。実際、この速度計を装備してからはコンソールパネルを見ることがほとんど無くなった ^^;

 またオマケのつもりで実装した運転時間表示機能や休憩アラーム機能が案外便利 ^^;。運転時間表示中でもバー LED はちゃんと速度を表示するため、特にロングドライブでは重宝している。

 いずれにしても買えば数万円するものが材料費 3000円程度で製作でき、満足度は非常に高い^^v あとはちゃんとケーシングして(排熱には十分注意)装置本体の表示が視線から隠れるようにすれば一丁上がりだ ^^


プログラム:

 改変自由だが商用利用厳禁

プログラム v2.6 ( asm & HEX ) (2010/09/17)
Speed_Meter3_v2.6.zip

謝辞:

 数値演算にはこちらのライブラリを使用させていただいております。開発者に御礼申し上げます。


2011/01/17 追記:

 その後、様々なバリエーションモデルを製作。

 ・分解能向上(5Km/h) & 電圧計機能有り版 → 詳細はこちら
 ・分解能向上(5Km/h) & 小型化版 → 詳細はこちら
 ・ドライブレコーダーにもちゃんと映るスタティック・バー表示版 → 詳細はこちら
 ・電圧計付きでフリスクケースに入ったバー表示版 → 詳細はこちら
 ・ついに HUD 速度計の最終型を完成 → 詳細はこちら


2011/03/10 追記:

 超高輝度 7セグ 青色 LED A-1001UB が市場から消えて入手不可になった模様。これから作るなら輝度はやや落ちるがこちらをお勧めしておく。


 [電子工作のページへ]