首先要区分踩线和十字路口。如果一边传感器有效后,经过1/2线宽的行程另一边的传感器还没有有效,说明已经踩线了,进行方向调整。如果在1/2线宽内另一边传感器也有效了,说明到达十字路口,这时左转,直到右边的传感器无效,说明已经过了十字路口。然后继续进行防踩线的行走方式。
我也是初次做小车
上面的是我做玩后的一些见解
你这个可以这样
你的小车每到一个分岔口(“T”或者“十”型路口)就随机选择一个寻迹方向(路线),并且把第一个寻迹值保存起来(就是记住这次小车是往哪里走的,防止下次走重复的路)。
小车走下去会有2种情况:
1,小车此次走的路线正确 继续前走,值到下一个路口
2,小车走了一段路后没路了,又分为2种情况:
(1),小车走错路了,得退回去,这时候小车可以后退寻迹,直到返回分岔口,再重复上面过程(注意,此时小车选择路线时要和前面保存起来的值进行对比,不可以再走小车前面走过的错路了,并且还得把这次跑的方向保存,下面小车如果在这个点在此返回了,小车选择路线时就要排除上面2次的路线了,以此类推)
(2),小车到终点了,我看了你们的跑道情况,终点前面有2个断点,可以利用这个区分小车是到了终点还是跑错路了
程序可能有点复杂,祝你们成功
程序需要结合硬件,不同硬件程序也不一样,就算硬件一样,连线方法不同程序也不一样。程序所实现的功能也不同,所以就算有程序,移植性也比较差。下面是我的小车黑白循迹的程序,包含前行转弯等,希望能帮到你
#include <reg52h>
sbit z0 = P1^0;
sbit z1 = P1^1;
sbit y0 = P1^2;
sbit y1 = P1^3;
sbit x = P1^4;
sbit m = P3^2;
sbit zm0 = P2^0;
sbit zm1 = P2^1;
sbit ym0 = P2^2;
sbit ym1 = P2^3;
unsigned int line=0,j=0;
void turnright()
{
ym0=1;
ym1=1;
zm0=1;
zm1=0;
}
void turnleft()
{
ym0=0;
ym1=1;
zm0=1;
zm1=1;
}
void zuozq()
{
ym0=0;
ym1=1;
zm0=0;
zm1=1;
}
void youzq()
{
ym0=1;
ym1=0;
zm0=1;
zm1=0;
}
void qianxing()
{
ym0=0;
ym1=1;
zm0=1;
zm1=0;
}
void stop()
{
ym0=1;
ym1=1;
zm0=1;
zm1=1;
}
void xunji()
{
if(z1==1&& y0==1) //检测到黑线为低电位
qianxing();
if(z1==0&& y0==0)
qianxing();
if(z1==0&& y0==1)
turnleft();
if( y0==0&&z1==1)
turnright();
// if(z0==0&& y1==1)
// turnleft();
// if( y0==0&&z0==1)
// turnright();
}
void yanshi(unsigned int i)
{
unsigned int j;
while(--i)
for(j=0;j<12000;j++);
}
void wzhongduan()
{
IT0=1;
EA=1;
EX0=1;
}
void youzhuan90()
{
youzq();
yanshi(3);
while(1)
{
youzq();
if(x==0)
break;
}
}
void case2()
{
youzq();
yanshi(5);
while(1)
{
if(m==0)
{
stop();
yanshi(10);
//
break;
}
}
zuozq();
yanshi(5);
while(1)
{
if(x==0)
{
qianxing();
yanshi(5);
break;
}
}
}
void zhuanshen()
{
EA=0;
while(1)
{
youzq();
yanshi(2);
if(m==0)
{
yanshi(2);
j++;
}
if(j>=4)
if(x==0)
{
xunji();
yanshi(3);
break;
}
}
EA=1;
}
void main()
{
wzhongduan();
while(1)
{
switch(line)
{
case 2:EA=0; case2();EA=1;break;
case 4:EA=0; case2();EA=1;break;
case 7: EA=0;youzhuan90();youzhuan90();youzhuan90();youzhuan90();EA=1;break;
case 10:EA=0; case2();EA=1;break;
case 12:EA=0; case2();EA=1;break;
case 15: EA=0;youzhuan90();youzhuan90();youzhuan90();youzhuan90();EA=1;break;
default :xunji();
}
}
}
void w0 () interrupt 0
{
line++;
}
通常循迹小车前方具有两只光电管,而循迹的原理是利用所谓印迹和道路的光线反差来实现控制。比方印迹为黑色,两只光电管全部照射在黑色印迹上面证明车辆循迹正常两个车轮同等转速。照射的左面光电管偏差出现照射到白色路面,则控制反馈令左面车轮加速,其作用相当于向右转。当两个光电管全部接收黑色信号,又回到两个车轮等速前进。右面光电管照射到白色路面,右面车轮加速,作用相当于向左转。通过两只光电管的反复不断修正实现循迹作用。假如想看书学习,近年的无线电杂志具有大量的资料。
PWM1和PWM2还有PWMC1在定义时在=号两边有隐字符,导致定义失败。
bit RunFlag如果不可以用,可以将bit改成char试试。
由程序分析PWM1和PWM2不是直接控制电机的,它们可以输出脉宽调制信号,由定时器T0和T1控制脉宽,如果有电路图会分析准确一点。
>
寻迹小车一般都有光电引导头,他用的是物理学原理,黑色在物理的意思上是吸收一切光线(白色的意思是反射任何光线)。小车下面的引导头(有发射和接收两个头,一般是一体式的)会发射光线,当遇到白色物体时,光线被反射回来,然后接收头接收,输出高电平,这样小车就判断为白色。如果遇到的是黑线,则不会被反射,接收头无法接收到信号,输出低电平,小车就知道是黑色。后面就很简单了,小车上的引导头往往是并联多路,比如五路或者三路,只要让中间的引导头一直跟着黑线走,一直寻迹黑色就可以了。而最外边的两个不能碰到黑线就好。如果偏了,小车就用单片机程序调整一下电机的控制,让两侧电机加速或者减速,或者一加速一减速(转弯能力更强),小车就转弯,调整一下方向就好了。
以上就是关于如何让循迹小车走“8”字型,主控为单片机全部的内容,包括:如何让循迹小车走“8”字型,主控为单片机、寻迹小车后退过程中继续循迹、单片机小车C语言行走程序,注释等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)