Arduino Nanoで作るMPPTソーラーチャージャー: 太陽光発電の最大電力追従制御
必要な部品と材料
| 部品 | 数量 | 備考 |
|---|---|---|
| Arduino Nano R3 | 1 | 制御用マイコン |
| インダクタ 100μH | 1 | 定格電流は必要出力に合わせて選定 |
| Nチャネル パワーMOSFET (IRFZ44N等) | 1 | ロジックレベル駆動推奨 |
| Adafruit Standard LCD 16x2 白文字/青背景 | 1 | 動作パラメータ表示用 |
| ACS712 電流センサーモジュール | 2 | 入力/出力電流測定用 |
| ショットキーダイオード | 1 | 出力側逆流防止・整流用 |
| 抵抗・コンデンサ各種 | 適宜 | 電圧分圧、フィルタ等 |
必要な工具
- はんだごて
使用ソフトウェア
- Arduino IDE
プロジェクト概要
市販の安価なチャージコントローラーはPWM方式で効率が悪く、MPPT対応の高効率品は高価です。そこで、自作でMPPT(最大電力点追従制御)機能付きの高効率ソーラーチャージャーを開発しました。バッテリーの状態と太陽光条件を理解し、太陽電池から最大電力を引き出して効率的に充電します。
Step 1: MPPTとは、なぜ必要か?
一般的な12V/100Wソーラーパネルの出力電圧は18-21Vですが、12Vバッテリーの充電電圧は11-13.6V程度です。従来のPWMコントローラーは単に電圧を下げるだけで、電流は増やせません(電力損失が発生)。
これに対し、降圧チョッパー(バックコンバータ)を用いれば90%以上の効率で電圧変換でき、余った電圧分を電流に変換できます。さらに、太陽電池の出力は非線形で、時間帯や日射量により最大電力点(MPP)が変化するため、MPPTアルゴリズムで常に最大電力点を追従させる必要があります。
Step 2: MPPTの動作原理
入力側の電圧・電流(VI特性)と出力側のVI特性を監視し、入力電力(Pin = Vin × Iin)と出力電力(Pout = Vout × Iout)を計算します。前回の入力電力と比較して、出力電圧(PWMデューティー比)を増減させ、入力電力が最大になる点を探索します(摂動観測法)。
例: 入力 17V × 5A = 85W、出力 13V × 6A = 78W の時、前回より入力電力が高ければ出力電圧を下げ、低ければ上げることでMPPに収束させます。
Step 3: ArduinoでのMPPT実装
以下はMPPTと出力制御を統合した核心部分のコードです。
// Iout = 出力電流, Vout = 出力電圧, Vin = 入力電圧
// Pin = 入力電力, Pin_previous = 前回入力電力
// Vout_last = 前回出力電圧, Vout_sense = 今回出力電圧
void regulate(float Iout, float Vin, float Vout) {
if ((Vout > Vout_max) || (Iout > Iout_max) ||
((Pin > Pin_previous && Vout_sense < Vout_last) ||
(Pin < Pin_previous && Vout_sense > Vout_last))) {
// 過電圧/過電流、または電力が下がっている方向ならデューティー下げ
if (duty_cycle > 0) duty_cycle -= 1;
analogWrite(BUCK_PIN, duty_cycle);
} else if ((Vout < Vout_max) && (Iout < Iout_max) &&
((Pin > Pin_previous && Vout_sense > Vout_last) ||
(Pin < Pin_previous && Vout_sense < Vout_last))) {
// 余裕があり電力が上がっている方向ならデューティー上げ
if (duty_cycle < 240) duty_cycle += 1;
analogWrite(BUCK_PIN, duty_cycle);
}
Pin_previous = Pin;
Vin_last = Vin;
Vout_last = Vout;
}
Step 4: バックコンバータ回路
通常ハイサイドスイッチングにはPチャネルMOSFETかドライバICが必要ですが、本設計ではNチャネルMOSFETをローサイド(負極側)に配置し、パネルの+12Vをグラウンド基準として使用しています。これにより安価なNチャネルMOSFET(IRFZ44N等)をArduinoのPWM出力で直接駆動可能です。
電圧測定の工夫
入力側と出力側でグラウンドが分離されるため、出力電圧の直接測定が困難です。そこで「入力側グラウンド(ArduinoのGND)と出力側グラウンドの電位差」を測定し、入力電圧から差し引くことで実出力電圧を求めています。
// 出力側グラウンド電位を測定 (入力GND基準)
Vout_sense_temp = Vout_sense_temp * 0.92 + float(raw_vout) * volt_factor * 0.08;
// 実出力電圧 = 入力電圧 - 両グラウンド間電位 - ダイオード順方向電圧降下
Vout_sense = Vin_sense - Vout_sense_temp - diode_volt;
電流測定にはACS712モジュールを使用(Arduino電源で駆動、入力側GND基準)。PWM周波数はタイマー設定変更により62.5kHz(D6ピン)としています。インダクタ値は周波数と電流要件に応じて選定(オンライン計算機利用推奨、100μH 5-10A程度)。
Step 5: 仕上げと追加機能
LCDによるパラメータ表示、ユーザー設定用スイッチ2個を追加。最終版コードと完全な回路図は近日公開予定。
Step 6: 実際の回路図・部品表・コード
コード・BOM・回路図をアップロード済み。実際のものとは少し異なりますが、製作しやすい構成になっています。
完全版スケッチ (Solar_charger_tutorial_code.ino)
ウォッチドッグタイマー、EEPROM設定保存、LCDメニュー操作、ソフトスタート、過熱保護、ファン制御など実用的な機能を盛り込んだ完全版です。主要機能:
- MPPT制御 (摂動観測法)
- バッテリー充電制御 (ブースト/フロート充電、充電完了検知)
- 入力低電圧保護、過熱保護(ヒートシンク温度監視)
- LCDメニューによるパラメータ設定 (ブースト電圧、フロート電圧、最大/最小電流、入力閾値、オート/マニュアルモード)
- 設定のEEPROM保存/読み出し
- シリアルモニターによるデバッグ出力
// 主要定義
#define VIN_PIN A1
#define VOUT_PIN A0
#define IOUT_PIN A2
#define IIN_PIN A3
#define LM35_PIN A4
#define FAN_PIN 5
#define BUCK_PIN 6
#define MENU_PIN 3
#define BUTTON_PIN 2
#define LED_PIN 13
#define CHARGE_LED A5
#define LIGHT_PIN 4
// LCD, EEPROM, ウォッチドッグ等の初期化
// メインループで10回平均サンプリング -> MPPT制御/充電制御 -> LCD表示更新
// 詳細コードは添付ファイル参照
回路図
設計のポイントと注意事項
- グラウンド分離: 入力/出力でGNDが分離されるため、電圧測定に工夫が必要。絶縁型DC-DCコンバータやアイソレーションアンプを使うとより確実。
- MOSFET駆動: 大電流時はゲートドライバやブートストラップ回路で10V駆動とし、MOSFETを完全飽和させて損失を最小化すべき。
- インダクタ選定: 飽和電流に余裕を持たせること(定格の80-90%以下で使用)。コア損失と銅損失のバランスで最適値を選ぶ。
- MPPTアルゴリズム: 単純な摂動観測法(P&O)を採用。急激な日射変化時のハンチング低減には、可変ステップサイズやインクリメンタルコンダクタンス法への改良が有効。
- 安全性: 逆流防止ダイオード、ヒューズ、過電圧/過電流保護、過熱保護を必ずハードウェアでも実装すること。
製造プロセス
- ブルドーザー技術:設計、製造、将来イノベーション
- 太陽電池:初期実験から現代フォトボルタイクスまで
- Arduinoで実現する低コスト・リアルタイム太陽光パネル監視システム
- Bluetooth操作のArduinoスパイボットを自作する
- FlickMote:ジェスチャー操作のIRリモコンでスマートホームを制御
- 自作Arduino TV-B-Gone:全テレビ対応の万能リモコン
- 12メートル先から見える大型LEDマスタークロック(アラーム機能付き)を自作しよう
- ArduinoとBluetoothで作るスマート紛失防止タグ「Find Me」
- Arduinoプロジェクトのための最適化電源ソリューション
- ソーラートラッカー V2.0 – 高度なDIYソーラーパネル追尾システム
- 風力発電:大気の動きをクリーンな電力に変える技術