デュアルアクシスソーラートラッカー:自動/手動切替搭載の高効率太陽追尾システム
必要な部品と材料
| 部品 | 数量 | 備考 |
|---|---|---|
| Arduino UNO | 1 | 制御用マイコン |
| ロータリーポテンショメーター | 2 | 手動モード時のX/Y軸角度指定用 |
| LED(赤・青) | 各1 | モード表示:赤=手動、青=自動 |
| タクトスイッチ 12mm | 1 | 自動/手動モード切替ボタン |
| サーボモーター MG996R(高トルク) | 2 | パネルの水平・垂直回転駆動用 |
| フォトレジスター(CdSセル) | 4 | 自動モード用光センサー(上左・上右・下左・下右) |
| 10kΩ 抵抗 | 5 | フォトレジスタープルダウン、スイッチプルアップ等 |
| 220Ω 抵抗 | 2 | LED電流制限用 |
必要な工具
- はんだごて、はんだ、収縮チューブ、ニッパー、ドライバー
使用設計ツール・ソフトウェア
- Autodesk Tinkercad(回路シミュレーション・コード開発)
- Arduino IDE(書き込み)
プロジェクト概要
2017-2018年度の放課後クラブ「Young Hackers」で小学生たちがチーム制作したデュアルアクシス(2軸)ソーラートラッカーです。小型5Vソーラーパネルを水平・垂直2軸で回転させ、太陽光を常に正面に受けられるよう制御し、発電効率を最大化します。OpenSourceClassroomのプロジェクトをベースに、手動モード(ポテンショメーター操作)と自動モード(4分割フォトレジスターによる太陽追尾)の2モードをプッシュボタンで切替可能にしました。生徒たちはライン生産方式で配線・はんだ付け・ネジ締め等を分担し、数回のセッションで完成させました。
動作原理
手動モード(赤LED点灯)
2つのポテンショメーター(A0: 水平/X軸、A1: 垂直/Y軸)の値を0-1023から0-180°にマッピングし、それぞれ対応するサーボ(D9: 水平、D10: 垂直)に書き込みます。ユーザーがつまみを回してパネル向きを任意に設定可能。
自動モード(青LED点灯)
4つのフォトレジスター(A2: 左上、A3: 右上、A4: 左下、A5: 右下)で受光強度を測定。各センサーのばらつきをmap()関数で0-100の相対光量に正規化し、左右平均・上下平均を比較します。
- 左右制御:左平均 < 右平均 なら水平サーボを右へ(+1°)、逆なら左へ(-1°)。差が4%以上のときのみ動作(ハンチング防止)。
- 上下制御:上平均 < 下平均 なら垂直サーボを下へ(+1°)、逆なら上へ(-1°)。同様に差4%以上で動作。
ループごとに1ステップずつ追尾するため、滑らかに太陽を追従します。センサーごとの感度差(map()の入力範囲)は実測でキャリブレーションしています。
ソースコード
#include <Servo.h>
// 変数初期化
int mode = 0; // 0=手動, 1=自動
int buttonState = 0;
int prevButtonState = 0;
int topLeftLight = 0;
int topRightLight = 0;
int bottomLeftLight = 0;
int bottomRightLight = 0;
int LeftLight = 0;
int RightLight = 0;
int TopLight = 0;
int BottomLight = 0;
Servo servo_9; // 水平(左右)
Servo servo_10; // 垂直(上下)
void setup() {
pinMode(7, INPUT); // モード切替ボタン
pinMode(12, OUTPUT); // 手動モードLED(赤)
pinMode(11, OUTPUT); // 自動モードLED(青)
pinMode(A0, INPUT); // ポテンショメーター水平
pinMode(A1, INPUT); // ポテンショメーター垂直
pinMode(A2, INPUT); // フォトレジスター左上
pinMode(A3, INPUT); // フォトレジスター右上
pinMode(A4, INPUT); // フォトレジスター左下
pinMode(A5, INPUT); // フォトレジスター右下
servo_9.attach(9); // 水平サーボ
servo_10.attach(10); // 垂直サーボ
}
void loop() {
// モード切替ボタン検出(エッジ検出)
buttonState = digitalRead(7);
if (buttonState != prevButtonState) {
if (buttonState == HIGH) {
if (mode == 1) {
mode = 0;
digitalWrite(12, HIGH); // 赤ON
digitalWrite(11, LOW); // 青OFF
} else {
mode = 1;
digitalWrite(11, HIGH); // 青ON
digitalWrite(12, LOW); // 赤OFF
}
}
}
prevButtonState = buttonState;
delay(50); // デバウンス兼ループ間隔
if (mode == 0) {
// 手動モード:ポテンショメーター値を直接サーボ角度にマッピング
servo_9.write(map(analogRead(A0), 0, 1023, 0, 180));
servo_10.write(map(analogRead(A1), 0, 1023, 0, 180));
} else {
// 自動モード:フォトレジスター値を読み取り・正規化
topLeftLight = map(analogRead(A2), 50, 980, 0, 100);
topRightLight = map(analogRead(A3), 200, 990, 0, 100);
bottomLeftLight = map(analogRead(A4), 170, 970, 0, 100);
bottomRightLight = map(analogRead(A5), 250, 1000, 0, 100);
// 平均光量計算
TopLight = (topRightLight + topLeftLight) / 2;
BottomLight = (bottomRightLight + bottomLeftLight) / 2;
LeftLight = (topLeftLight + bottomLeftLight) / 2;
RightLight = (topRightLight + bottomRightLight) / 2;
// 水平追尾(左右差が閾値超過で1ステップ駆動)
if (abs(RightLight - LeftLight) > 4) {
if (RightLight < LeftLight) {
if (servo_9.read() < 180) servo_9.write(servo_9.read() + 1);
} else {
if (servo_9.read() > 0) servo_9.write(servo_9.read() - 1);
}
}
// 垂直追尾(上下差が閾値超過で1ステップ駆動)
if (abs(TopLight - BottomLight) > 4) {
if (TopLight < BottomLight) {
if (servo_10.read() < 180) servo_10.write(servo_10.read() - 1);
} else {
if (servo_10.read() > 0) servo_10.write(servo_10.read() + 1);
}
}
}
}
回路図
教育的ポイント・工夫
- センサーキャリブレーション:各フォトレジスターのバラツキを
map(analogRead, min, max, 0, 100)で吸収。実測最小・最大値をコードにハードコードしていますが、EEPROM保存や起動時自動キャリブレーションへ発展可能。 - ハンチング防止:光量差閾値(4%)を設け、微小変動での無駄な動作を抑制。
- モード切替のエッジ検出:ボタン押下瞬間のみモード変更し、長押しで連打しない設計。
- 視覚的フィードバック:赤/青LEDで現在モードを即座に把握可能。
- 協働製作:小学生でも役割分担(配線班・はんだ班・組立班・プログラム班)で複雑なシステムを完成できることを実証。
改善・拡張アイデア
- RTC(DS3231)を追加し、時刻・緯度経度から太陽位置を計算する「天文アルゴリズムモード」実装
- 発電電流・電圧をINA219等でモニタリングし、最大電力点追尾(MPPT)制御を導入
- 防水ケース化して屋外常設運用可能にする
- データロギング(SDカードやIoT送信)で発電量推移を記録・可視化
- ステッピングモーター+リミットスイッチ化で、より大型パネル・高精度追尾に対応
製造プロセス
- DHT11温湿度センサーで作る温度アラート – LEDとピエゾブザーで視覚/聴覚通知
- Arduinoでシンプルな障害物センサーを自作 – IR LEDとフォトダイオード入門
- ソーラートラッカー V2.0 – 高度なDIYソーラーパネル追尾システム
- IoT対応ソーラートラッカー:Arduinoによるスマートエネルギー管理
- Arduino Unoと1Sheeldで作る4x4x4 LEDキューブ – インタラクティブLEDプロジェクト
- Arduinoで高速・高精度RPM測定 – レーザーとIRセンサーによる新アルゴリズム
- 銅メッキプロジェクト:Arduino UNOで作るスマート電気メッキシステム
- Arduino UNOとEthernetシールドで太陽放射を測定する自作ピラノメーター
- デジタルロジックボードキット: 構成部品とセットアップガイド
- 高精度サーボ駆動ソーラートラッカー - 最大発電効率を実現する自動追尾プラットフォーム
- ソーラーパネル品質管理:最適性能を引き出す必須チェックポイント