정보나눔

오픈소스하드웨어 프로젝트에 대한 다양한 정보를 나누는 공간입니다.

라인트레이서랑 반대로
최장우 | 2016-12-10

라인트레이서랑 반대로 검은선 안에서는 랜덤하게 움직이다가

검은선 밖으로는 못나가게끔 하고 싶습니다.

 

#include <SoftwareSerial.h> //시리얼 통신 라이브러리 호출

//모터 PIN 설정
#define LEFT_A1 4 //왼쪽 바퀴
#define LEFT_B1 5 //왼쪽 바퀴
#define RIGHT_A2 6 //오른쪽 바퀴
#define RIGHT_B2 7 //오른쪽 바퀴

void setup() {
  Serial.begin(9600);   //시리얼모니터

  //모터 핀모드 설정
  pinMode(LEFT_A1, OUTPUT);
  pinMode(RIGHT_A2, OUTPUT);
  pinMode(LEFT_B1, OUTPUT);
  pinMode(RIGHT_B2, OUTPUT);
}

void loop() {

 

  if (analogRead(A0) < 500 && analogRead(A1) < 500 && analogRead(A2) < 500) {

    int rnd = random(0, 2);
    if (rnd == 0) {
      Serial.println("right");
      right();
    } else {
      Serial.println("left");
      left();
    }
    Serial.println("forward");
    forward();
    delay(300);
  }
  else if (analogRead(A0) > 500 && analogRead(A1) < 500 && analogRead(A2) < 500) {
    Serial.println("right");
     stop();
    backward();
    right();
  }
  else if (analogRead(A0) > 500 && analogRead(A1) > 500 && analogRead(A2) < 500) {
    Serial.println("right");
    stop();
    backward();
    right();
  }
  else if (analogRead(A0) < 500 && analogRead(A1) < 500 && analogRead(A2) > 500) {
    Serial.println("left");
    stop();
    backward();
    left();
  }
  else if (analogRead(A0) < 500 && analogRead(A1) > 500 && analogRead(A2) > 500) {
    Serial.println("left");
    stop();
    backward();
    left();
  }
  else if (analogRead(A0) < 500 && analogRead(A1) > 500 && analogRead(A2) < 500) {
      Serial.println("dope");
    stop();
    backward();
  }
  else if (analogRead(A0) > 500 && analogRead(A1) > 500 && analogRead(A2) > 500) {
    Serial.println("dope");
    stop();
    backward();
  }
}

void forward() {
  digitalWrite(LEFT_A1, HIGH);
  digitalWrite(LEFT_B1, LOW);
  digitalWrite(RIGHT_A2, HIGH);
  digitalWrite(RIGHT_B2, LOW);
  delay(300);
}
void backward() {
  digitalWrite(LEFT_A1, LOW);
  digitalWrite(LEFT_B1, HIGH);
  digitalWrite(RIGHT_A2, LOW);
  digitalWrite(RIGHT_B2, HIGH);
  delay(600);
}
void left() {
  digitalWrite(LEFT_A1, LOW);
  digitalWrite(LEFT_B1, HIGH);
  digitalWrite(RIGHT_A2, HIGH);
  digitalWrite(RIGHT_B2, LOW);
  delay(300);
}
void right() {
  digitalWrite(LEFT_A1, HIGH);
  digitalWrite(LEFT_B1, LOW);
  digitalWrite(RIGHT_A2, LOW);
  digitalWrite(RIGHT_B2, HIGH);
  delay(300);
}
void stop() {
  digitalWrite(LEFT_A1, LOW);
  digitalWrite(LEFT_B1, LOW);
  digitalWrite(RIGHT_A2, LOW);
  digitalWrite(RIGHT_B2, LOW);
  delay(300);
}

 

이렇게 짜보았는데 생각처럼 안되는거같습니다.

혹시 도움을 구할 수 있을까요?

적외선 센서를 사용하고있습니다.

프로필사진

Klant 2016-12-13 10:39:10

안녕하십니까? 최장우님. 

적외선 센서라면 적외선 거리 감지 센서 인지, 라인트레이서에 사용되는 적외선 센서인지 잘 모르겠지만, 질문 주신 내용으로 보아 라인트레이서에 사용하는 적외선 센서라고 가정하고 답변드리니 참고해주세요! (개인 의견일뿐입니다)

 

문의 주신 작동에서 대해서는 장애물 회피 기능과 유사하게 구현을 해주시면 될 것 같습니다. 즉 2개의 라인트레이서에 검은색이 인지 되지 않는다면 직진(또는 랜덤한 움직임), 왼쪽 라인트레이서에 검은색이 인식되었다면 우회전, 우측 라인트레이서에 검은색이 인식되었다면 좌회전, 좌측과 우측 라인트레이서 모두에 검은색이 인지되었다면 후진 또는 180도 회전으로 구현을 하면되지 않을까 생각이 듭니다.

 

답변이 도움이 되셨으면 좋겠습니다! ;) 

이전글   |    아두이노 Grove 지문인식 사용 질문합니다! 2016-12-09
다음글   |    아두이노 실현 가능성 조언 부탁드립니다 2016-12-11