Arduinoで作るUSB充電容量チェッカー、試作編
ビットトレードワンのUSB充電容量チェッカーからヒントを得て、Arduinoで同じような物が出来ないか検討中です。キャラクタ液晶を使うのも大げさなので、高速化改造した万歩計に表示させることにして、回路はこんな感じを考えています。
▼回路図(クリックで別窓に拡大)

なんだか大変そうに見えますがそんなことはありません。青の点線の内側はArduino UNOなので実際に作らないといけないのはその外側だけです。なお、Arduinoの部分の回路図はこちらの記事にBSch3V形式で公開しています。
最終的にはAVRのチップの単独動作に持ち込む予定です。その場合は、この回路図を元に余分な線の削除や電源・クロックオシレータを追加した図面を作れば良いので間違う可能性は少ないと思います。
説明が後になりましたが仕様としては、電流を0.1Ωのシャント抵抗で検出して20倍に増幅して積分。測定範囲は2.5Aまでで、表示は0.1mAh単位、最大は9999.9mAh表示までを予定しています。
▼ブレッドボードで試作中

入力のオペアンプの部分はまだ作ってないので、可変抵抗で0~5Vの電圧をアナログ入力(A5)に入れてプログラムの動作確認中。特に問題は無さそうです。
▼現在のスケッチはこんな感じ
動作としては、初期化後はMsTimer2で50ms毎にADCを読んで値を累積。累積値がスケールファクターの値を越えたら表示用カウンター(万歩計)にパルスを送っています。メインルーチンは省電力のためアイドルモードでスリープ。
こんな簡単なプログラムを動かすのにATmega328Pはもったいなくて、もっと規模の小さなCPUで充分です。でも他のCPUを使うスキルは無いです。汗;
万歩計の電源の1.5Vをアナログ出力で供給しているところは我ながらナイスアイデアだと思います。スケッチだと下記の行です。
analogWrite(manpoPow, 88); // 万歩計の電源を供給開始。電圧は約1.5V
たったこれだけ書いて、PWM出力を平均化するためのCRを付けておくだけで1.5Vが作れるのは便利です。
ということで、基本的な動作確認は終わったので、これを小さく作り込んでいくことにします。どれだけ小さく作れるか、はたして連休中に完成するかが問題です。
▼回路図(クリックで別窓に拡大)

なんだか大変そうに見えますがそんなことはありません。青の点線の内側はArduino UNOなので実際に作らないといけないのはその外側だけです。なお、Arduinoの部分の回路図はこちらの記事にBSch3V形式で公開しています。
最終的にはAVRのチップの単独動作に持ち込む予定です。その場合は、この回路図を元に余分な線の削除や電源・クロックオシレータを追加した図面を作れば良いので間違う可能性は少ないと思います。
説明が後になりましたが仕様としては、電流を0.1Ωのシャント抵抗で検出して20倍に増幅して積分。測定範囲は2.5Aまでで、表示は0.1mAh単位、最大は9999.9mAh表示までを予定しています。
▼ブレッドボードで試作中

入力のオペアンプの部分はまだ作ってないので、可変抵抗で0~5Vの電圧をアナログ入力(A5)に入れてプログラムの動作確認中。特に問題は無さそうです。
▼現在のスケッチはこんな感じ
//
// USB充電容量チェッカー
// V0.0 radiopench 2013/04/27
//
#include <avr/sleep.h> // < >は半角に修正要
#include <MsTimer2.h>
boolean output = 0; // 出力反転フラグ
int analogPin = 5; // 入力ピン(5V=2.5A)
int manpoPow = 9; // 万歩計用の電源出力ピン
int outPin = 8; // 万歩計カウントアップ信号ピン
int sum = 0; // 積分用の変数
int scaleFactor = 1475; // 感度係数
void setup() {
pinMode(outPin, OUTPUT);
analogWrite(manpoPow, 88); // 万歩計の電源を供給開始。電圧は約1.5V
MsTimer2::set(50, measure); // 50ms周期で呼び出し
MsTimer2::start();
}
void loop() {
set_sleep_mode(SLEEP_MODE_IDLE); // アイドルモードでスリープ
sleep_mode();
}
void measure() {
sum = sum + analogRead(analogPin); // 測定値を積分
if(sum >= scaleFactor){ // 積分値がスケールファクター以上なら
output = !output; // 出力反転
digitalWrite(outPin, output); // パルス出力
sum = sum % scaleFactor; // 積分値に余りを記録
}
}
動作としては、初期化後はMsTimer2で50ms毎にADCを読んで値を累積。累積値がスケールファクターの値を越えたら表示用カウンター(万歩計)にパルスを送っています。メインルーチンは省電力のためアイドルモードでスリープ。
こんな簡単なプログラムを動かすのにATmega328Pはもったいなくて、もっと規模の小さなCPUで充分です。でも他のCPUを使うスキルは無いです。汗;
万歩計の電源の1.5Vをアナログ出力で供給しているところは我ながらナイスアイデアだと思います。スケッチだと下記の行です。
analogWrite(manpoPow, 88); // 万歩計の電源を供給開始。電圧は約1.5V
たったこれだけ書いて、PWM出力を平均化するためのCRを付けておくだけで1.5Vが作れるのは便利です。
ということで、基本的な動作確認は終わったので、これを小さく作り込んでいくことにします。どれだけ小さく作れるか、はたして連休中に完成するかが問題です。