0

マイクロコントローラーはAVRであり、その中のプロセッサーはATMEGA8です。黒い色を踏襲した作品を書きました。それは次のようなものです:

#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
}
}

私はエッジ回避者のために書き込もうとしています。黒色を検出するのと同じセンサーがあります。しかし今、それらのセンサーはテーブルの上を移動している間、穴を避けなければなりません。私はこれをどのように行うことができるかについて決めることができません。

注:下に何もない場合、センサーはピットを検出できます。しかし、どうすればコードの記述に問題がありますか。

4

1 に答える 1

0

EdgeAvoiderには多くの解決策があります。私が見た実装の1つは-

説明 -

  • どれも(左と右)黒(黒=エッジ、白=テーブルの表面)でない場合は、前進し続けることができます。
  • いずれか/両方が黒の場合は、少し後退してから(注意:これは注意が必要です。後退する場合も、落下してしまう可能性があります)、方向を変える必要があります。

適切に機能させるには、遅延を試す必要があります。

これらは以下に必要な値です(構成に依存するため、以前は省略していました)-

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)

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;
}
于 2012-09-23T07:35:48.373 に答える