Arduinoで作る多チャネル・スマートバッテリー充電器:自動切替・電圧表示・近接センサー付き
プロジェクト背景
冬季に複数の車両・ボート・発電機などの12Vバッテリーを維持充電するため、市販のトリクルチャージャーを複数台買う代わりに、1台の充電回路を複数バッテリーへ時分割で切り替えるマルチプレクサー型スマートチャージャーをArduinoで自作しました。最大6バッテリー対応、自動電圧検知で未接続ポートをスキップ、LCDで各電圧を常時表示、超音波センサーで手をかざすとバックライト点灯という遊び心も搭載しています。
必要な部品と材料
| 部品 | 数量 | 備考 |
|---|---|---|
| Arduino UNO | 1 | |
| Arduino Proto Shield | 1 | 実装用 |
| MCP3008 8ch 10bit ADC (SPI) | 1 | アナログ入力拡張(UNOはA4/A5がI2C専用) |
| 5V 2ch リレーモジュール (フォトカプラ絶縁) | 3 | 計6チャネル分 |
| LM2596 DC-DC バックコンバーター (3A可変) | 1 | 12V→5V降圧、Arduino・リレー駆動用 |
| 1kΩ 抵抗 | 12 | 電圧分圧用(各チャネル2本) |
| 6P 端子台 | 1 | バッテリー接続用 |
| 超音波距離センサー HC-SR04 | 1 | LCDバックライト自動ON/OFF用 |
| I2C LCD 16x2 (YWRobot LCM1602) | 1 | アドレス 0x27 |
必要な工具
- はんだごて
動作原理
1. 電圧測定・生存判定 (`read_show_volts`)
MCP3008のCH0〜CH5へ、1kΩ+1kΩ分圧でバッテリー電圧を1/2にして入力。8V以上なら「接続あり」と判定し、充電ローテーション対象に追加。最小電圧閾値 `min_volts` 以下なら除外。
2. 充電ローテーション (`checkRelays`)
生存判定されたリレーを順番にON。デフォルトは 1時間/チャネル。全チャネルひと巡りしたら最初に戻る。タイマー割り込みで管理。
3. 表示更新 (`update_display`)
LCD 2行で電圧表示。ページ切替でCH1-2 / CH3-4 / CH5-6 + システム電圧(5V) + 内部基準(3.3V) を循環表示。
4. 近接検知で省電力表示 (`read_distance`)
HC-SR04で80cm以内に物体(手)を検知したらバックライトON、カウンターリセット。`time_on_count` 秒(デフォ100秒)検知なしでバックライトOFF。
スケッチ(主要部抜粋)
#include <Wire.h>
#include <LiquidCrystal_I2C.h>
#include <timer.h>
#include <HCSR04.h>
auto timer = timer_create_default();
LiquidCrystal_I2C lcd(0x27, 2, 1, 0, 4, 5, 6, 7, 3, POSITIVE);
int chargeTime = 10 * 1000; // 10秒(テスト用。本番は 3600000 = 1時間)
int charge_time_max = 60; // カウンター最大値
int relayPins[] = {3, 4, 5}; // リレー制御ピン(LOWアクティブ)
int current_relay = 0;
int max_relays = 3;
float volts[3];
int min_volts = 1.0; // これ以下は未接続とみなす
UltraSonicDistanceSensor distSensor(11, 12); // Trig=11, Echo=12
void all_relays(int state) {
for (int p : relayPins) digitalWrite(p, state);
}
void toggle_relay(int idx) {
all_relays(HIGH);
digitalWrite(relayPins[idx], LOW);
lcd.setCursor(0, 0);
lcd.print("Relay: "); lcd.print(idx + 1);
}
void checkRelays() {
charge_time_counter++;
if (charge_time_counter >= charge_time_max) {
current_relay = (current_relay + 1) % max_relays;
toggle_relay(current_relay);
charge_time_counter = 0;
}
}
void read_show_volts() {
// MCP3008読み取りは SPI.transfer() で実装(省略)
// ここではアナログピン直読み風に簡略化
for (int i = 0; i < 3; i++) {
volts[i] = analogRead(i) * 0.016; // 分圧係数調整済み
// LCD表示処理...
}
// 生存判定でリレー配列再構築
int cnt = 0;
for (int i = 0; i < 3; i++) {
if (volts[i] > min_volts) relayPins[cnt++] = relayPins[i];
}
max_relays = cnt;
read_distance();
}
void read_distance() {
int d = distSensor.measureDistanceCm();
if (d < 80) { lcd.backlight(); time_on_counter = 0; }
else if (++time_on_counter > time_on_count) { lcd.noBacklight(); time_on_counter = 0; }
}
void setup() {
Serial.begin(19200);
lcd.begin(16, 2); lcd.backlight();
for (int p : relayPins) { pinMode(p, OUTPUT); digitalWrite(p, HIGH); }
read_show_volts();
checkRelays();
timer.every(chargeTime, checkRelays);
timer.every(500, read_show_volts); // 0.5秒ごと電圧更新
}
void loop() { timer.tick(); }
テスト・デバッグ機能
- HC-SR04に数秒手をかざすと「テストモード」突入:ローテーション間隔が数秒になり、リレー切替動作を即確認可能
- 再度手をかざすと通常モード(1時間間隔)に復帰
- シリアルモニターに `debug` レベルで詳細ログ出力可能
回路図
改良・拡張アイデア
- 充電電流測定(シャント抵抗+アンプ)でCC/CV制御へ発展
- バッテリー種別(鉛/リチウム/LiFePO4)自動判別・プロファイル切替
- Wi-Fi/Bluetooth追加でスマホ監視・ログ蓄積
- ソーラーパネル入力対応でオフグリッド運用
製造プロセス
- スマートブラインド:Arduinoとソーラー電源で実現する自動光制御
- スマート貯金箱を作ろう:Arduino Nanoでコインアクセプターを制御
- Arduino Dueと3.2インチTFTで作る温度監視付きリアルタイムクロック
- ArduinoでBluetooth経由でLEDを制御 – シンプルDIYガイド
- Arduinoプロジェクトのための最適化電源ソリューション
- Arduino MegaとNextion HMIで作る高機能ウェザーステーション
- ArduinoとNokia 5110ディスプレイで自作電圧計:ステップバイステップガイド
- Arduino Mega 2560搭載 総合トレーニングキット – センサー、モーター、カスタムPCB完備
- NextionディスプレイでFridgeyeアプリを構築:ステップバイステップガイド
- Arduino UNOとEthernetシールドで太陽放射を測定する自作ピラノメーター
- スマート手話グローブ:ジェスチャーをテキスト/音声に変換