Arduino UNO搭載デュアル軸ソーラートラッカー:DIYソーラーパネル追尾システム
部品と材料
| Arduino UNO | ×1 |
| SG90マイクロサーボモーター | ×2 |
| LDR(光依存抵抗)5 MΩ | ×4 |
| 抵抗 330 Ω | ×4 |
| ロータリーポテンショメーター(汎用) | ×1 |
| プッシュボタンスイッチ | ×2 |
| ミニソーラーパネル | ×1 |
必要な工具とソフトウェア
- Arduino IDE
- Parallax PLX-DAQ(Excelデータ取得用マクロ)
このプロジェクトについて
このプロジェクトは、ソーラートラッカーのオープンハードウェア/ソフトウェアテストベンチを提示します。Arduino Unoで制御されるデュアル軸ソーラートラッカーの試作機で、オープンソースのプロトタイピングプラットフォームを活用しています。4つのLDRセンサーと2つのサーボモーター(SM1、SM2)で自動的に太陽を追尾するか、ポテンショメーターで手動制御も可能です。また、Excelベースのバーチャル計装により、ソーラートラッカーのデータを記録・表示できます。使用ハードウェアは安価でコンパクト、汎用性が高く、学生が制御理論とその応用を理解するのに役立つよう設計されています。
機械設計
CATIAで設計された3D CADモデル(図2)は、PVパネル、左右・上下サーボモーター、4つのLDRセンサーで構成されます。水平軸には、上下サーボと平行にベアリングを固定して柔軟性を確保。2自由度(左右:東西、上下:南北)で動作します。LDRセンサーはPVパネルの四隅に配置し、上部に小さな穴を開けた暗いチューブ内に収納。これにより太陽光を検知しやすくし、放射集光器としても機能してトラッカーの堅牢性を高めています。
ハードウェアシステム
電子回路図(図3)では、自動モード時にマイコンがLDRセンサーのアナログ値(ピンA0-A3)をデジタル変換し、2つのPWM信号(ピン5、6)でサーボモーターを制御して太陽を追尾します。回転は方位角(東西)と仰角(南北)の2軸で行われます。手動モードではポテンショメーター(ピンA4)で2つのサーボを制御、プッシュボタン(ピン11)でポテンショメーターをどちらのサーボに割り当てるか切替、もう1つのプッシュボタン(ピン12)で自動/手動モードを切替えます。PV電圧はアナログピンA5で測定し、負荷抵抗が既知なのでPV電流を計算。PV電流、電圧、電力を時系列でコンピューターに送り、MS Excelでリアルタイム表示します。
LDRセンサー回路は分圧回路として設計。光強度の変化に比例して分圧出力電圧が変化します。分圧器の上側は5V、下側は0V、出力をマイコンのアナログ入力(例:A0)に接続。ADCが10ビットで0-1023のデジタル値に変換し、光レベルを判定します。分圧用抵抗は330 Ωを使用。
2つの180度サーボモーターを使用:左・右用にMG996R、上・下用にSG90。サーボの利点は、停止・回転・方向・速度をマイコン出力1本の低電流PWM信号で制御でき、ドライバー不要な点です。3線式ケーブル(電源2線、PWM1線)でArduino UNOに接続。
組み込みソフトウェア設計
Arduino Unoに組み込まれるソフトウェアで、以下の要件を満たします:
- 2モード切替: プッシュボタン(ピン12)で手動/自動モード切替
- 手動モード: ポテンショメーターで左右(東西)または上下(南北)サーボを制御。プッシュボタン(ピン11)で制御対象サーボを切替
- 自動モード: 図4のアルゴリズムを実行。方位角(垂直軸)では右側2つと左側2つのLDR平均値を比較し、左側が多ければ左・右サーボで左方向へ、右側が多ければ右方向へ回転。差分が[-10, 10]範囲内になるまで継続。仰角軸も同様。4つのLDR平均放射値が閾値(8:実験的に調整した夜間判定値)未満なら夜間と判断し、日の出位置(例:左右0度、上下30度)に復帰。`servo.write(angle)`関数で実現
- データ送信: PV電圧(ピンA5)から電流・電力を算出し、モード情報とともにUSB経由でコンピューターへ送信、MS Excelで表示
PLX-DAQによるExcelデータ取得
PLX-DAQ Excelマクロを使用してArduinoからExcelスプレッドシートへデータ取得。インストール後、PCに「PLX-DAQ」フォルダとショートカット「PLX-DAQ Spreadsheet」が作成されます。スプレッドシートを開き、PLX-DAQウィンドウで通信設定(ボーレート、ポート)を定義して「Connect」クリックでリアルタイムデータ収集・表示が開始されます。
試作機
図6は分解状態と組立状態のソーラートラッカー。全構造を木製プレートで製作し、全コンポーネント(LDR、Arduino Uno、サーボ、ポテンショメーター、プッシュボタン、小型PVパネル)を使用して手動/自動両モード対応のトラッカーを構築。図7はテストベンチ全体:ソーラートラッカー、バーチャル計装(PC)、テスト用人工光源。USBケーブルで接続し、PV電圧取得→制御演算→電流・電力算出→Excel表示の流れで動作。小型・柔軟・使いやすく、大規模実装前のアルゴリズム検証に最適です。
コード
ソーラートラッカーテストベンチ組み込みソフトウェア
// サーボモーターライブラリ
#include
// 変数初期化
int mode = 0; // 0=手動, 1=自動
int axe = 0; // 0=左右, 1=上下
int buttonState1 = 0;
int buttonState2 = 0;
int prevButtonState1 = 0;
int prevButtonState2 = 0;
int ldrtopr = 0; // 右上LDR
int ldrtopl = 1; // 左上LDR
int ldrbotr = 2; // 右下LDR
int ldrbotl = 3; // 左下LDR
int topl = 0, topr = 0, botl = 0, botr = 0;
Servo servo_updown; // 上下サーボ
Servo servo_rightleft; // 左右サーボ
int threshold_value = 10; // 測定感度閾値
void setup() {
Serial.begin(9600);
Serial.println("CLEARDATA"); // 既存データクリア
Serial.println("LABEL,t,voltage,current,power,Mode"); // 列見出し(PLX-DAQコマンド)
pinMode(12, INPUT); // モード切替ボタン
pinMode(11, INPUT); // 軸切替ボタン
pinMode(A4, INPUT); // ポテンショメーター
servo_updown.attach(5); // 上下動作用サーボ
servo_rightleft.attach(6); // 左右動作用サーボ
}
void loop() {
// PV電力計算
char Mode;
float volt = analogRead(A5) * 5.0 / 1023;
float voltage = 2 * volt; // 分圧比による電圧計算
float current = voltage / 20; // I = V / (R1+R2)
float power = voltage * current;
Serial.print("DATA,TIME,"); // PLX-DAQコマンド
Serial.print(voltage);
Serial.print(",");
Serial.print(current);
Serial.print(",");
Serial.print(power);
Serial.print(",");
// モード切替ボタン処理
buttonState1 = digitalRead(12);
if (buttonState1 != prevButtonState1) {
if (buttonState1 == HIGH) {
if (mode == 1) mode = 0;
else mode = 1;
}
}
prevButtonState1 = buttonState1;
delay(50);
if (mode == 0) {
Mode = 'M';
Serial.println(Mode);
manualsolartracker();
} else {
Mode = 'A';
Serial.println(Mode);
automaticsolartracker();
}
}
void automaticsolartracker() {
// 各LDRのアナログ値取得
topr = analogRead(ldrtopr);
topl = analogRead(ldrtopl);
botr = analogRead(ldrbotr);
botl = analogRead(ldrbotl);
// 平均値計算
int avgtop = (topr + topl) / 2;
int avgbot = (botr + botl) / 2;
int avgleft = (topl + botl) / 2;
int avgright = (topr + botr) / 2;
// 差分計算
int diffelev = avgtop - avgbot; // 仰角差分
int diffazi = avgright - avgleft; // 方位角差分
// 左右動作
if (abs(diffazi) >= threshold_value) {
if (diffazi > 0) {
if (servo_rightleft.read() < 180) {
servo_rightleft.write(servo_updown.read() + 2);
}
}
if (diffazi < 0) {
if (servo_rightleft.read() > 0) {
servo_rightleft.write(servo_updown.read() - 2);
}
}
}
// 上下動作
if (abs(diffelev) >= threshold_value) {
if (diffelev > 0) {
if (servo_updown.read() < 180) {
servo_updown.write(servo_rightleft.read() - 2);
}
}
if (diffelev < 0) {
if (servo_updown.read() > 0) {
servo_updown.write(servo_rightleft.read() + 2);
}
}
}
}
void manualsolartracker() {
buttonState2 = digitalRead(13); // 注意:元コードはピン13だが、セットアップではピン11設定
if (buttonState2 != prevButtonState2) {
if (buttonState2 == HIGH) {
if (axe == 1) axe = 0;
else axe = 1;
}
}
prevButtonState2 = buttonState2;
delay(50);
if (axe == 0) {
// 左右動作制御
servo_rightleft.write(map(analogRead(A4), 0, 1023, 0, 180));
} else {
// 上下動作制御
servo_updown.write(map(analogRead(A4), 0, 1023, 0, 180));
}
}
回路図
詳細な回路図(ZIPファイル)が提供されています。ダウンロードしてご確認ください。
製造プロセス
- Arduinoデジタルダイス: LCD表示の乱数ジェネレーター自作
- DIY Arduino USBゲームコントローラー - 高性能ゲームパッドを自作
- ソーラートラッカー V2.0 – 高度なDIYソーラーパネル追尾システム
- Pixel Chaser: Arduino Nanoで作るワンタップLEDゲーム
- IoT対応ソーラートラッカー:Arduinoによるスマートエネルギー管理
- Arduinoで作る斥力式磁気浮上装置: シンプル回路とDIYガイド
- Alexa対応Arduinoホームコントローラー:音声でスマートホーム自動化
- Arduino Nanoで作るNeoPixelマトリックス版Pongゲーム
- Arduino UNOとEthernetシールドで太陽放射を測定する自作ピラノメーター
- DIY LEDルーレットゲーム – Arduino Nanoで作る1人用アーケードゲーム
- Arduino UNOで作る太陽追尾式ソーラー発電システム – デュアルアックス完全ガイド