我在Line Follower中使用Atmega16A和L293D电机驱动器。我只使用代码来跟踪白线,但现在我希望它遵循黑线。
我首先认为它们是通过颜色链接我尝试更改颜色代码,但是在更改颜色代码时没有取得任何结果。 这是代码:
#include <avr/io.h>
#include "util/delay.h"
#define s1 ((PINA)&(0x01))
#define s2 ((PINA)&(0x02))
#define ms ((PINA)&(0b00000100))
void forward()
{
PORTD=0b00001001;
}
void left()
{
PORTD=0b00000001;
}
void right()
{
PORTD=0b00001000;
}
void follow()
{
if((ms!=0)&&(s1==0)&&(s2==0))
{
forward();
} else if (s1!=0)
{
left();
}
else if (s2!=0)
{
right();
}
//
// else if((ms==0)&&(s1==0)&&(s2==0))
// {
// right();
// // _delay_ms(150);
//
// }
else if((ms!=0)&&(s1!=0)&&(s2==0))
{
forward();
}
else if((ms!=0)&&(s1==0)&&(s2!=0))
{
forward();
}
else if((ms!=0)&&(s1!=0)&&(s2!=0))
{
forward();
}
else if (ms==0)
{
if (s1!=0)
{
while(ms==0)
{
left();
}
}
else if (s2!=0)
{
while(ms==0)
{
right();
}
}
}
else
{
forward();
}
}
int main(void)
{
DDRA = 0b00000000;
PORTA=0xFF;
DDRD = 0b11111111;
while(1)
{
follow();
}
}
答案 0 :(得分:0)
首先,更改宏定义如下: -
#define s1 ((PINA)&(0x01));
#define s2 (((PINA)>>1)&(0x01));
#define ms (((PINA)>>2)&(0x01));
然后在linefollow()比较中使用这些宏。现在,如果s1,s2或ms扩展&amp;分别在该传感器下输出0/1然后黑/白表面。 (这也取决于所使用的线传感器的类型。)
正如您所说,您当前的代码是黑色表面上的白线跟随,然后只需将0更改为1,反之亦然,白色表面上的黑线跟随。
例如。
if((ms!=1)&&(s1==1)&&(s2==1))
{
forward();
} else if (s1!=1)
{
left();
}
else if (s2!=1)
{
right();
}
顺便说一下,我还建议你摆脱多余的if-else案例,因为你的代码似乎包含了一些。快乐的机器人制作。 :)