프로젝트

나도 메이커! 메이커스 여러분들의 작품/프로젝트를 공유하는 공간입니다.

Line Tracking Car 만들기

2014-11-24 16:00:00

개요



동영상 출처 : youtube - Jeff Silwell

정해진 길을 따라 움직이는 자동차가 있습니다. 여기서 선을 추적하여 선이 놓여져 있는 길을 따라 이동합니다. 딱히 틀을 만든것도 아니고 밑에 검은색 선하나만 그려주어도 그 선을 따라 움직이는데요, 다양한 센서를 이용하여 이런 차를 구현 가능합니다.

사진 출처 : instructables

이번 컨텐츠에서는 위 동영상과 같이 선을 따라 움직이는(라인 트래킹) 자동차를 구현해 보겠습니다. 라인 트레킹 자동차를 구현하는데 많은 방법이 있겠지만, 여기서는 적외선 포토 레지스터 센서를 이용하여 검은색 선을 인식하여 검은색 선을 따라 이동하는 자동차를 만들어 보겠습니다.

미리보기 동영상



시작전 개념 이해하기

 - DC 모터를 돌려보자
 - 장애물 피하는 로봇 만들기
 - 적외선

부품 목록

NO 부품명 수량 상세 설명
1 오렌지 보드 1 아두이노 호환 보드
2 모터 쉴드 1 Arduino Motor SHIELD
3 TCRT5000 3 Infrared Photo Reflective Sensor
4 DC 모터 2 DC 모터
5 4.7kΩ 저항 3 저항
6 100Ω 저항 3 저항
7 1.5V AA 전지 4 직렬 연결(6V)
8 브레드보드 1 브레드보드
9 점퍼케이블 16 점퍼케이블



부품명 오렌지 보드 TCRT5000 모터 실드 DC 모터
파트    

부품명 4.7kΩ 저항 100Ω 저항 1.5V AA전지 브레드보드 점퍼케이블
파트          


하드웨어 Making

회로도



브레드보드 레이아웃



RC카 조립



장애물 피하는 로봇 만들기에서 사용한 모형차 앞에 TCRT5000 센서 3개를 연결한 브레드 보드를 붙입니다.
(2축 기어박스 키트 조립은 장애물 피하기 로봇 만들기 컨텐츠를 보시기 바랍니다.)

소프트웨어 Coding

void setup() {
  Serial.begin(9600);
  //모터쉴드의 A & B채널 설정
  pinMode(12, OUTPUT); //Motor 채널 A pin을 출력으로 설정합니다.
  pinMode(9, OUTPUT); //Brake 채널 A pin을 출력으로 설정합니다.
  pinMode(13, OUTPUT); //Motor 채널 B pin을 출력으로 설정합니다.
  pinMode(8, OUTPUT); //Brake 채널 B pin을 출력으로 설정합니다.
}

void loop() {  
  
// A2 : 왼쪽, A3 : 가운데, A4 : 오른쪽 센서와 연결되어 있습니다.

if(analogRead(A4) > 800 && analogRead(A3) > 800 && analogRead(A2) > 800){
// 3개의 센서가 모두 인식이 됬을 경우는 멈춰있습니다. analogWrite(3, 0); analogWrite(11, 0); } else if(analogRead(A2) > 800 && analogRead(A3) < 800 && analogRead(A4) < 800){
// 왼쪽 센서만 인식했을 경우 왼쪽으로 이동합니다. turn_left(); } else if(analogRead(A4) > 800 && analogRead(A3) < 800 &&analogRead(A2) < 800){
// 오른쪽 센서만 인식했을 경우 오른쪽으로 이동합니다, turn_right(); } else if(analogRead(A3) > 800){
// 가운데 센서가 인식 했을 경우 앞으로 이동합니다. forward(); } } void forward() { //전진모드에 대한 설정입니다. digitalWrite(12, LOW); // 12번 핀과 연결된 채널 A 모터의 방향을 설정합니다. digitalWrite(9, LOW); // 9번 핀과 연결된 채널 A 모터의 브레이크를 해제합니다. analogWrite(3, 255); // 3번 핀과 연결된 채널 A 모터의 속도를 최대값(255)로 설정합니다. digitalWrite(13, LOW); // 13번 핀과 연결된 채널 B 모터의 방향을 역방향으로 설정합니다. digitalWrite(8, LOW); // 8번 핀과 연결된 채널 B 모터의 브레이크를 해제합니다. analogWrite(11, 255); // 11번 핀과 연결된 채널 B 모터의 속도를 최대값(255)로 설정합니다. delay(10); // 0.01초(10밀리초)동안 유지합니다. } void turn_right() { //우회전에 대한 설정입니다. digitalWrite(12, LOW); // 12번 핀과 연결된 채널 A 모터의 방향을 역방향으로 설정합니다. digitalWrite(9, LOW); // 9번 핀과 연결된 채널 A 모터의 브레이크를 해제합니다. analogWrite(3, 255); // 3번 핀과 연결된 채널 A 모터의 속도를 최대값(255)로 설정합니다. digitalWrite(13, HIGH); // 13번 핀과 연결된 채널 B 모터의 방향을 정방향으로 설정합니다. digitalWrite(8, LOW); // 8번 핀과 연결된 채널 B 모터의 브레이크를 해제합니다. analogWrite(11, 255); // 11번 핀과 연결된 채널 B 모터의 속도를 최대값(255)로 설정합니다. delay(10); // 0.01초(10밀리초)동안 유지합니다. } void turn_left() { //우회전에 대한 설정입니다. digitalWrite(12, HIGH); // 12번 핀과 연결된 채널 A 모터의 방향을 정방향으로 설정합니다. digitalWrite(9, LOW); // 9번 핀과 연결된 채널 A 모터의 브레이크를 해제합니다. analogWrite(3, 255); // 3번 핀과 연결된 채널 A 모터의 속도를 최대값(255)로 설정합니다. digitalWrite(13, LOW); // 13번 핀과 연결된 채널 B 모터의 방향을 역방향으로 설정합니다. digitalWrite(8, LOW); // 8번 핀과 연결된 채널 B 모터의 브레이크를 해제합니다. analogWrite(11, 255); // 11번 핀과 연결된 채널 B 모터의 속도를 최대값(255)로 설정합니다. delay(10); //0.01초(10밀리초)동안 유지합니다. }

소프트웨어 설명

TCRT5000은 적외선을 쏴서 반사되어 오는 것을 측정하여 물체를 확인합니다. 적외선을 사용하기 때문에 검은색은 인식을 못하는데 이를 이용하여 흰색 바탕에 검은색 선을 두어 인식되지 않는 방향으로 회전하게 합니다.(반대로 검은색 바탕에 흰색 선을 하여 인식된 방향으로 이동해도 됩니다.)

여기서 센서값은 흰색(or 물체)가 측정이 되면 거리에 따라 값이 줄어 들고, 검은색 선(or 물체)이 측정이 되면 측정 값은 850~1023까지 값이 나옵니다.

1. 가운데 센서에 검은색 선이 인식이 되면(적외선 센서로 아무것도 측정이 안됨) 앞으로 전진 합니다.

2. 오른쪽 센서에 검은색 선이 인식이되면 오른쪽으로 회전합니다. 오른쪽으로 회전하면 다시 가운데 센서에 검은색 선이 인식이 되고 앞으로 갑니다.



3. 왼쪽 센서에 검은색 선이 인식이 되면 왼쪽으로 회전합니다. 오른쪽과 마찬가지로 왼쪽으로 회전하면 다시 가운데 센서에 검은색 선이 인식이 되고 앞으로 가게 됩니다.


위의 사진과 같이 3개의 센서 중에 인식되지 않는 센서(검은색 선이 있는) 방향으로 이동하게 됩니다. 이를 이용하여 선을 따라가는 RC카를 만듭니다.

void turn_right()
{ 
  //우회전에 대한 설정입니다.
  digitalWrite(12, LOW); // 12번 핀과 연결된 채널 A 모터의 방향을 역방향으로 설정합니다. 
  digitalWrite(9, LOW);   // 9번 핀과 연결된 채널 A 모터의 브레이크를 해제합니다.
  analogWrite(3, 255);    // 3번 핀과 연결된 채널 A 모터의 속도를 최대값(255)로 설정합니다.
  digitalWrite(13, HIGH); // 13번 핀과 연결된  채널 B 모터의 방향을 정방향으로 설정합니다. 
  digitalWrite(8, LOW);   // 8번 핀과 연결된 채널 B 모터의 브레이크를 해제합니다.
  analogWrite(11, 255);   // 11번 핀과 연결된 채널 B 모터의 속도를 최대값(255)로 설정합니다. 
 delay(10); // 0.01초(10밀리초)동안 유지합니다.
}

void turn_left()
{ 
  //우회전에 대한 설정입니다.
  digitalWrite(12, HIGH); // 12번 핀과 연결된 채널 A 모터의 방향을 정방향으로 설정합니다. 
  digitalWrite(9, LOW);   // 9번 핀과 연결된 채널 A 모터의 브레이크를 해제합니다.
  analogWrite(3, 255);    // 3번 핀과 연결된 채널 A 모터의 속도를 최대값(255)로 설정합니다.
  digitalWrite(13, LOW);  // 13번 핀과 연결된  채널 B 모터의 방향을 역방향으로 설정합니다. 
  digitalWrite(8, LOW);   // 8번 핀과 연결된 채널 B 모터의 브레이크를 해제합니다.
  analogWrite(11, 255);   // 11번 핀과 연결된 채널 B 모터의 속도를 최대값(255)로 설정합니다. 
  delay(10); //0.01초(10밀리초)동안 유지합니다.
}

RC카를 회전하게 하는 코드 입니다. 한쪽 바퀴는 정방향으로, 반대쪽 바퀴는 역방향으로 돌려 역방향으로 도는 바퀴 쪽으로 회전하게 합니다.
왼쪽으로 이동시 왼쪽 바퀴는 역방향으로 주고, 오른쪽 바퀴는 정방향으로 돌리면 됩니다.(반대로 이동시는 바퀴 방향을 반대로 돌리면 됩니다.)

모터쉴드 DC모터와 연결하는 곳의 핀배치 입니다.(Current Sensing때문에 A0, A1번핀을 사용하지 못하므로 A2~A4번핀을 TCRT5000 센서 핀으로 사용했습니다.)

Fuction Ch.A Ch.B
Direction(방향) D12 D13
PWM(속도) D3 D11
Brake(강제 정지) D9 D8
Current Sensing A0 A1

판다마니아

TCRT5000, 적외선, DC모터, 아두이노, 모터실드