工業製造
産業用モノのインターネット | 工業材料 | 機器のメンテナンスと修理 | 産業プログラミング |
home  MfgRobots >> 工業製造 >  >> Manufacturing Technology >> 製造プロセス

Arduinoで作る多チャネル・スマートバッテリー充電器:自動切替・電圧表示・近接センサー付き

プロジェクト背景

冬季に複数の車両・ボート・発電機などの12Vバッテリーを維持充電するため、市販のトリクルチャージャーを複数台買う代わりに、1台の充電回路を複数バッテリーへ時分割で切り替えるマルチプレクサー型スマートチャージャーをArduinoで自作しました。最大6バッテリー対応、自動電圧検知で未接続ポートをスキップ、LCDで各電圧を常時表示、超音波センサーで手をかざすとバックライト点灯という遊び心も搭載しています。

必要な部品と材料

部品数量備考
Arduino UNO1
Arduino Proto Shield1実装用
MCP3008 8ch 10bit ADC (SPI)1アナログ入力拡張(UNOはA4/A5がI2C専用)
5V 2ch リレーモジュール (フォトカプラ絶縁)3計6チャネル分
LM2596 DC-DC バックコンバーター (3A可変)112V→5V降圧、Arduino・リレー駆動用
1kΩ 抵抗12電圧分圧用(各チャネル2本)
6P 端子台1バッテリー接続用
超音波距離センサー HC-SR041LCDバックライト自動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(); }

テスト・デバッグ機能

回路図

Arduinoで作る多チャネル・スマートバッテリー充電器:自動切替・電圧表示・近接センサー付き
マルチプレクサー充電器回路図

改良・拡張アイデア

製造プロセス

  1. スマートブラインド:Arduinoとソーラー電源で実現する自動光制御
  2. スマート貯金箱を作ろう:Arduino Nanoでコインアクセプターを制御
  3. Arduino Dueと3.2インチTFTで作る温度監視付きリアルタイムクロック
  4. ArduinoでBluetooth経由でLEDを制御 – シンプルDIYガイド
  5. Arduinoプロジェクトのための最適化電源ソリューション
  6. Arduino MegaとNextion HMIで作る高機能ウェザーステーション
  7. ArduinoとNokia 5110ディスプレイで自作電圧計:ステップバイステップガイド
  8. Arduino Mega 2560搭載 総合トレーニングキット – センサー、モーター、カスタムPCB完備
  9. NextionディスプレイでFridgeyeアプリを構築:ステップバイステップガイド
  10. Arduino UNOとEthernetシールドで太陽放射を測定する自作ピラノメーター
  11. スマート手話グローブ:ジェスチャーをテキスト/音声に変換