自作電子小物/自動車バッテリモニタ
自作電子小物/自動車バッテリモニタ
Car battery monitor V0.1
2010年12月29日水曜日
自動車のバッテリ電圧を監視し警告音を発する小物です。取付は、シガレットソケットに差し込むだけで、数値情報も常時表示され、メモリカード(SDカード)への記録も出来ます。最低電圧をチェックするだけでなく、変動量から残り時間を逆算したチェックを行います。バッテリが弱っていないかどうかを知る為に作ったものですが、充放電の変化が音で判るのでバッテリにやさしい運転が出来ると思います。
製作費は1500〜3500円、制御部にアトメル社のマイコン ATmega328P を使用し、ソフトウエアは C言語 にてコーディングしています。
<機能/特徴>
■取付簡単、車への配線は不要
■監視方法を改良しても、SDカードで簡単にプログラム変更が可能
<仕様>
名称:自動車バッテリモニタ
分類:自動車用バッテリ監視・記録装置
表示:
種別:16桁×2行 キャラクタLCD(バックライトなし)
項目:上段:バッテリ電圧[V]、エンジン回転数ゲージ(1桁=1000[rpm])
下段:経過時間[時分秒]、 バッテリ電圧下限までの残り時間[h]、小物内温度[℃]
更新頻度:1回/秒
警告音:
電圧が 12.0V を下回ると高ビープ音
残り時間が 3h を下回ると低ビープ音
ビープ音が出ると 13.5V または 10h を越えるまで持続
メモリカード記録:
測定値をSDカードへCSV形式で記録
記録項目:経過時間、バッテリ電圧、温度、エンジン回転数
記録間隔:1、10、60秒
ファイル名:CBM.CSV(FAT16/12でフォーマットされている必要有)
キー操作:
上ボタン:LCDコントラスト濃く
下ボタン:LCDコントラスト薄く
右ボタン:記録間隔を変更(表示が▲は1秒、▼は60秒、無印は10秒)
左ボタン:波形データをSDカードに記録
右ボタン長押し:セットアップメニュー>プログラム更新
取付方法:シガレットソケットにプラグを差し込む
電源:シガレットソケットから給電(3.5〜20V)12V車に限ります。
外形:幅:84mm、奥行き:52mm、高さ:21mm(突起部を除く)
<技術的なポイント>
■ハードウエア
・Atmel社のAVR ATmega328Pマイクロコントローラ
・汎用的に使える「ベースボード」を設計
・電圧の計測
分圧抵抗による直流電圧の計測
ATmega328P内蔵の10ビットA/Dコンバータの使用
・SPI接続のSDカードの使用
・I2C接続のLCDモジュールの使用(CPU内蔵プルアップ抵抗)
・圧電スピーカの単純直接駆動
・32,768Hz時計用水晶の低電力動作
・電気二重層コンデンサでの短時間の電源持続
■ソフトウエア
・プログラミング言語はC、開発環境はAVR studio、コンパイラはWinAVR(GCC)
・タイマ割込でカレンダ時計の実装
・独自SDカードライブラリを利用しCSVデータを追加書込み
・独自LCDモジュール表示ライブラリの利用(パラレル、I2C両サポート版)
・LCDモジュールのゲージ表示
・printf()の出力先をLCDモジュールへリダイレクト
・ビープ音をソフトウエアで出力
・ADCの非割込での入力
・ADC内蔵温度計の利用
・自動車電源からのエンジン回転数の抽出
■開発法
・プログラム開発は、無料で利用出来るAtmel社の標準的なIDEを使用
・プログラム書込み器は、AVRISP IIを使用
・回路とプリント基板設計は、無料で利用出来るCadSoft Computer社のEAGLEを使用。
<おおまかな設計>
■目標とする物
とにかく「バッテリの寿命を予期出来るようにする」
本当に重要な目的に使う車両の場合、定期的に交換するのが安心だと思いますが、そうでもない車では寿命ギリギリまで利用したいですし、充放電サイクルの掛け方によってかなり寿命への影響が大きいとの情報もあり、個別に寿命予測するのは無駄な努力ではないと思います。車のライフサイクルを考えれば、所詮1回のバッテリ交換費用を削減できるかどうかの小さな違いかもしれません。また、始動の力強さ、ヘッドライトの明るさの変化等、注意深く観察すれば良い事だと一括されるかも。でも、1回5000円程度の費用だとすれば、これ以内の小物を作れれば意義があると考えます。
「始動電力量比較方式」
バッテリ寿命の定義は、色々な考え方があるのですが、自動車の場合、始動できなくなった時が寿命というのは大部分の方が同意すると思います。始動に必要な電力量が無かったら、バッテリの寿命です。
始動に必要な電力は、正常に始動出来た時の電圧/電流を計測する事で得られます。バッテリの蓄電量は簡単に(電気的に)得る事は大変難しいので、バッテリの入出力を積算する事によって蓄電量を求め、その差数でOK/NGを判断出来るという考え方です。これだと、再始動を保証出来ます。
上記、簡単に書いてしまいましたが、現実的には大掛かりな機構が必要になり、よほど条件が揃わなければ、実現は難しい方法かと。
そこで、電圧だけ見るというやり方で、多少いい加減でも大きく間違っていないとするならば、セルを回した時の電圧と前回の値との比較を行う事によって予測出来るかもしれません。
「電圧変動監視方式」
静止時や、エンジン稼働時の電圧を長期的に記録、比較する事によって、能力の低下を検知出来るのではと考えました。要は「いつもと違う電圧だったら弱っているのではないか?」という見方です。
比較方法が複雑になりますので、ソフトウエアに頼る必要がありますが、ハードウエアは簡単で済みます。
他にも色々考えてみましたが、良い方法も思いつかないので、とりあえず、バッテリが弱ったかどうかは、乗っている人の判断に任せ、現状の状況を判り易く伝えるだけの小物にして、データだけ取れる様にする事にしました。
とりあえずの仕様
・色々な車のデータを取りたいので、出来るだけ簡単に取付けできる
・電圧を長時間記録し、PCに取り込められる様にする
・ソフトウエアを簡単に変更できる
・出来るだけ多くの情報を取得
■全体構成
入力部:バッテリの電圧は、シガーソケットから取れますので、取付が簡単になり好都合です。ただし、エンジン始動時は切り離されてしまう車種もある(大部分?)ので、これだけ難点です。バッテリー直下に接続できれば、始動時はもとより、本当の静止電圧も得られるのですが、配線が面倒になるので今回はパス。
表示部:出来るだけ多くの情報を安い値段でと言う事になると、キャラクタLCDモジュールしか思いつきません。
記録部:1件10バイトとし10秒間隔で情報を取るとした場合、 通勤での使用を想定し1日1時間の運転で一ヶ月分なら120kバイトのメモリが必要になります。この程度なら、EEPROMでも良いのですが、PCへの出力をシリアル接続で行ったり、無線/IR(赤外線)にしたりなどの方法を考えなければなりません。メモリカードは若干のコストアップになりますが、プログラムアップデートの件と、容量を気にしなくとも良くなりますので、こちらを選択します。
出力部:SDカードをメディアにするので、特に出力機構は不要。
制御部:A/Dコンバータがあり、SDカードを使う為にプログラムメモリが32kB程度で、時計用の低電力カウントが出来るマイコンが必要です。今回はプログラム更新をセルフで出来る、自家製のSDカードブートローダが使えるという理由でATmega328Pにします。
電源部:メイン電源はシガーソケットから得ます。駐車時にも時計をカウントするために別途バッテリを用意する必要がありますが、せっかく外部電源があるので蓄電素子が良いと思われます。具体的には二次電池より充電回路が簡単な電気二重層コンデンサを使用してみます。
<詳しい設計>
■入力部
単純に変化の少ない直流電圧を取込むだけですので、抵抗による分圧でマイコンの電圧レベルに下げてA/Dコンバータで数値化します。
ATmega328Pに入力できるアナログ電圧の上限は電源電圧3.3V(仮)もしくは内部基準電圧1.1Vです。出来れば電源電圧に左右されたくないので、内部基準電圧を使い、最大20Vまでの計測とした場合、1/18.2以上の分圧になります。部品を集め易い100k:5.1kΩが良いのですが、計算しにくい(きりが悪い)ので100k:5kΩ=21分の1とします。5kΩが入手できなければ、10kを2本並列にすれば良いだけです。
精度は、A/Dコンバータの1カウントが1.07mv(1.1V/1024カウント)なので、22.6mV単位となります。十分なものか判断できませんが、とりあえずOKです。
■表示部
キャラクタ型のLCDモジュールと言っても、いくつか選択肢があります。表示量、インタフェース方式、電源電圧、バックライト有無の違いです。表示量は10文字以上位あれば良く、インタフェースはI2Cでもパラレルでもどちらでも良いのですが、SDカードを使用する前提のため3.3V電源が都合が良いです。また、車内使用なのでバックライトが欲しい所です。
今回は、手持ち部品の関係でSB1602Bとしました。バックライトは諦めます。
■記録部
メモリカードは入手性が良く、開発し易いSDカード以外は考えられません。サイズについても、miniやmicro等ではなく標準サイズのカードコネクタにしておけば、変換ソケットで如何様にもなります。特に小型化する必要も無いので。
マイコンとの接続インタフェースは、高速性を求められている訳ではないので、パラレル方式にする必要もありません。SPI接続となります。過去の経験から、注意すべきは電源ラインと、カード検出・ライトプロテクト信号です。電源は、この手の小物としては大きい数十mAの電流がバースト的に出ますので、コネクタの近くに補強コンデンサを置いておくとトラブルを少なく出来ます。検出信号は、プルアップを高抵抗にしておかないと、スリープ時の電流が多くなり電池寿命上不利になります。ATmegaの場合、1ピン単位で内部プルアップ抵抗を動的にオン/オフできますので、このプルアップ電流を0にする事も可能ですが、この小物では実装していません。
■制御部
ATmega328Pは、特に使い方が難しい事はありませんでした。
SDカードブートローダを前提にしましたので、ISPコネクタは設けていません。プリント基板への装着前にブートローダ本体のみ書込んでおく必要があります。
■電源部
自動車から電源を供給してもらい、3端子ボルテージレギュレータで3.3Vを生成します。時計のカウントを行う為に、常時電源をマイコンに供給出来る様に、超大容量のコンデンサを付けます。カウントするだけなら1.8Vまで下がっても動くはずです。本来ならば持続時間や電力量から必要な容量を求めるのでしょうが、手持ちの電気二十層コンデンサを使う事を考えていましたので、特に計算はしませんでした。ATmega328Pのデータシート通りの消費電流になっていない状態(約200μA、原因不明)なので、今の所1時間程度しか持ちません。なお、直列に入れた抵抗1Ωは充放電電流を制限する目的です。無くともボルテージレギュレータが耐えらる物であれば問題はないと思います。
<回路図>
3つのコネクタから上はベースボードの回路で、本小物として考えたのはコネクタから下の部分です。
<部品>
合計1500〜3500円ぐらい。これにプリント基板作成すると+1000〜2000円、ケースに1000円と言った感じです。
<ソフトウエア>
■開発に必要な物
Windows PC(パソコン)
AVR Studio 4 (*1)
WinAVR (*2)
AVRISP mkII等のプログラム書込み器
*1: Atmel社のサイトからダウンロード可能 (Link)
*2: sourceforge.netからダウンロード可能 (Link)
■ソースコード
以下、使用しているソースファイルの説明です。
CarBatteryMonitor.c : アプリケーション本体。
delay.c: 時間待ちサブルーチン本体、 lcd.c から呼び出される
delay.h: 時間待ちサブルーチン定義体
lcd.c : LCDモジュール制御サブルーチン本体
lcd.h : LCDモジュール制御サブルーチン定義体
TWI_I2CMaster.c: I2C制御サブルーチン本体、 lcd.c から呼び出される
TWI_I2CMaster.h: I2C制御サブルーチン定義体
sd_*.[ch]: SDカード制御サブルーチン
独自に開発したSDカード制御サブルーチン、LCDモジュール制御サブルーチンを利用しています。これは、sd_config.h, lcd.h内にハードウエア設定を定義するだけで簡単に使えます。
割込は時計カウントだけで使用しています。他は特別な事は行っていませんし、単純な処理なので、ソースコードを読めばすぐ判ると思います。A/Dコンバータから値を取込み、変換計算をして、LCDに表示する処理を無限に続けるのが主なロジックです。
プロジェクトオプションの設定
Frequencyの設定だけ入力する必要があります。今年から始めたAVRですが、やっと#define F_CPU定義の使い方が判りました。この定義をソースコード上に乗せると、どうしても定義順の関係がうまくいかない部分が出て来て、一カ所に集約できなく悩んでいましたが、コンパイラオプションを使うと割り切ってしまえば楽なものです。
メモリ容量
まだまだ機能追加する余裕があります。
少し説明したい点があります。
ATmega328Pには温度センサが内蔵されていますが、バッテリの充電性能に影響があると考えられますので、この情報も取る事にしました。
ログしたデータを見ているとエンジン回転数に応じた電圧変動がある事に気づき、それをキャプチャして回転数を抽出するロジックを加えました。回転数との正確な関係を検証する機材がありませんでしたし、そんなに正確な情報が必要だとも感じませんでしたので、単なるゲージ表示に留めています。オルタネータの波形である可能性が高いと思われますが、イグニッション波形かもしれません。イグニッションであれば、直接回転数に比例するのですが、オルタネータではエンジン回転と一致している事を期待できませんので、いくらかの係数を掛け合わせる必要があるでしょう。とりあえず1で処理しています。まあ、予測に使える情報になるかどうかも判りません。情報だけ残す事にしました。ちなみに、周期(回転時間)を得るロジックは、単位時間での差分のピークレベルを調べ、その70%を越えるポイントの時間間隔の平均をとるというやり方にしています。私の車では、全波整流しているのか、二倍のパルスになっているようでした。
<ダウンロード>
ライセンス: フリーソフトウエア(GPL v3)
作成者:富樫豊彦 tog001@nifty.com
開発環境:
Windows2000 SP6 / VMware Fusion 3.0.2 / Mac OS X 10.5
CadSoft Computer EAGLE 5.6 Light Edition for Mac
AVR Studio 4.18.700
WinAVR 20100110(GCC 4.3.3)
AVRISP mkII
<基板>
ベースボード部分のみ専用プリント基板を用意し、この小物固有の部分はコネクタピンに空中配線です。
2層での設計ですが、1層目をジャンパ配線で半田付けすれば、片面でも行けます。右のマスクパターンは、感光基板でのフィルム印刷するために反転させています。
エッチングまで終わったプリント基板。これは1世代前のR1。パターン間隔が狭くてつながってしまったのが一カ所ありましたので、R2には反映してあります。パターン切れはありませんでしたので、エッチング時間は適切だったと思われます。穴開けは電動ドリル等使わず、全部手で行っています。
部品を取付け、半田付けの終わった所。マイコンはICソケットを使わず、無謀にも直づけしています。実は、半田付けした後に、ブートローダ起動のヒューズビットの書込みを忘れている事に気がつき、ソケットにしなかった事を後悔しました。しかしながら、ICソケットをマイコンのパッケージに亀の子のように乗せ、そこを経由してAVRISPと接続して書込みをする事が出来、事なきを得ました。亀の子書込みプローブは使えるかも。
<ケース>
ぴったり合う様な、都合のいいサイズのケースは市販されていないので、いつもの様に、アクリル板でケースを作りました。
使った材料は、細長い黒3mm厚1枚と、横長の黒と透明の3mm厚それぞれ1枚の計3枚です。1枚再利用品を使っています。新品は紙で保護されています。プラカッターで切り出して、切り口を紙ヤスリで仕上げます。
細長い材料は、棒ヒータで正確に90度に4カ所曲げ、合わせ目をアクリル用の接着剤でくっつけます。正確に作業しているつもりでも、曲げる位置がずれたので、合わせ目を棒ヤスリで削って何とか長さを合わせました。
正面パネルは、虫ピンが通る穴を横にあけてヒンジになるようにし、開けられるようにします。背面には、シガープラグを斜めに接着します。材質が違うので、接着剤はエポキシ樹脂系のものを使ってみました。少し表面を紙ヤスリで荒らしています。
左は正面パネル塗装前の状態。右が完成し実際に車に取付けた状態。
<関連>
<あとがき>
車検でバッテリが弱っているとの指摘があったので気になっていたのです。以前の車は10年以上バッテリが持ちましたので、大丈夫だろうとは思いますが、マニュアルアイドリングストップをしているとバッテリへの負荷が気になります。限界ギリギリまで使い切りたいので、この小物を考えた次第です。
富樫 豊彦 tog001@nifty.com
Battery monitor for automobile.
The low voltage is checked.
The charge change is recorded.