Arduino 双轴太阳能跟踪器:自动/手动模式 + Excel 实时数据采集
项目概述
本项目实现了一款低成本、开源的双轴太阳能跟踪测试平台。核心控制器为 Arduino Uno,配合 4 个 LDR 光敏电阻与 2 个舵机 (SG90 + MG996R) 实现方位角 (东西) 与俯仰角 (南北) 双轴跟踪。支持自动跟踪与电位器手动模式切换,并通过 PLX-DAQ 宏将电压、电流、功率实时写入 Excel 表格,适合教学演示与算法验证。
核心组件
- Arduino UNO ×1
- SG90 微型舵机 ×1 (俯仰轴) / MG996R 金属齿舵机 ×1 (方位轴)
- LDR 光敏电阻 (5 MΩ) ×4:四角布置,配套深色导光管抗干扰
- 330 Ω 电阻 ×4:LDR 分压电阻
- 旋转电位器 (10 kΩ) ×1:手动模式输入
- 按键开关 ×2:模式切换 / 轴选择
- 迷你太阳能板 ×1:负载测试用
机械结构设计
- CATIA 设计 3D 模型,木质板材激光切割/雕刻组装
- 水平轴 (方位) 由 MG996R 驱动,配合轴承减摩
- 垂直轴 (俯仰) 由 SG90 驱动,范围约 0–180°
- LDR 置于面板四角,深色管限制视场角,增强方向性
电路原理
LDR 分压电路
每路 LDR 与 330 Ω 电阻串联跨接 5V-GND,中点接 Uno A0–A3。光照越强 → LDR 电阻越小 → 分压电压越高 → ADC 值越大。
舵机驱动
PWM 信号线直连 Uno D5 (俯仰) 与 D6 (方位),电源另接外部 5V/2A 以上电源(Uno 5V 引脚电流不足)。
模式切换与轴选择
- D12 按键:自动/手动模式切换
- D11 按键:手动模式下切换控制轴 (方位/俯仰)
- A4 电位器:手动模式下映射 0–1023 → 0–180°
PV 电压/电流采集
A5 分压采集面板电压 (分压比 1:2),已知负载电阻 20 Ω,计算电流 I = V/20,功率 P = V×I。
自动跟踪算法
- 读取 4 路 LDR 值:
topR, topL, botR, botL - 计算平均值:
avgTop = (topR + topL)/2avgBot = (botR + botL)/2avgLeft = (topL + botL)/2avgRight = (topR + botR)/2
- 差值判断:
diffAzi = avgRight - avgLeft(方位)diffEle = avgTop - avgBot(俯仰)
- 死区阈值
threshold = 10:|diff| < 10 不动作,防抖动 - 步进 2° 移动舵机,直到差值落入死区
- 夜间检测:四路平均 < 8 → 复位至日出位置 (方位 0°, 俯仰 30°)
PLX-DAQ Excel 实时记录
- 下载安装 PLX-DAQ,生成
PLX-DAQ Spreadsheet快捷方式 - 打开表格,设置波特率 9600、对应 COM 口,点击 Connect
- Arduino 发送格式:
DATA,TIME,voltage,current,power,Mode - Excel 实时追加行,自动生成时序图表
代码关键片段
自动跟踪核心
void automaticsolartracker() {
topr = analogRead(A0); topl = analogRead(A1);
botr = analogRead(A2); botl = analogRead(A3);
int avgtop = (topr + topl) / 2;
int avgbot = (botr + botl) / 2;
int avgleft = (topl + botl) / 2;
int avgright = (topr + botr) / 2;
int diffazi = avgright - avgleft;
int diffelev = avgtop - avgbot;
if (abs(diffazi) >= THRESHOLD) {
if (diffazi > 0 && servo_rightleft.read() < 180)
servo_rightleft.write(servo_rightleft.read() + 2);
else if (diffazi < 0 && servo_rightleft.read() > 0)
servo_rightleft.write(servo_rightleft.read() - 2);
}
if (abs(diffelev) >= THRESHOLD) {
if (diffelev > 0 && servo_updown.read() < 180)
servo_updown.write(servo_updown.read() - 2);
else if (diffelev < 0 && servo_updown.read() > 0)
servo_updown.write(servo_updown.read() + 2);
}
}
手动模式
void manualsolartracker() {
if (axe == 0) // 方位轴
servo_rightleft.write(map(analogRead(A4), 0, 1023, 0, 180));
else // 俯仰轴
servo_updown.write(map(analogRead(A4), 0, 1023, 0, 180));
}
教学与科研价值
- 直观演示 PID 替代的阈值控制策略
- 可替换算法验证 MPPT、模糊控制、神经网络等高级策略
- Excel 实时数据便于课堂演示功率-角度特性曲线
- 低成本 (<$50) 适合学生分组实验
改进建议
- 引入 PID 控制器消除稳态误差与超调
- 加入 GPS+时间算法实现“天文跟踪”模式,无需 LDR
- 使用步进电机+减速机替代舵机,提升扭矩与定位精度
- 增加风速/温度传感器,研究环境因素对发电效率影响
制造工艺
- Arduino 数字骰子:LCD 显示随机点数的电子骰子
- DIY Arduino USB 游戏手柄 — 自制高性能游戏手柄
- 太阳能跟踪器 V2.0:进阶 DIY 光伏自动追日系统
- Pixel Chaser:Arduino Nano 单键 NeoPixel 追逐小游戏
- 物联网双轴太阳能跟踪器:基于 Arduino 与 Cayenne 的智能能源管理
- Arduino 简易排斥式磁悬浮:电路与 DIY 指南
- Alexa 语音控制 Arduino 智能家居中枢:基于 Yun + PubNub + AWS Lambda 全栈实现
- Arduino Nano 驱动 NeoPixel 矩阵:自制霓虹乒乓游戏
- Arduino UNO + 以太网盾板实现低成本太阳辐射测量仪(热电堆原理)
- DIY LED 轮盘赌游戏机 —— Arduino Nano 打造单人桌面街机
- DIY 双轴太阳能跟踪系统——基于 Arduino UNO
- Arduino 智能安防系统:超声波测距 + 舵机扫描 + 声光报警