라인트레이서

작성자
허재호
작성일
2021-04-27 04:57
조회
2810

먼저 라인트레이서란? 지정된 라인을 따라 움직이는 로봇을 의미합니다. 이를 만들기 위해 꼭 필요한 물품은 다음과 같습니다.

--> 아두이노 UNO,  브레드보드(빵판), 차체, 모터 드라이버, 적외선 센서(최소 2개),  건전지, DC모터, DC barrel 잭

핵심 매커니즘은 크게

1. 적외선 센서로 라인을 감지 후, 2.  모터드라이브를 통하여 DC모터를  상황에 맞게(좌, 우, 직진) 제어하여 선을 따라가는 것입니다.

1 ) 적외선 센서를 통한 감지 아두이노 TCRT5000 적외선센서 모듈 [SZH-CH027] / 디바이스마트 적외선 센서의 모습입니다.  핀 3개가 존재하는 것을 확인할 수 있는데, 이는 각각 VCC, GND, OUT 으로 VCC와 GND는 전원부를 의미하며 OUT은 센서값을 전달해주는 핀입니다. VCC는 아두이노의 5V pin, GND는 아두이노의 GND핀에 각각 꼽아주시면 됩니다. 나머지 OUT핀은 digital핀 13개 중 원하시는 곳에꽂으시면 됩니다.

적외선 센서의 원리는 간단합니다. 물체에, 적외선 센서를 방출한 뒤, 빛 센서를 통해 반사되는 빛을 감지하는 원리입니다.  이는 더 나아가  라인트레이서에 적용할 수 있습니다.

선을 검은색으로 한다면, 빛을 흡수하여 반사하지 못하므로 물체를 인지하지 못하는 상황이 됩니다.  이를 통해 로봇이 선을 따라갈 수 있는 것입니다!

그렇다면 적외선 센서를 이용할 줄 알아야합니다. 다음과 같은 코드를 통해 적외선 센서값을 시리얼 모니터에 출력해보도록 하겠습니다.

(※ 참고로, 제시된 코드를 먼저 보는 것보다 직접 짜고 제공된 코드를 참조한다면, 실력이 더욱 증진될 것입니다.)

 

const int left_sensor = 4;  // 왼쪽 적외선 센서 4번 pin으로 정의
const int right_sensor = 5; // 오른쪽 적외선 센서 5번 pin으로 정의

void setup(){

Serial.begin(9600);  // 시리얼 통신 시작

pinMode(left_sensor, INPUT);    // 센서값을 받아와야 하므로 INPUT pinMode 선언
pinMode(right_sensor, INPUT);

}

void loop(){

int c = digitalRead(left_sensor);  // 센서값 읽기
int d = digitalRead(right_sensor);

Serial.print(c);  // 시리얼 모니터에 출력
Serial.println(d);

delay(1000);
}

 

위와 같은 코드를 실행시 적외선 센서가 물체를 인지한다면 1, 인지하지 못한다면 0으로 출력되는 것을 시리얼 모니터를 통해 알 수 있습니다. 한 쪽 적외선 센서만을  막을 시 01 혹은 10으로 나오는 것 또한 예상할 수 있습니다.

 

2)  모터드라이버는 세미나에서 설명했으므로 이를 통해 참고하시길 바랍니다.

이번 라인트레이서의 핵심입니다.

바로 상황에 맞는 코드를 짜는 것입니다. 물체가 선을 따라갈 때, 보통 어떤 상황이 있을 수 있을까요?  크게 1. 직선구간 2. 오른쪽 커브구간 3. 왼쪽 커브구간 으로 나눌 수 있습니다.

이와 같은 상황을 우리는 일반화를 해야합니다.  왼쪽, 오른쪽 센서간의 간격이 선의 폭보다 넓다고 가정하겠습니다.

직선 구간에 있을시,  왼쪽 오른쪽 센서가 모두 선 위에 존재하지 않기 때문에  양 쪽 모든 센서가  바닥을 감지하는 상황이 발생합니다.

오른쪽으로 꺾는 커브 구간을 만날시,  왼쪽은 선 위에 존재하지 않아 바닥을 감지하지만, 오른쪽 센서는 선 위에 존재하여 바닥을 감지하지 못합니다.  이때 오른쪽으로 로봇을 꺾기 위해선 왼쪽 바퀴는 앞으로 굴리고 오른쪽 바퀴는 후진을 시켜야합니다!

왼쪽으로 꺾는 커브 구간을 만날시,  오른쪽은 선 위에 존재하지 않아 바닥을 감지하지만, 왼쪽 센서는 선 위에 존재하여 바닥을 감지하지 못합니다.  이때 오른쪽으로 로봇을 꺾기 위해선 오른쪽 바퀴는 앞으로 굴리고 왼쪽바퀴는 후진을 시켜야합니다!

 

이를 코드를 통해 표현하면 다음과 같습니다.

(※ 참고로, 제시된 코드를 먼저 보는 것보다 직접 짜고 제공된 코드를 참조한다면, 실력이 더욱 증진될 것입니다.)

<회로와, 코드를 직접 짜보는 것은 실력 향상에 크게 도움이 됩니다.> !!회로도는 별도로 제공하지 않을 예정입니다. 여러분이 세미나를 통해 배운 내용으로 참고하셔서 직접 선을 연결하고 코드를 짜보시는 것을 권장합니다. 해보았지만 헷갈리거나 아직은 잘 모르겠다는 분들은 글쓴이를 통해 물어봐주세요 사소한 것부터 어떤 것이든 괜찮습니다:)!!!



const int Left= 4; // 왼쪽 라인트레이서 센서의 신호 선은 5번으로 정의
const int Right= 5; // 오른쪽 라인트레이서 센서의 신호 선은 4번으로 정의
const int motorLeftForward =11; // 왼쪽 모터의 전진 신호는 11번으로 정의
const int motorLeftBack =10; // 왼쪽 모터의 후진 신호는 10번으로 정의
const int motorRightForward=6; // 오른쪽 모터의 전진 신호는 6번으로 정의
const int motorRightBack=9; // 오른쪽 모터의 전진 신호는 9번으로 정의

int speed=110;
int turn_speed = 50;

void setup() {
pinMode(Left, INPUT);
pinMode(Right, INPUT);
pinMode(motorLeftForward, OUTPUT);
pinMode(motorLeftBack, OUTPUT);
pinMode(motorRightForward, OUTPUT);
pinMode(motorRightBack, OUTPUT);
}

void loop() {

if(digitalRead(Left)==HIGH && digitalRead(Right)==LOW){ // 오른쪽 센서만 선 위에 있을 시
left(turn_speed); right(-turn_speed); // 오른쪽으로 회전(왼쪽 모터 구동, 오른쪽 모터 후진)
delay(10);
left(0); right(0); // 정지
}
else if(digitalRead(Right)==HIGH && digitalRead(Left)==LOW){ // 왼쪽 센서만 선 위에 있을 시
left(-turn_speed); right(turn_speed); //왼쪽으로 회전(오른쪽 모터 구동, 왼쪽 모터 정지)
delay(10);
left(0); right(0); // 정지
}
else if(digitalRead(Right)==HIGH && digitalRead(Left)==HIGH) // 둘다 선 위에 있을 시
{
left(speed); right(speed);
delay(10);
}
else
{
left(0); right(0);
}

}

void left(int speed){ //왼쪽 모터 제어
if (speed >= 0) { //전진
digitalWrite(motorLeftBack, LOW); //왼쪽 후진 신호 OFF
analogWrite(motorLeftForward, speed); //전진 신호 speed의 세기로 회전

} else { //후진
digitalWrite(motorLeftForward, LOW); // 왼쪽 전진 신호 OFF
analogWrite(motorLeftBack, speed); //후진 신호 speed의 세기로 회전
}
}

void right(int speed){ //오른쪽 모터 제어
if (speed >= 0) { //전진
digitalWrite(motorRightBack, LOW); //오른쪽 후진 신호 OFF
analogWrite(motorRightForward, speed); //전진 신호 speed의 세기로 회전
} else { //후진
digitalWrite(motorRightForward, LOW); //오른쪽 전진 신호 OFF
analogWrite(motorRightBack, speed); //후진 신호 speed의 세기로 회전
}
}


라인트레이서의 기능을 결정할  중요한 요소 몇가지가 있습니다.  차 자체의 속도, 방향을 꺾을 때 속도, 경로(선)의 간격 등이 있습니다.

선을 정확하게 따라가는 것과 경로 완주시간 등 제약을 두고 이에  맞추어 코딩을 하고 센서의 위치를 조절한다면

누구보다 빠르고 정확하게 따라가는 라인트레이서를 만들어 볼 수 있지 않을까요?


+하드웨어 사진입니다!

적외선 센서의 간격은 사진과 달리 넓게 해주세요! 대략 나무젓가락 반 정도 길이의 간격!)

참고용 사진일 뿐, 편하신대로 모두 재배치 하셔도 상관없습니다.

   ( 윗면)

(아랫면)

         

 ( 완성된 모습)

 

차를 꾸미고, 트랙을 만들어, 본인만의 코드를 통해 친구들과 경주를 펼쳐보세요!!!!

전체 0

  • 🚨현재 코로나19 방역지침 준수를 위해 집합금지와 관련하여🚨
    기존 부원들께서는 구글 폼으로 예약 후 사용 부탁드리겠습니다.
  • 동아리방 사용시 항상 마스크 착용, 취식 절대 금지, 자주 환기 부탁드립니다!
  • 동아리방 방문 예약은 전날 24시전까지 부탁드립니다.
시간
12:00     
13:00     
14:00     
15:00상주상주상주 상주
16:00 
17:00 
18:00저녁시간~
19:00상주상주상주 상주
20:00 
21:00 
22:00