#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);
}