0

我在我的 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();
    }

 }
4

1 回答 1

0

首先,像这样更改宏定义:-

#define s1 ((PINA)&(0x01));
#define s2 (((PINA)>>1)&(0x01));
#define ms (((PINA)>>2)&(0x01));

然后在 linefollow() 比较中使用这些宏。现在,如果 s1、s2 或 ms 扩展并输出 0/1,则分别在该传感器下方的黑色/白色表面。(这也取决于所使用的线传感器的类型。)

正如您所说,您当前的代码是用于黑色表面上的白线,然后只需将 0 更改为 1,反之亦然,用于白色表面上的黑线。

例如

if((ms!=1)&&(s1==1)&&(s2==1))
{
    forward();
} else if (s1!=1)
{
    left();
}
else if (s2!=1)
{
    right();
}

顺便说一句,我还想建议您摆脱多余的 if-else 情况,因为您的代码似乎包含一些情况。快乐的机器人制作。:)

于 2018-02-10T21:44:59.700 回答