ポータブルソーラートラッカースマホ充電器:Arduinoとサーボで太陽追尾
必要なパーツと用品
| パーツ | 数量 |
|---|---|
| Arduino UNO | 1 |
| サーボモーター(Tower Pro MG996R) | 1 |
| フォトレジスタ(CdSセル) | 2 |
| 抵抗 10k Ω | 2 |
| 2.5V→5V ブーストコンバーター(USB出力対応) | 1 |
| 小型ソーラーパネル | 2 |
必要なツールと機械
- はんだごて(汎用)
使用するアプリとオンラインサービス
- Arduino IDE
プロジェクト概要
グリーンエネルギーへの取り組み
オーストラリアで再生可能エネルギー業界に携わり、しばらくArduinoでいろいろ実験してきましたが、このプロジェクトでついに両者を融合し、自作の小型ソーラーデバイスを作ることにしました。最初に一点:このプロジェクトはArduinoとサーボに5V電源が必要ですが、ソーラーパネルの出力は良くても3.4V程度です。したがって、厳密には「元が取れる」仕組みではありません。しかし、このコンセプトはスケーラブルです。例えば、8枚のパネルアレイで12Vを生成すれば、Arduino駆動とスマホ充電を外部電源なしで両立できます。将来的にそのバージョンも作成予定で、完成次第ここにリンクを追加します。
参考にした情報源:
- The DIY Life - Arduino Solar Tracker
- Brown Dog Gadgets - Solar Altoids USB Charger
両方ともこのテーマに関する優れた情報源で、ここでのコンセプトの元になっています。
はじめに
まずソーラーパネルが必要です。私は2枚使用しましたが、枚数は自由です。ただし、9gサーボが持ち上げ・下げられる重量を考慮してください(重すぎると動作しません)。使用したパネルは1.5V、0.75W出力の、比較的低出力タイプですが、軽量で安価、概念実証には十分です。
2枚のパネルをエポキシ接着剤で端同士を接合。直列接続するには、一方のプラスリードを他方のマイナスリードにはんだ付けし、余ったプラスとマイナスのリードを取り出します。各パネルの両側(東・西)にCdSセル(フォトレジスタ)を取り付け、それぞれのリードにはんだ付けしてジャンパーワイヤーを接続します。ジャンパーワイヤーの片側を切って5mmほど被覆を剥くと、はんだ付けしやすくなります。
ArduinoでCdSセルを読み取るには、各セルに分圧回路が必要です。CdSセルをR1、10kΩ抵抗をR2として分圧し、2つの抵抗の接点からArduinoへジャンパーワイヤーを接続します。ブレッドボードで組む場合、CdSセルの一方のリードを分圧回路、もう一方をプラス電源レールに接続します。Fritzing図を参照してください。
トラッカー構造
次に、パネルを載せる旋回支持構造を作ります。私の設計は、2つのAフレームで支えられたスプリング鋼の棒です。パネルアレイの裏側に小さな木製ストラットを取り付け、スプリング鋼を通す穴を開けました。安価・簡単・軽量なバルサ材で作りましたが、恒久設置なら薄い鋼板や防腐処理した合板が望ましいです。構造の製作過程は動画で確認できます(サーボの取り付け位置も分かります)。私はパネルを下向き角度で取り付け、構造のベースを北向きに固定することで、パネルがどちらに振れても常に少し北向きに傾き、出力を最大化しています(南半球在住のため)。
サーボの取り付け
サーボはAフレームの支持梁の一つに取り付け、パネルの片側を持ち上げ・下げします。ペンチでスプリング鋼を曲げてフック状にし、パネルストラットとサーボアームに通します。サーボアームの穴を広げる必要がある場合は、最小のドリルビットで拡張します。スプリング鋼をサーボアームやパネルストラットに接着しないでください。 パネルがスムーズに動くためには、穴の中で自由に回転できる必要があります。取り付け後、パネルを構造から外し、サーボのみの状態でキャリブレーションを行います。
サーボのキャリブレーション
新しいスケッチを開き、以下のコードを入力:
#include
Servo myservo1;
int pos = 10;
void setup() {
myservo1.attach(9); // PWMピン9にサーボ接続
}
void loop() {
myservo1.write(pos);
}
Arduinoにアップロードし、サーボの位置を確認。スケッチの'pos'値を0〜180の間で変更しながら再アップロードし、サーボアームが真上と真下を向く位置を見つけます。それらが最大・最小値になります。私の場合は15と140でした。180から0にオーバーラップする場合は、サーボアームを外して再配置してください。
すべてを組み合わせる
すべて接続し、以下のスケッチをアップロード:
// Sun Tracker Sketch
// 9gサーボ用(Arduinoから直接給電可能、外部電源不要)
// Fritzing図はGitHubリポジトリ参照
// https://github.com/nickalanf/Arduino--Projects
// シリアルモニタ部分はデバッグ用。動作確認後は無効化可能
// Sketch by FIELDING - 8/2/18
#include
Servo servo;
int eLDRPin = A0; // 東側CdSセル
int wLDRPin = A1; // 西側CdSセル
int eastLDR = 0; // 東側読み取り値
int westLDR = 0; // 西側読み取り値
int difference = 0; // 差分
int error = 10; // 許容誤差(両セルに均等な光が当たった時の差分補正)
int servoSet = 130; // サーボ位置(デバイスごとに異なる)
void setup() {
servo.attach(9);
Serial.begin(9600);
}
void loop() {
eastLDR = analogRead(eLDRPin);
westLDR = analogRead(wLDRPin);
// 両方のCdSセルで低光量(夜間)なら、朝に備えて東(初期位置)に戻す
if (eastLDR < 400 && westLDR < 400) {
while (servoSet <= 140 && servoSet >= 15) {
servoSet++;
servo.write(servoSet);
delay(100);
}
}
difference = eastLDR - westLDR;
if (difference > 10) { // 東側が明るい → 東へ
if (servoSet <= 140) {
servoSet++;
servo.write(servoSet);
}
} else if (difference < -10) { // 西側が明るい → 西へ
if (servoSet >= 15) {
servoSet--;
servo.write(servoSet);
}
}
// シリアルモニタ出力(デバッグ・セットアップ用)
Serial.print(eastLDR);
Serial.print(" - ");
Serial.print(westLDR);
Serial.print(" - ");
Serial.print(difference);
Serial.print(" - ");
Serial.print(servoSet);
Serial.print(" - ");
Serial.println(".");
delay(100);
}
シリアルモニタを開き、CdSセルに光を当ててテストします。両方に均等に光を当て、表示されるdifference値を確認。25より大きい、または-25より小さい場合は誤差補正が必要です。該当するCdSセルの値にerror値を加減算して補正してください。差分が小さければそのまま使用可能です。
テストの準備完了!暗い部屋で懐中電灯やランプを使い、光を片方のCdSセルからもう片方へゆっくり動かし、パネルが追従する様子を観察できます。片方のCdSセルを覆うと、パネルが反対側に振れるはずです。
ボーナス:スマホ充電機能
パネルの出力を活用したい場合、2.5V-5V DC-DCブーストコンバーターをパネルの出力リードに直接接続できます。これはArduino/ブレッドボードとは完全に独立した回路です。一般的なスマホは5Vで充電されますが、パネルが5Vを出力しても電流が少ない場合、バッテリー満充電時や日照不足時には充電できません。最も簡単な解決策は、パネルを増やすことです!
コード
Sun Tracker
// Sun Tracker Sketch
// 9gサーボ用(Arduinoから直接給電可能、外部電源不要)
// Fritzing図はGitHubリポジトリ参照
// https://github.com/nickalanf/Arduino--Projects
// シリアルモニタ部分はデバッグ用。動作確認後は無効化可能
// Sketch by FIELDING - 8/2/18
#include
Servo servo;
int eLDRPin = A0;
int wLDRPin = A1;
int eastLDR = 0;
int westLDR = 0;
int difference = 0;
int error = 10;
int servoSet = 130;
void setup() {
servo.attach(9);
Serial.begin(9600);
}
void loop() {
eastLDR = analogRead(eLDRPin);
westLDR = analogRead(wLDRPin);
if (eastLDR < 400 && westLDR < 400) {
while (servoSet <= 140 && servoSet >= 15) {
servoSet++;
servo.write(servoSet);
delay(100);
}
}
difference = eastLDR - westLDR;
if (difference > 10) {
if (servoSet <= 140) {
servoSet++;
servo.write(servoSet);
}
} else if (difference < -10) {
if (servoSet >= 15) {
servoSet--;
servo.write(servoSet);
}
}
Serial.print(eastLDR);
Serial.print(" - ");
Serial.print(westLDR);
Serial.print(" - ");
Serial.print(difference);
Serial.print(" - ");
Serial.print(servoSet);
Serial.print(" - ");
Serial.println(".");
delay(100);
}
回路図
製造プロセス
- 太陽電池:初期実験から現代フォトボルタイクスまで
- Arduinoで実現する低コスト・リアルタイム太陽光パネル監視システム
- ソーラートラッカー V2.0 – 高度なDIYソーラーパネル追尾システム
- IoT対応ソーラートラッカー:Arduinoによるスマートエネルギー管理
- Arduino UNOで作る太陽追尾式ソーラー発電システム – デュアルアックス完全ガイド
- SmartPostBox: IoT対応スマートメールボックスシステム (Sigfox + Arduino MKR Fox 1200)
- 高精度サーボ駆動ソーラートラッカー - 最大発電効率を実現する自動追尾プラットフォーム
- デュアルアクシスソーラートラッカー:自動/手動切替搭載の高効率太陽追尾システム
- Arduino Nanoで作るMPPTソーラーチャージャー: 太陽光発電の最大電力追従制御
- ソーラーパネル品質管理:最適性能を引き出す必須チェックポイント
- ソーラーパネル製造の全工程:高品質太陽光発電へのステップバイステップガイド