在本文中,您将逐步学习如何使用 光敏电阻和舵机制作双轴太阳能跟踪器 Arduino 项目。在这个项目中,我们将使用一些光敏传感器来跟踪阳光,并将利用舵机将太阳能电池板引导到可提高其效率的区域。
此项目所需的组件
序号 | 部件名称 | 描述 | 数量 | 备注 |
---|---|---|---|---|
1 | Arduino UNO | Arduino UNO R3 | 1 | |
2 | 舵机 | 微型舵机 - SG90 | 2 | |
3 | 光敏电阻 | LDR(光敏电阻)传感器 | 4 | |
4 | 电阻 | 10k欧姆电阻 | 4 | |
5 | 面包板 | 迷你面包板 | 1 |
光敏电阻的工作原理
光敏电阻。实际上,它是一种光敏设备。当光线照射到它上面时,电阻会减小。在这个项目中,我们使用 4 个光敏电阻来检测阳光。
根据上方两个光敏电阻和下方两个光敏电阻的读数差额,调整垂直方向的舵机角度,根据左边两个光敏电阻和右面两个光敏电阻的读数差额调整水平方向的舵机角度,从而更好地放置太阳能电池板,以最大限度地提高其效率。
接线图
注意
1.光敏电阻之间要使用隔断将各个光敏电阻之间分隔开来。
2.在实施项目时应该注意调试光敏电阻之间的距离。
代码
#include <Servo.h>
Servo horizontal; //水平方向电机
int servoh = 180;
int servohLimitHigh = 175;
int servohLimitLow = 5;
// 65 degrees MAX
Servo vertical; //垂直方向电机
int servov = 45;
int servovLimitHigh = 60;
int servovLimitLow = 1;
// LDR pin connections
// name = analogpin;
int ldrlt = A0; //LDR top left
int ldrrt = A2; //LDR top rigt
int ldrld = A1; //LDR down left
int ldrrd = A3; //ldr down rigt
void setup() {
horizontal.attach(9);//水平方向舵机接9号管脚
vertical.attach(10);//垂直方向舵机接10号管脚
horizontal.write(180);//初始化水平方向舵机为180度
vertical.write(45);//初始化垂直方向舵机为45度
delay(2500);
}
void loop() {
int lt = analogRead(ldrlt); // 上左光敏电阻
int rt = analogRead(ldrrt); // 上右光敏电阻
int ld = analogRead(ldrld); // 下左光敏电阻
int rd = analogRead(ldrrd); // 下右光敏电阻
int dtime = 10; //检测时间
int tol = 90;
int avt = (lt + rt) / 2; // 顶部两个光敏电阻读数平均值
int avd = (ld + rd) / 2; // 下方两个光敏电阻读数平均值
int avl = (lt + ld) / 2; // 左边两个光敏电阻读数平均值
int avr = (rt + rd) / 2; // 右边两个光敏电阻读数平均值
int dvert = avt - avd; // 检测上下两组光敏电阻读数差异,这个差异决定了垂直舵机的转向角度
int dhoriz = avl - avr;// 检测左右两组光敏电阻读数差异,这个差异决定了水平舵机的转向角度
if (-1 * tol > dvert || dvert > tol)
{
if (avt > avd)
{
servov = ++servov;//顶部传感器值大于底部值,舵机角度增加。
if (servov > servovLimitHigh)
{
servov = servovLimitHigh;//转动角度大于最大值时角度设置为最大值。
}
}
else if (avt < avd)
{ servov = --servov;//顶部传感器值小于底部值,舵机角度减小
if (servov < servovLimitLow)
{
servov = servovLimitLow;//转动角小于最大值时设置为最小值。
}
}
vertical.write(servov);//转动舵机。
}
if (-1 * tol > dhoriz || dhoriz > tol) // check if the diffirence is in the tolerance else change horizontal angle
{
if (avl > avr)
{
servoh = --servoh;
if (servoh < servohLimitLow)
{
servoh = servohLimitLow;
}
}
else if (avl < avr)
{
servoh = ++servoh;
if (servoh > servohLimitHigh)
{
servoh = servohLimitHigh;
}
}
else if (avl = avr)
{
delay(5000);
}
horizontal.write(servoh);
}
delay(dtime);
}