Linux Car計画

Also available in English and Korean (한국어).

電源コントローラ回路

基本的には、エンジンをかけたら勝手にPCが起動し、エンジンを切ったら 勝手にシャットダウンして電源が切れるようにしたい。

(さらに言えば、5分や10分車を離れている間は起動しっぱなしにし、 再起動の待ち時間を減らしたいところだが、いずれにしろ今回の 電源回路はエンジンスタートに耐えられないため、それは次の課題だ)

イグニッションキーの信号で起動させればいいように思えるが、 注意しなければならないのは、 エンジン始動による低電圧時には、リレーでPCを切り離しておかないと、 良くてもリブート、悪ければ「ブラウンアウト」状態でハングアップ、 いずれにしても大きなストレスをDC-DCボードに与えてしまうことだ。 これに対処するには、イグニッションがONになったあと 一定時間待つ方法があるが、確実とは言えないので、 供給電圧そのものをアナログレベルで検出する方法をとった。

ATX以降のPCを起動させるには、リレーで電源をつなぐだけでなく、 電源ボタンを押す必要がある (Auto bootというBIOS設定項目は、期待したようには動作しなかった)。 また、ACPI対応のPCでは、電源ボタンを押すとシャットダウンを 開始するように構成でき、これを利用すれば、 専用のプログラムを作らなくても、OSを問わず安全にシャットダウンできる。 そこで、電源コントローラからマザーボードの電源スイッチのピンに パルスを送れるようにした。

シャットダウン開始後は、一定時間待ったあと、リレーをオフにするようにした。 PC側の電源が切れたのを検出するとより良いように思えるが、 そもそもPCが自分で電源を切った後はごくわずかのスタンバイ電流しか消費しないし、 シャットダウン中にハングアップする場合に備えて、 いずれにしろ一定時間後には強制的に電源を落す必要があるので、 あまり意味がない。 シャットダウン中にイグニッションキーが再びONになった場合は、 エンジン始動に備え、強制的にリレーをオフする。

まとめると、電源コントローラの動作は以下のようになる。

  1. リレーをOFF (初期状態)
  2. イグニッション信号がONになるのを待つ
  3. 供給電圧が高くなる(エンジンがスタートして安定する) のを待つ
  4. リレーをONし、電圧が安定するまで待つ
  5. 電源ボタンにパルスを送り、電圧が安定するまで待つ (PC起動)
  6. イグニッションがOFFになるのを待つ (PC作動中)
  7. 電源ボタンにパルスを送る (シャットダウン開始)
  8. 一定時間後、1.へ

起動シーケンス中は、イグニッションがOFFになったら、 即座に初期状態に移行する (リレーをOFFにする)。 同様に、シャットダウン中はイグニッションがONで初期状態に戻す。

このような動作は、アナログコンパレータとRCによるタイマでも、 実現できるとは思うが、アナログ回路は苦手なので、 PICマイクロコントローラ を使った。 PICはメモリや周辺回路を集積したワンチップの8ビットマイコンで、 フラッシュメモリでプログラムが書き換えられる品種はアマチュアにも人気があり、 安く入手できる。 今回は、電圧検出に使うアナログコンパレータを内蔵した、18ピンの 16F628 を採用した。 これはリセット回路やクロック回路まで内蔵しているため、 電源ピンの他は全て入出力ピンとして利用できる。 プログラム容量や速度から言っても、 より小さい8ピンの 12Fxxxシリーズ でも十分であったが、手持ちのライターが未対応なので断念した。

回路設計

回路とPICプログラムを開発中のブレッドボード
PIC用の+5Vレギュレータ

PIC用の+5Vには、手持ちのS81350を使った。78L05でも置換できると思う。 この耐圧は15Vで、 レギュレートされていない供給電圧をつなぐのはやや不安だったので、 レギュレータ回路を通った後の12Vをつないだ。

イグニッション信号の入力回路

イグニッション信号は12Vで入ってくるため、 5VのPICのレベルに合わせる回路が必要になる。 よくダイオードでクランプする方法がとられるが、 ここでは回路全体の消費電流が非常に少ないため、 PIC電源の5Vが12Vから流入する電流によって持ち上げられて、 PICを破壊してしまう可能性がある (3端子レギュレータは出力が持ち上げられると何もできない)。 抵抗を大きくすれば流入電流は少なくできるが、 あまり大きくしてもノイズに弱くなりそうだ。 そこで、トランジスタを使ったスイッチング回路とした。 入力電流は全てGNDに流れる。 トランジスタは手持ちの2SC1815を使ったが、 小電流用のNPN型なら何でも使えると思う (ピンアウトには注意)。 入力インピーダンスは低めにしている (ノイズによる誤動作防止)。 入力電圧を約1/10に分圧することで、 VBE=約0.6Vの10倍の6Vぐらいがスレッショルドになる。 トランジスタはオープンコレクタになっているが、 実際にはPICの内蔵プルアップ抵抗によってプルアップされている。

電圧検出用の入力回路

PIC内蔵のアナログコンパレータに入力するための、 バッテリ電圧分圧回路。 コンパレータは、PIC内蔵の基準電圧モジュール (VDDを分圧するだけ) を使った 1.25V と比較している。専用の基準電圧を用意する程の精度は必要無いと判断した。 バッテリ駆動(約12V)かオルタネータ駆動(約14V)かを判別するのに使うので、 VRで入力の13Vあたりが1.25Vになるように調整する。 抵抗の値は、ばらつきの吸収のため調整範囲がやや広くなるように選んでいる。 ここもインピーダンスを低めにしていて、電流が多めに流れるため、 電圧は常時電源でなくイグニッションから拾うようにした。

クリップ用のダイオードはここでも入れていないが、 電圧自体を約1/10にしているので、 簡単なRCフィルタのみで済ませた (PICを破壊するには50V以上の入力が必要なことになる)。 基準電圧を1.25Vと低くとったのはこのためだ。

リレー出力回路

リレーのコイルは30mAほど流れるし、入手したものが12V用だったため、 PIC直接でなくトランジスタ(2SC1815)を通した。 リレー自体はレギュレータボードのほうに実装してある。 プルダウン抵抗は、ないと、電源投入時に一瞬誤動作することがあった。

PC電源スイッチ回路

EPIAの電源スイッチのヘッダは、片側はGND、 もう片側は3.3Vにプルアップされているようだ (このときPSUから供給されているのはスタンバイ用の+5Vだけなので、 EPIAは+5VSBから3.3Vにレギュレートする回路を持っているらしい)。 これを、ボタンが押されたのと同じように制御するには、 オープンコレクタでも十分だが、 ちょうど手元にあった古いモデムの電源回路にフォトカプラがついてたので、 これをサルベージして使った。 これならスイッチが+電源とプルダウンの組合せだったとしても動作するし、 電気的に絶縁されるので、余計な心配をしなくて済む。 フロントパネルの本物の電源スイッチも並列につないで、 こちらも使えるようにした。

動作確認のため、LEDをひとつ入れた。 これは5つのモードで点灯するようにプログラムした。

消灯
すべてOFFで、イグニッションがONになるのを待っている状態
短くON、長くOFF (1秒周期)
イグニッションがONだが、バッテリ電圧が低い
短い点滅 (0.25秒周期)
イグニッションがONで、バッテリ電圧も高い (1秒連続するとパワーONになる)
点灯
パワーON
長い点滅 (1秒周期)
シャットダウン中

このほか、電源スイッチを導通させている間(100ms)は、消灯するようにした。 これで、LEDひとつだけでプログラムの動作状態が分かるようになった。 検出電圧のVR調整にも十分だ。


PIC回路全体

製作

レギュレータボードと同じく、部品の配置と配線を決めるために pcb で図を書き、ユニバーサル基板にスズメッキ線で配線した。 こちらの基板は大電流が流れるわけでもないので、 それほど気を使うところはない。

配置と配線。pcbファイル 完成基板半田面

PICプログラミング

PICのプログラム開発にはLinux上で動作する gpasm を使った。PICへの 書き込みには秋月電子の AKI-PIC Ver.3 と、Linux用の書き込みソフト akipic を使用した。

PIC書き込み中

クロック生成には外部のクリスタルやセラミック発振子を使うか、 内蔵のRC発振器で済ませるかという選択肢がある。 今回の場合、それほど時間計測に精度が要求されるわけではないので、 内蔵で済ませた。 また、内蔵のRC発振では約4MHzと約37KHzの選択ができる。 37KHzを選べば消費電力は最小になり、待機時にSLEEP (省電力モードへ移行) する必要もなくなる。 そこで、37KHzで組んでみて、 処理が追い付かなくなったら4MHzに切替えるという方針をとった。

LEDをメイン処理と非同期に、かつ安定して点滅させたいので、 タイマ割り込みを使い、時間計測にもこれを用いるようにした。 タイマ割り込みの周期は1/100秒とし、時定数を10ms単位で書けるようにした。

プログラミングは、まずLEDのみを接続して、 割り込みによって指定した通りのパターンで点滅させるところから始めた。 LEDの点滅パターンは、8ビット値の0か1で指定して、 1秒で1ループするように組んだ。1ビットあたり1/8秒ということになり、 1/100秒のタイマでは割り切れないが、そもそもRC発振のクロックなので、 気にしない。 ここまで行くのに少し手間取ったが、これができてしまうと後は簡単だった。

実際に1秒周期でLEDを点滅させてみると、 実際の1秒より少し長くかかっているように感じたが、 シリアル通信などをするわけでもないので、これでも十分だ。

すべて組み終わると、37KHzのスピードで十分なことが分かった。 使用したプログラムメモリは2Kワードの容量中わずか189ワード。 20MHzで駆動できるチップを1/500ぐらいのスピードで使ってるわけだし、 データEEPROMやシリアル通信など、使ってない機能は山程ある。 もったいない話だが、わずか300円のチップである。 PICを使わずに300円で同等の回路を構成するのは、多分無理だ。

ダウンロード


次へ | Linux Car計画