Notice
Recent Posts
«   2024/10   »
1 2 3 4 5
6 7 8 9 10 11 12
13 14 15 16 17 18 19
20 21 22 23 24 25 26
27 28 29 30 31
관리 메뉴

MUKI 님의 블로그

[아두이노] 라인트레이서 로봇 만들기! (적외선 센서 3개를 이용하여 라인트레이싱) 본문

DIY/아두이노

[아두이노] 라인트레이서 로봇 만들기! (적외선 센서 3개를 이용하여 라인트레이싱)

MUKI_ 2024. 10. 21. 21:56

안녕하세요. 무기입니다.

여러분, 라인트레이서 로봇하면 대부분 적외선 센서를 2개를 이용하는 것을 많이 보셨을 겁니다.

또한 센서 2개를 이용하여 라인트레이싱 코드를 짜는 것은 쉽습니다.

로봇 기준으로 적외선 센서가 양쪽에 달려있고, 가운데 검은 선을 따라가도록 코드를 짠다고 생각해봅시다.

양쪽 센서에서 검은선이 감지 되지 않으면 센서 사이에 검은선이 있는 것이므로 처음에는 그냥 직진합니다.

그러다가 굽은 선을 만나게 된다고 가정합시다. 왼쪽 센서에서 검은 선이 감지 되면 왼쪽으로 커브턴을 하고, 오른쪽에서 감지되면 오른쪽으로 커브턴을 하도록 코드를 짜면 됩니다.

하지만 3개는 어떨까요? 3개부터는 라인트레이싱을 어떻게 해야 효율적일지 잘 생각이 안날겁니다.

3개 일때도, 생각보다 어렵지 않습니다. 가운데 센서에서 검은선이 발견되면 직진 그 외에는 위에 내용과 같습니다.

3개를 쓰니 정밀도도 높고, 효과도 좋을 것이라 생각합니다. (저도 전문가가 아니라 아닐 수도 있고요. ㅎㅎ)

이번 기회에 여러분들도 많이 알아가시길 바랍니다.

 

밑에 그림에서 파란색 모형은 적외선 센선, 검은색 선은 라인이라고 생각해주시면 되겠습니다.

(적외선 센서에 대한 내용은 나중에 따로 자세히 써보도록 하겠습니다.)

 

가운데 센서가 검은선을 감지한다면, 직진을 합니다.

직진을 하다가 라인이 좌측으로 기울어져 있으면, 왼쪽 센서에서 검은선을 감지하게 되겠지요.

그러면 좌측으로 커브를 하면 됩니다.

직진을 하다가 라인이 우측으로 기울여져 있으면, 우측으로 커브를 하다록 하면 되겠지요.


<실제 실현 영상>

 

 

 


<코드>

 

// 모터 드라이버 핀 설정
const int ENA = 3; // 모터 A의 속도 제어 핀
const int IN1 = 4; // 모터 A의 방향 제어 핀 1
const int IN2 = 5; // 모터 A의 방향 제어 핀 2
const int ENB = 11; // 모터 B의 속도 제어 핀
const int IN3 = 13; // 모터 B의 방향 제어 핀 1
const int IN4 = 12; // 모터 B의 방향 제어 핀 2

void LineTrace() {
  if (digitalRead(9) == HIGH) {
    straight();
    Serial.println("직진");
  } else {
    if (digitalRead(8) == HIGH) {
      L_turn();
      Serial.println("좌");
    }
    if (digitalRead(10) == HIGH) {
      R_turn();
      Serial.println("우");
    }
  }
}

void straight() {
  analogWrite(ENA, 140); 
  analogWrite(ENB, 140); 
}

void L_turn() {
  analogWrite(ENA, 140); 
  analogWrite(ENB, 0); 
}

void R_turn() {
  analogWrite(ENA, 0); 
  analogWrite(ENB, 140); 
}

void setup() {
  Serial.begin(9600);
  // 핀 모드 설정
  pinMode(ENA, OUTPUT);
  pinMode(IN1, OUTPUT);
  pinMode(IN2, OUTPUT);
  pinMode(ENB, OUTPUT);
  pinMode(IN3, OUTPUT);
  pinMode(IN4, OUTPUT);
  // 모터를 앞으로 이동시키기 위한 핀 설정
  digitalWrite(IN1, HIGH); // 모터 A (오른쪽)
  digitalWrite(IN2, LOW);
  digitalWrite(IN3, HIGH); // 모터 B (왼쪽)
  digitalWrite(IN4, LOW);
}
void loop() {
 
  LineTrace();
 
}

 

이상 마무리하도록 하겠습니다.

끝까지 봐주셔서 감사합니다. 많은 도움이 됐기를 바랍니다.^^