首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >边缘规避程序的逻辑

边缘规避程序的逻辑
EN

Stack Overflow用户
提问于 2012-09-23 07:18:55
回答 1查看 2.8K关注 0票数 0

单片机采用AVR,处理器采用ATMEGA8。我写了一篇遵循黑色的文章。就像:

代码语言:javascript
复制
#include<avr/io.h>
#include<util/delay.h>
int main()
{
int rs,ls; // denotes the right sensor and left sensor respectively 
DDRC=0x00; // DENOTES THAT WE TAKE INPUT FROM THE SENSER
DDRB=0xFF; // DENOTES THAT PORT IS MEANT FOR THE OUTPUT FROM THE MOTOR
while(1) {
 ls=PINC&0b0000001; // last bit on
 rs=PINC&0b0001000; // 1st bit on

 if((ls==0b0000001)&(rs==0b0001000))
  PORTB=0b00010010; // forward
 if((ls==0b0000001)&(rs==0b0000000))
  PORTB=0b00000010; // right
 if( (ls==0b0000000) & (rs==0b0001000))
  PORTB=0b00010000; // left
 if((ls==0b0000000)&(rs==0b0000000) )
  PORTB=0b00010010; // stop
}
}

我正努力为边缘者写作。它有同样的传感器来检测黑色。但是现在那些感应器在桌子上移动的时候必须避开一个坑。我无法决定如何做这件事。

注意:传感器能够检测坑下的任何东西。但是我怎么会有问题写代码。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2012-09-23 07:35:48

边缘攻击可以有很多解决方案。我见过的一个实施方案是-

解释-

  • 如果没有(左和右)是黑色(黑色=边缘,白色=桌面),你可以继续前进。
  • 如果任何/两者都是黑色的,你需要后退一点(注意:这是很棘手的,在后退的时候,你可能会摔倒),然后改变方向。

你需要尝试延迟,以获得适当的工作。

以下是所需的值(我之前省略了它们,因为它们依赖于配置)-

代码语言:javascript
复制
int move_backward = 0b00000110;
int right_turn = 0b00001010;
int move_forward = 0b00001001;
int left_turn = 0b00000101;

int left_sensor_on = 0b0010000;
int right_sensor_on = 0b0100000;
int left_sensor_off = 0b0000000;
int right_sensor_off = 0b0000000;

下面的代码应该在while (1)内部

代码语言:javascript
复制
left_sensor = (PINC & 0b0000001); // This depends upon your configuration
right_sensor = (PINC & 0b0001000); // So I have used, the one from your code

if ((left_sensor==left_sensor_off) & (right_sensor==right_sensor_off))
{
    PORTB = move_backward;       //move backward
    _delay_ms(50);
    PORTB=right_turn;           //take a right turn
    _delay_ms(30);
    left_sensor = 0;
    right_sensor = 0;
}
if ((left_sensor==left_sensor_on) & (right_sensor==right_sensor_on))
{
    PORTB = move_forward;        //move forward
    left_sensor = 0;
    right_sensor = 0;
} 
if ((left_sensor==left_sensor_off) & (right_sensor==right_sensor_on))
{
    PORTB = move_backward;
    _delay_ms(50);
    PORTB = right_turn;
    _delay_ms(30);
    left_sensor = 0;
    right_sensor = 0;
}

if ((left_sensor==left_sensor_on) & (right_sensor==right_sensor_off))
{
    PORTB = move_backward;
    _delay_ms(50);
    PORTB = left_turn;
    _delay_ms(30);
    left_sensor = 0;
    right_sensor = 0;
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/12550480

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档