“向日葵”的另一应用——追光机器人
在正常的室内环境光下,用手电筒打一束光,产生光源并移动,这时“向日葵”就会跟着你的手电筒转。
其原理类似上述的太阳能收集器,最大的区别在于此处不再做4个传感器的均值,而是将横竖方向的光传感器两两求差。当一端的感应数值小于另一端时,就会向这一端偏转。我们不必放上太阳能电池板,可以随个人喜好在板上固定任何东西,比如插朵花、放个娃娃上去等,这样就能使机器人看起来更加生动了。
追光机器人参考代码
#include
#include
#include
Servo DF15MG1;
Servo DF15MG2;
Metro receMetro=Metro(20);
Metro proceMetro=Metro(30);
Metro transMetro=Metro(40);
int sumab,sumcd,pos1=90,pos2=90; //定义变量
int vala,valb,valc,vald;
void ready()
{
DF15MG1.write(90); //设定舵机的初始位置为90°
DF15MG2.write(90);
}
void setup()
{
DF15MG1.attach(3);
DF15MG2.attach(11);
}
void loop()
{
if(receMetro.check()==1) //控制数据采集、处理、输出时间
{
receMetro.interval(10);
receivedata();
}
if(proceMetro.check()==1)
{
proceMetro.interval(15);
processdata();
}
if(transMetro.check()==1)
{
transMetro.interval(20);
transmitdata();
}
}
void receivedata()
{
vala=analogRead(0); //设定光传感器模拟数据读取端口
valb=analogRead(1);
valc=analogRead(2);
vald=analogRead(3);
}
void processdata()
{
sumab=vala-valb; //横竖光传感器读入数值求差
sumcd=valc-vald;
if(sumab<-10) //a、b传感器求差,要根据环境光的不同设定相应的值
{
pos1=pos1+1;
pos1=constrain(pos1,60,140); //舵机1的角度设定在60°到140°
}
else if(sumab>10)
{
pos1=pos1-1;
pos1=constrain(pos1,60,140);
}
if(sumcd<-20) //c、d传感器求差,要根据环境光的不同设定相应的值
{
pos2=pos2+1;
pos2=constrain(pos2,0,180); //舵机1的角度设定在0°到180°
}
else if(sumcd>20)
{
pos2=pos2-1;
pos2=constrain(pos2,0,180);
}
}
void transmitdata()
{
DF15MG1.write(pos1); //舵机旋转角度输出
DF15MG2.write(pos2);
}