[トップページへ戻る]

USB充電 電力計

2012年10月 (製作は9月)
9月に発売されたビット・トレード・ワン社のUSB接続充電容量チェッカーが人気のようで、秋葉原では売り切れ店もありました。気になったので同様のものを自作してみました。


充電容量チェッカーの動作
元ネタはこちらの商品です。
株式会社 ビット・トレード・ワン USB接続 充電容量チェッカー
この機器は、充電が必要なUSBデバイスと電源の間に接続して使います。
現在何mAの電流が流れているか、また、これまでに何mAの電流がどれだけの長さ(時間)流れたかを表示します。

充電池の容量は「電流(mA)×時間(h)」で表されます。例えば500mAhなら、500mAの電流が1時間流れることになります(充電/放電どちらとしても)。または、250mAで2時間か、100mAで5時間か、あるいは1000mA(1A)で30分などです。
大電流なら短時間で充電でき、小電流の放電なら長時間持つという充電池の性質は、つまり充電容量(mAh)のことを説明しているのです。

この機器の中心となる機能は電流計です。マイコンで電流計を作り、経過時間をカウントし、掛け算した値を刻々と累積し、表示します。

設計と回路図
回路図


電流計の作り方は「LM317使用 可変電圧レギュレータ(簡易電圧計・簡易電流計付き)」で詳しく説明しています。
今回は電源が可変ではなく5V固定で、大電流は流れないものとして設計します。

電流の最大値
PCのUSB給電は500mAまでです。最近はスマホなどの充電目的で1000mA(1A)出力できるマザーボードもあります。USB-ACアダプタでは定格1Aや2Aが一般的です。よって、本機では1000mAまで測定できるものとします。

シャント抵抗
電源は5V固定。シャント抵抗の電圧降下分を引いた電圧がUSBデバイスにかかります。USBデバイス側としては5Vがかかることを想定しているので、シャント抵抗の電圧降下は極力小さい方がよいことになります。
入手性も考慮して0.1Ωの酸化金属皮膜抵抗とします。
この抵抗に最大1000mA(1A)流れるとき、消費電力は P = 0.1Ω * 1A^2 = 0.1W 。よって1W品で十分です。

A/Dコンバータの基準電圧とOPアンプの増幅率
シャント抵抗の電圧降下は最大で Vs = 0.1Ω * 1A = 0.1V
マイコン(AVR)のA/Dコンバータは10bit(1024段階)。内部基準電圧1.1Vを利用すると1段階は約1mVを表すので、シャント抵抗にかかる電圧を1024段階中100段階目程度までで測定することになります(0.1V / 1mV = 100段階)。
ということは、電流を 1A / 100段階 = 10mA単位 で測定することになります。これでは粗いです。
そこで測定電圧をOPアンプで増幅し、基準電圧のレンジに合わせることにします。どうせ増幅するなら基準電圧は単純に電源電圧(5V)にします。※誤差が出る内部基準電圧より、電源装置の精度と安定性をあてにしようという考えもあったりなかったり。

OPアンプの増幅率は 5V / 0.1V = 50倍 必要です。
OPアンプの非反転増幅回路を構成する抵抗は一般的に、接地側は数kΩ、帰還側は数百kΩまでで決めます。
1kΩと47kΩでちょうどよい増幅率になります。A = 1 + 47kΩ / 1kΩ = 48倍
OPアンプは単一電源で動作し、レール・トゥ・レールのものを選びます。定番のLM358でよいと思います。
誤差を少なくするため、抵抗は金属被膜抵抗を推奨します。
[2013/09 追記] 勘違いしていました。LM358はレール・トゥ・レールではなくVCC-1.5Vまでの出力です。ここでは 5-1.5=3.5V。OPアンプの入力は
3.5V/48倍=73mVまで可。従って測定可能な電流は 73mV/0.1Ω=730mA。これを超えない範囲で使用する限り、測定値に影響はありません。
根本的な解決策として、LM358の代わりにLMC662、NJU7062、NJU7072といったOPアンプを使うことで元の設計通り1000mAまで測定できます。いずれも5V単電源で動作するレール・トゥ・レール(出力フルスイング)のOPアンプです。ピン互換なので回路図に変更はありません。


A/Dコンバータは1段階あたり 5V / 1024 = 約5mV を表すことになります。この値はOPアンプで48倍に増幅した値なので、測定対象の電圧としては 5mV / 48 = 約0.1mV を測定できることになります。
逆に0.1mVと測定できたとき、シャント抵抗を流れる電流は 0.1mV / 0.1Ω = 1mA のはずです。
本機は1mA以上の電流を1mA単位で測定できることになります。正確さはともかく細かさは十分です。

表示デバイス
マイコンを活かし、[mA]や[mAh]だけでなく単位換算した[Wh]や経過時間も表示しようと思います。多くの情報が一度に見られるようLCDモジュールを使います。LCDモジュールのバックライトは案外電流を食うので(例:100mA)、必要なときだけ点灯するよう工夫します。

LCDモジュールのピンアサインは機種によって様々です。マイコンとの配線は基板上のレイアウトの都合に合わせ、ソフト側で決めた方がよいかもしれません。※回路図のバス配線になっている部分のことです。図の接続対応は一例です。

答え合わせのつもりで
商品の「USB接続 充電容量チェッカー」はオープンソースプロジェクトであり、回路図が公開されています。見比べてみると、ほとんど同じものになりました。見ながらパクったわけではありません(と弁解しておきます)。

実験の様子
ブレッドボード上で実験中の様子。7セグ時計を接続しています。表示内容の説明は後述。

配線図
LCDモジュールにSC162A(DigiTron)を使用する例


LCDモジュールにSD1602(SUNLIKE)を使用する例


共通説明
16ピンのピンソケットでLCDモジュールを接続します。マイコン側のピンアサインはファームウェア次第なので、配線は途中までしか書いてありません。

タクトスイッチはLCDモジュールのバックライト点灯用です。半固定抵抗は同じくコントラスト調整用です。どちらも基板の空いているところに取り付け(使いやすい位置に)、被服線などでLCDモジュールと配線します。

今回、マイコン(AVR)はATtiny20を使いました。SOP-14ピンのICです。ピッチ変換基板によりDIP-600milのICとして扱っています。ISPに対応しています。TPIプログラミングに使うピンを空けてあります。

USBオス/メス端子のD+線/D-線はそれぞれ直結します。※図のオレンジ色の線。1本にまとめて書いてあるが、実際は2本の線。

完成
完成基板の様子
LCDモジュールにSC162Aを使い、基板に仕上げたものです。
AVRとLCDの接続対応
ATtiny20 SC162A
PA0 RS
PA1 E
PA2

PA5
DB4

DB7
※回路図通り。
変換基板はダイセンのD014がお勧めです。写真ではズタボロのD016ですが、これはワケありです。別件で使用後にICを引っぺがして保存していたものを再利用しました。裏面がSSOPのピッチ変換になっていて、そちらを使うときのために取っておいたのですが、まさか引っぺがした面を再利用することになるとは。

中央下部、タクトスイッチを立てて取り付けています。今回のお気に入りポイントです。
USBオス側はコネクタではなくケーブルを直付けしました。

左:7セグ時計を接続して使用中。
右:スイッチ・オンでバックライト点灯。
 電流制限抵抗(回路図のR4)は
 10Ωにしました。

使用方法
本機にUSBデバイスを接続します。その状態で本機を電源に接続すると直ちに測定開始します。
測定値をリセットするには本機を電源から抜いてください。※AVRのRESETピンを使用してもよいです。

表示の説明
位置 内容 備考
1行目:左 電源電圧「5V」を表示。 固定表示。
1行目:中 現在の電流値。1000mAまで。
0mA〜1000mAと表示。
1秒ごとに更新。
1行目:右 経過時間。1000時間まで。
100時間未満は00:00〜99:59と表示。
100時間以上は100h〜1000hと表示。
何時間:何分。
2行目:左 電流量(充電容量)。10000Ahまで。
測定値 表示
0mAh <= n < 100mAh 0.0mAh 〜 99.9mAh
100mAh <= n < 10000mAh 100mAh 〜 9999mAh
10Ah <= n < 1000Ah 10.0Ah 〜 999.9Ah
1000Ah <= n <= 10000Ah 1000Ah 〜 10000Ah
1000mAhオーダーの表記は
電池容量でよく見かけるので、
そこを境にmAh/Ahの表記を
分けている。
10000mAh = 10Ah
2行目:右 電力量。50000Whまで。
測定値 表示
0Wh <= n < 100Wh 0.00Wh 〜 99.99Wh
100Wh <= n < 1000Wh 100.0Wh 〜 999.9Wh
1000Wh <= n <= 50000Wh 1000Wh 〜 50000Wh
電流量[Ah]×電圧5[V]の値。

表示の上限について
本機は1000mAまで測定可能ですが、A/Dコンバータの都合上、1000mAを少し超えた値までは正しく表示されます。
それ以上の充電電流が流れても本機に影響はありません。もちろん、電源の定格電流を超えてはいけません。

経過時間が上限に達しても電流量が上限に達していない場合、測定は継続されます。時間の表記は変わらず、電流量が更新されます。
電流量が上限に達しても経過時間が上限に達していない場合、測定は継続されます。電流量の表記は変わらず、時間が更新されます。
どちらの状態でも電力量は更新されることになります。

経過時間と電流量が共に上限に達した場合、現在の電流値以外の表示は変化しなくなります。もはや充電容量を測定する意味はありません。
※電流量(Ah)が上限値に達することはまずないでしょう。充電電流が最大の1000mA(1A)流れ続けても10000時間(417日)かかります。
※正直なところ、高い上限値と細かい段階分け表示はやりすぎたと思います。


ファームウェアについて
今回使用したAVRはATtiny20です。A/Dコンバータが1chと、LCDモジュールを接続できるだけのI/Oピン数があれば、他のAVRでも使えます。ソースを適宜修正し、ビルドしてください。
ダウンロード usbwattchk.zip Cのソースと.hexファイル(回路図通りのピンアサイン)。

float型を使わずに対処する
AVR Studio 5.1でインストールされるtoolchain(AVR-GCC)はATtiny10シリーズへの対応が不完全で、グローバル変数が使えなかったり、_delay_ms()関数の動作に問題があったりしました。
今回の開発時、toolchainの最新版を別途インストールしたところ上記2点の問題は解決されましたが、float型の演算にまだ問題があるようでした。float型同士の演算でビルドエラーが発生しました。
ここは整数型でなんとかするしかありません。次のようなハイブリッド変数(?)を考えてみました。

cパート bパート aパート
0 0 0 0 0 0 0 0 0 0 0 0
Ah mAh mAsec
0〜65535 0〜999 0〜3599
- sec→h換算の関係
mA→A換算の関係 -

基本となる処理は、秒単位の電流量(何mAが何秒流れたか)[mA * sec]を累積していくことです。
その値を、秒単位から時単位に換算したり、ミリアンペア単位からアンペア単位に換算して、表示用の値を得ます。
64bit整数型でもあれば話は済みますが、AVRのプログラムにそのような型はありません。
そのため次のように処理します。

基本通り、秒単位の電流量[mAsec]を累積していきます。
この値を3600で割ると時間単位の電流量[mAh]になります。 3600[mAsec] = 1[mAh]
値が十の位、百の位、千の位と増加していき、もし3600で「次の位」へ繰り上がれば、[mAsec]を[mAh]に換算する際の「3600で割る」という手間が省けます(小数計算をしなくて済む)。

ということで「3600で次の位へ繰り上がる値」というものを考え、これを「aパート」とします。
繰り上がった分を「bパート」とします。bパートはそのまま[mAh]の量を表すことになります。
※ちなみに算数の話として、aパートを3600で割った小数が、10進数で[mAh]の値を表現した場合の小数部になります。

時間単位の電流量を1000で割ると[mAh]単位から[Ah]単位になります。 1000[mAh] = 1[Ah]
bパートが16bit整数のとき、65535[mAh]までカウントできます。整数演算で65[Ah]になります。
より大きな量をカウントするため、「aパート&bパート」の考え方を再度当てはめます。
bパートが1000で次の位へ繰り上がれば、[mAh]を[Ah]に換算する際の1000で割る手間が省けます。

ということでbパートは「1000で次の位へ繰り上がる値」というものになります。
繰り上がった分を「cパート」とします。cパートはそのまま[Ah]の量を表すことになります。

以上のように処理すると大きな値を扱えるようになり、かつ、単位換算で小数計算がなくなります。
このハイブリッド変数同士の演算を考慮する必要はありません。

部品について
ATtiny20はデジットで販売しています。通販は共立エレショップから。ただしサイトには出ていないので見積もりのメールを出して問い合わせてください(2012/09 現在)。
ATtiny20はSOPパッケージです。ユニバーサル基板に直接ハンダ付けすることはできないので、SOP-DIPピッチ変換基板を使うとよいでしょう。ダイセン電子工業 D014がお勧めです。

LCDモジュールの機種はお好みで。電子パーツショップで手に入る16桁×2行のキャラクタ液晶モジュールなら基本的にどれでも使えます。バックライトの電流制限抵抗やコントラスト調整用の半固定抵抗は、LCDモジュールの仕様に合わせて決めます。大抵は一覧表に書いた値で大丈夫です。
LCDモジュールの取り付けやATtiny20のISP用にピンヘッダ/ピンソケットがあると便利です。

USBコネクタの形状はお好みで。ケーブルを基板に直付けするなら不要です。


USB充電 電力計 部品一覧 (回路図はここをクリック
部品名 部品番号 個数 参考価格/備考
OPアンプ U1 LM358N 1 5個100円(秋月電子
AVR(マイコン) U2 ATtiny20 1 130円(デジット)
積層セラミックコンデンサ C1,C2 0.1uF [104] 2 10個100円
酸化金属皮膜抵抗 R1 0.1Ω/1W [茶黒銀金] 1 1個10円(千石電商 店頭価格)
金属皮膜抵抗 R2 1kΩ [茶黒黒茶茶] 1 1個10円
金属皮膜抵抗 R3 47kΩ [黄紫黒赤茶] 1 1個10円
LCDモジュール LCD SD1602,SC162Aなど 1 お好みで
抵抗 R4 5.1〜47Ω 1 LCDバックライト電流制限
半固定抵抗 VR 10kΩ 1 LCDコントラスト調整
タクトスイッチ SW -- 1 LCDバックライト点灯
USBコネクタ CN1,CN2 オス/メス 各1 お好みで


◆ ◆ ◆
マイコンを使った電流計の作り方を知っていれば簡単に作れます。
気軽にチャレンジしてみてはどうでしょう。使ってみると面白いです。
オリジナル商品は7セグを使っているところが格好いいと思います。

2012/10 追記
その後の様子。7セグ時計を接続して2週間経過。
電流は52mAを示していますが、7セグがダイナミック
ドライブで、字形も頻繁に変化しているので、電流値
も常時変化しています。
12.8Ah / 347h = 平均37mAのようです。
※ということが分かったりするわけですね。


(C) 『昼夜逆転』工作室 [トップページへ戻る]
inserted by FC2 system