发表日期:2017-03-13 14:44:09文章编辑:信息管理员浏览次数: 标签:亮宁机器人
本程序包括三项功能:巡线,测光值和测试电机连线是否正确。
一个程序中书写多项功能函数,需要使用哪个就屏蔽暂时不用的函数。具体分析看程序中的注释语句。
整个程序运用于轨迹赛已足够!
#include <LNDZ.h>
int ll,l,r,rr,m,n,t=0;
lc lcd;
void init()
{
B_start(); //按键(K2)启动程序
lcd.begin(16,2); //初始化液晶屏,为测试程序做准备,巡线时屏蔽
lcd.bg(1); //打开屏幕背景光,综线时关闭
//motor(30,30); //五眼巡线时需要这句,给机器人初始速度
// delay(500); test(); //0.5秒延时,隔离上次按键动作,测试光值
}
void check() //巡线时不断测量光值
{
ll=AR(3)>644; //各光值分界点。时间和空间改变,请重新测量
l=AR(1)>605;
m=0; // =AR(0)>610; //四眼与五眼的不同之处
r=AR(2)>622;
rr=AR(4)>640;
n=ll+l+m+r+rr; //求和简化条件的书写
}
void find() //巡线函数
{
check(); //函数中调用测值函数
motor(30,30); //四眼巡线时需要,五眼巡线去掉这句。轨迹较直时,加大速度
if (ll==1) motor(-70,70); //轨迹较直时减小速度
if (l==1) motor(0,50); //机器人左右摇摆厉害时,减小速度
//if (m==1) motor(50,50); //五眼巡线时需要
if (r==1) motor(50,0);
if (rr==1) motor(70,-70);
}
void display(int ll1,int l1,int m1,int r1,int rr1,char c)
{
lcd.clear(); //清除上次的显示内容
lcd.print(c);
lcd.print(ll1);lcd.print(" "); lcd.print(l1);lcd.print(" ");
lcd.print(r1);lcd.print(" "); lcd.print(rr1);
//lcd.setCurrsor(1,1); lcd.print(m1); //五眼时用,注意顺序,这个是0端口号的值
delay(300);
}
void test() //测光值函数
{
int ll_w,l_w,m_w,r_w,rr_w; //定义白色区临时变量名
int ll_b,l_b,m_b,r_b,rr_b; //定义黑色区临时变量名
while (DR(48)==1) //没有按下K2时,48号口为1
{ //按下K2前,先放白色区域内
ll_w=AR(3); l_w=AR(1); m_w=AR(0); r_w=AR(2); rr_w=AR(4);
display(ll_w,l_w,m_w,r_w,rr_w,’w’); //W表示没白色值
}
delay(500); //防止按键被重复读取
while (DR(48)==1) //五眼均放黑色区上
{
ll_b=AR(3); l_b=AR(1); m_b=AR(0); r_b=AR(2); rr_b=AR(4);
display(ll_b,l_b,m_b,r_b,rr_b,’b’); //B表示没黑色值
}
ll=(ll_w+ll_b)/2;l=(l_w+l_b)/2; //用机器人求平均值
r=(r_w+r_b)/2;rr=(rr_w+rr_b)/2;
//r=(m_w+m_b)/2;
display(ll,l,m,r,rr,’p’); //测试完成 P表示平均值
}
void motor_test()
{
motor(30,0); delay(1000); //左轮正转,方向反,红黑线对换;左右反,则左右双线对换
motor(-30,0); delay(1000);
motor(0,30); delay(1000);
motor(0,-30); delay(1000);
}
void way() //十字路口处理函数
{
if (n>2) //简单判断十字路口的条件
{
t++; //路口计数
if (t==1)
{
motor(50,50) ;delay(80); //1号路口直行,时间尽量短,能越过路口即可
}
if (t==2)
{
motor(-50,50);delay(300); //2号路口左拐,转弯时间长短以机器人能转到能找到
} //下一条垂直的线为止,右转类似
if (t==10)
{
motor(0,0); while(1); //delay(9000); //用两句中一句,可防止机器人重新启动
}
}
}
void repeat()
{
find(); //调用巡线函数,需要使用某函数时,就去掉前面的“//”。
//motor_test(); //调用测试电机函数
way();
}