세상에서 가장 쉬운 라인트레이서 로봇 만들기
페이지 정보

본문
세상에서 가장 쉬운 라인트레이서 로봇 만들기
라인트레이서 로봇은 바닥에 그려진 선(주로 검은색 선)을 따라 움직이는 로봇입니다. 여기서는 아두이노와 가장 기본적인 부품들을 활용하여, 단계별로 아주 쉽고 상세하게 설명해 드릴게요.
1단계: 라인트레이서 로봇의 '원리' 이해하기
라인트레이서는 다음과 같은 간단한 원리로 움직입니다.
인지 (센서): 로봇 아래에 있는 '라인 센서(적외선 센서)'가 바닥의 '밝기'를 감지합니다.
밝은 바닥(흰색): 빛이 많이 반사되어 센서에 도달합니다.
어두운 선(검은색): 빛이 흡수되어 센서에 거의 도달하지 않습니다.
판단 (컨트롤러/코드): 센서의 감지 결과(밝기 값)를 아두이노가 읽어들여, 현재 로봇이 '선의 어느 위치에 있는지'를 판단합니다.
로봇이 선 중앙에 있을 때: 양쪽 센서 모두 흰색 바닥을 감지. → 앞으로 직진.
로봇이 선의 왼쪽으로 벗어날 때: 왼쪽 센서가 검은색 선을 감지, 오른쪽 센서가 흰색 바닥을 감지. → 오른쪽으로 방향 전환.
로봇이 선의 오른쪽으로 벗어날 때: 오른쪽 센서가 검은색 선을 감지, 왼쪽 센서가 흰색 바닥을 감지. → 왼쪽으로 방향 전환.
행동 (모터): 아두이노의 판단에 따라 모터를 제어하여 로봇의 움직임을 결정합니다.
2단계: 필수 준비물 확인 및 구매
가장 쉽고 저렴하게 만들 수 있도록 기본적인 부품 위주로 리스트를 구성했습니다.
컨트롤러:
아두이노 우노 R3 (Arduino Uno R3) 호환 보드: 1개 (약 5,000원 ~ 10,000원)
USB 케이블: 아두이노와 컴퓨터 연결용. (보드 구매 시 대부분 포함)
로봇 섀시:
2WD 로봇 자동차 섀시 키트: 1개 (약 10,000원 ~ 15,000원) - 모터, 바퀴, 프레임, 캐스터 포함
구성: DC 모터 2개, 바퀴 2개, 캐스터 1개, 아크릴 프레임 (상판, 하판), 모터 고정 브래킷.
액추에이터:
모터 드라이버 (L298N): 1개 (약 3,000원 ~ 5,000원) - L298N은 2개의 DC 모터를 제어할 수 있습니다.
센서:
라인 트레이서 센서 모듈 (IR 적외선): 2개 (약 1,000원 ~ 2,000원/개) - KY-033, TCRT5000 모듈 등.
팁: 3~5개의 라인 센서가 한 판에 붙어있는 '라인 센서 어레이 모듈'을 구매하면 더욱 정밀한 제어가 가능하나, 초보자는 2개로 시작하는 것이 쉽습니다.
전원:
AA 배터리 홀더 (4개용): 1개 (모터 전원용)
AA 배터리: 4개
(선택 사항) 9V 배터리 & 스냅 커넥터: 아두이노 별도 전원용. USB 케이블 연결이 불편할 경우 사용.
연결 재료:
브레드보드: 1개 (선택 사항이나 테스트에 유용)
점퍼 케이블 (수-수, 수-암): 넉넉하게 (약 3,000원 ~ 5,000원)
공구:
드라이버 세트: 로봇 조립용.
니퍼: 전선 자르기용.
양면테이프 또는 글루건: 부품 고정용.
총 예상 비용: 3만원 ~ 5만원 정도면 충분히 만들 수 있습니다.
3단계: 로봇의 '몸' 조립하기 (기계적 조립)
섀시 키트 설명서를 따라 조립하는 것이 가장 좋지만, 일반적인 순서는 다음과 같습니다.
하판 조립: 아크릴 하판에 모터 브래킷을 나사로 고정합니다.
모터 부착: 모터를 브래킷에 끼우거나 나사로 단단히 고정합니다.
바퀴 연결: 모터 축에 바퀴를 끼웁니다. 바퀴가 부드럽게 돌아가는지 확인하세요.
캐스터 부착: 로봇의 앞이나 뒤에 작은 캐스터(지지 바퀴)를 부착하여 로봇의 균형을 잡아줍니다.
상판 조립 (선택 사항): 아크릴 상판을 하판 위에 기둥으로 고정합니다. (모터 드라이버, 아두이노 등을 고정할 위치가 충분한지 확인)
아두이노/모터 드라이버 고정: 아두이노 보드와 모터 드라이버(L298N)를 양면테이프나 나사를 이용해 로봇 프레임(주로 상판)에 고정합니다.
라인 센서 부착: 로봇의 앞쪽 하단에 라인 센서 2개를 바닥을 향하도록 부착합니다. 센서 간 간격은 검은색 선의 너비보다 약간 좁게 설치하여, 선이 두 센서 사이에 있을 때만 '선을 인식하지 못하는' 상태가 되도록 합니다. 센서와 바닥의 거리는 약 0.5cm ~ 1.5cm 정도가 적당합니다.
4단계: 로봇의 '신경망' 연결하기 (전기 배선 - L298N 모터 드라이버 기준)
회로도를 정확히 따라 하는 것이 가장 중요합니다.
모터와 L298N 모터 드라이버 연결:
L298N 드라이버의 OUT1, OUT2 단자를 왼쪽 모터에 연결.
L298N 드라이버의 OUT3, OUT4 단자를 오른쪽 모터에 연결.
전원부 연결 (배터리):
AA 배터리 홀더의 + (빨간색) 선을 L298N 드라이버의 +12V (또는 VCC) 단자에 연결.
AA 배터리 홀더의 - (검은색) 선을 L298N 드라이버의 GND 단자에 연결.
L298N 드라이버의 5V 출력 (점퍼)은 제거 (VCC-5V 점퍼): 아두이노에 외부 전원(USB 또는 9V 배터리)을 공급할 예정이므로 5V 전원을 L298N에서 받지 않도록 합니다.
L298N 드라이버와 아두이노 연결: (PWM 제어를 위한 핀 할당)
L298N IN1 → 아두이노 핀 8
L298N IN2 → 아두이노 핀 9
L298N IN3 → 아두이노 핀 10
L298N IN4 → 아두이노 핀 11
L298N ENA → 아두이노 핀 5 (왼쪽 모터 속도 제어)
L298N ENB → 아두이노 핀 6 (오른쪽 모터 속도 제어)
L298N GND → 아두이노 GND (가장 중요! 모든 GND는 연결)
라인 센서 2개와 아두이노 연결: (일반적으로 3핀 센서: VCC, GND, DO/AO)
왼쪽 센서 VCC → 아두이노 5V
왼쪽 센서 GND → 아두이노 GND
왼쪽 센서 DO (디지털 출력) → 아두이노 핀 2
오른쪽 센서 VCC → 아두이노 5V
오른쪽 센서 GND → 아두이노 GND
오른쪽 센서 DO → 아두이노 핀 3
팁: 센서에 조절용 가변저항(트리머)이 있다면, 흰색 바닥에서는 LED가 꺼지고 검은색 선에서는 LED가 켜지도록 (또는 그 반대로) 맞춰줍니다.
배선 시 주의사항:
모든 전선은 한 번에 한 개씩 연결하여 실수할 확률을 줄입니다.
연결이 끝날 때마다 전선이 단단히 고정되어 있는지 확인합니다.
전원 연결 전에는 반드시 모든 배선을 다시 한번 꼼꼼히 확인합니다.
5단계: 로봇의 '명령' 프로그래밍하기 (아두이노 코딩)
이제 로봇에게 어떻게 움직여야 할지 가르쳐 줄 차례입니다. 아두이노 IDE를 사용하여 코드를 업로드합니다.
5.1. 아두이노 IDE 설정
컴퓨터에 아두이노 IDE를 설치합니다.
IDE 실행 후, 툴(Tools) → 보드(Board) → Arduino AVR Boards → Arduino Uno를 선택합니다.
툴(Tools) → 포트(Port)에서 아두이노가 연결된 COM 포트를 선택합니다.
5.2. 라인트레이서 기본 코드 (예시)
cpp
// 모터 제어 핀 정의 (L298N 기준)
const int motor1_in1 = 8; // 왼쪽 모터 전진
const int motor1_in2 = 9; // 왼쪽 모터 후진
const int motor2_in1 = 10; // 오른쪽 모터 전진
const int motor2_in2 = 11; // 오른쪽 모터 후진
const int motor1_ena = 5; // 왼쪽 모터 속도 (PWM 핀)
const int motor2_enb = 6; // 오른쪽 모터 속도 (PWM 핀)
// 라인 센서 핀 정의 (디지털 핀)
const int left_sensor_pin = 2; // 왼쪽 라인 센서
const int right_sensor_pin = 3; // 오른쪽 라인 센서
// 모터 속도 (0-255)
const int base_speed = 150; // 기본 전진 속도
const int turn_speed = 100; // 회전 시 모터 속도
void setup() {
// 모터 제어 핀들을 출력으로 설정
pinMode(motor1_in1, OUTPUT);
pinMode(motor1_in2, OUTPUT);
pinMode(motor2_in1, OUTPUT);
pinMode(motor2_in2, OUTPUT);
pinMode(motor1_ena, OUTPUT);
pinMode(motor2_enb, OUTPUT);
// 라인 센서 핀들을 입력으로 설정
pinMode(left_sensor_pin, INPUT);
pinMode(right_sensor_pin, INPUT);
Serial.begin(9600); // 시리얼 통신 시작 (디버깅용)
}
void loop() {
int left_sensor_value = digitalRead(left_sensor_pin); // 왼쪽 센서 값 읽기 (HIGH/LOW)
int right_sensor_value = digitalRead(right_sensor_pin); // 오른쪽 센서 값 읽기 (HIGH/LOW)
// 시리얼 모니터로 센서 값 확인 (선택 사항)
Serial.print("Left: ");
Serial.print(left_sensor_value);
Serial.print(" Right: ");
Serial.println(right_sensor_value);
// 센서 값이 LOW 일 때 검은 선 감지 (센서 종류에 따라 HIGH/LOW 반대일 수 있음)
// 대부분의 IR 라인 센서는 검은 선을 감지하면 DO 핀이 LOW가 됨.
// 1. 둘 다 선 밖에 있을 때 (흰색 바닥) - 직진
if (left_sensor_value == HIGH && right_sensor_value == HIGH) {
moveForward();
}
// 2. 왼쪽 센서가 선을 벗어났을 때 (왼쪽 바퀴가 선 밖으로) - 오른쪽으로 회전 (왼쪽 모터 빠르게, 오른쪽 모터 느리게/정지)
else if (left_sensor_value == LOW && right_sensor_value == HIGH) {
turnRight();
}
// 3. 오른쪽 센서가 선을 벗어났을 때 (오른쪽 바퀴가 선 밖으로) - 왼쪽으로 회전 (오른쪽 모터 빠르게, 왼쪽 모터 느리게/정지)
else if (left_sensor_value == HIGH && right_sensor_value == LOW) {
turnLeft();
}
// 4. 둘 다 검은 선을 감지할 때 (선 중간에 걸침 또는 교차로) - 일단 정지 (또는 직진)
else if (left_sensor_value == LOW && right_sensor_value == LOW) {
// stopRobot(); // 일단 정지 또는
moveForward(); // 계속 직진 (어떻게 처리할지는 경로에 따라 다름)
}
}
// 로봇 제어 함수들
void moveForward() {
digitalWrite(motor1_in1, HIGH);
digitalWrite(motor1_in2, LOW);
analogWrite(motor1_ena, base_speed); // PWM으로 속도 제어
digitalWrite(motor2_in1, HIGH);
digitalWrite(motor2_in2, LOW);
analogWrite(motor2_enb, base_speed);
}
void turnLeft() {
digitalWrite(motor1_in1, HIGH); // 왼쪽 모터 전진
digitalWrite(motor1_in2, LOW);
analogWrite(motor1_ena, turn_speed); // 왼쪽 모터 속도 느리게
digitalWrite(motor2_in1, LOW); // 오른쪽 모터 정지 (또는 후진)
digitalWrite(motor2_in2, LOW); // 또는 오른쪽 모터를 더 빠르게 회전 (base_speed + alpha)하여 부드러운 회전 가능
analogWrite(motor2_enb, turn_speed);
}
void turnRight() {
digitalWrite(motor1_in1, LOW); // 왼쪽 모터 정지 (또는 후진)
digitalWrite(motor1_in2, LOW);
analogWrite(motor1_ena, turn_speed);
digitalWrite(motor2_in1, HIGH); // 오른쪽 모터 전진
digitalWrite(motor2_in2, LOW);
analogWrite(motor2_enb, turn_speed); // 오른쪽 모터 속도 느리게
}
void stopRobot() {
digitalWrite(motor1_in1, LOW);
digitalWrite(motor1_in2, LOW);
analogWrite(motor1_ena, 0);
digitalWrite(motor2_in1, LOW);
digitalWrite(motor2_in2, LOW);
analogWrite(motor2_enb, 0);
}
5.3. 코드 업로드 및 센서 값 조정
위 코드를 아두이노 IDE에 복사하여 붙여넣기 합니다.
스케치(Sketch) → 컴파일/업로드(Upload)를 클릭하여 코드를 아두이노 보드에 업로드합니다.
센서 값 확인: 아두이노 IDE에서 툴(Tools) → 시리얼 모니터(Serial Monitor)를 열어 센서가 흰색 바닥과 검은색 선 위에서 어떤 값을 출력하는지 확인합니다. 센서 모듈의 가변저항을 돌려가며 LED가 흰색/검은색에서 바뀌는 지점을 찾고, digitalRead 값이 HIGH 또는 LOW로 올바르게 나오는지 확인해야 합니다. (코드의 if 조건문의 HIGH/LOW를 센서 특성에 맞게 조정해야 할 수 있습니다.)
모터 방향 확인: 로봇이 전진할 때 모터가 올바른 방향으로 도는지 확인합니다. 만약 반대로 돌면 L298N 드라이버에 연결된 모터의 전선을 서로 바꿔줍니다 (OUT1과 OUT2를 바꾸는 등).
6단계: 로봇 테스트 및 최적화
이제 라인트레이서를 테스트할 시간입니다!
테스트 트랙 준비: 흰색 종이 위에 검은색 전기 테이프 등으로 약 3cm 너비의 선을 그려서 간단한 트랙을 만듭니다. (최초에는 직선이나 부드러운 곡선 위주)
시험 운행: 로봇을 선 위에 올려놓고 전원을 켜서 작동을 시작합니다.
디버깅 및 조정:
로봇이 선을 따라가지 못한다면:
센서의 민감도: 센서 모듈의 가변저항을 돌려 센서가 선을 더 정확하게 감지하도록 조정합니다.
모터 속도: base_speed와 turn_speed 값을 조정하여 로봇이 선을 벗어났을 때 더 빠르게 또는 부드럽게 회전하도록 합니다.
센서와 바닥 간 거리: 너무 멀거나 가까우면 인식률이 떨어질 수 있습니다.
코드 로직: 센서 값에 따른 if/else 조건문이 정확한지 다시 확인합니다.
모터 소음/발열: 모터 드라이버나 모터 자체에 이상이 없는지 확인합니다.
전원 부족: 배터리가 부족하면 로봇이 느려지거나 멈출 수 있습니다.
반복: 만족스러운 결과가 나올 때까지 계속해서 코드와 센서, 모터 속도를 조정하며 반복 테스트합니다.
축하합니다! 이제 당신만의 라인트레이서 로봇이 완성되었습니다.
이 프로젝트는 로봇이 어떻게 센서로 환경을 인지하고, 컨트롤러로 판단하며, 모터로 행동하는지 가장 쉽고 직관적으로 보여줍니다. 여기서 더 나아가 초음파 센서를 달아 장애물을 피하거나, 더 많은 센서로 복잡한 트랙을 달리도록 개선해 보세요. 로봇 공학의 문은 이제 막 열렸습니다!
- 이전글장애물 척척 피하는 똑똑한 로봇 만들기 (초보편) 25.11.20
- 다음글로봇, 더 이상 SF 영화 속 이야기가 아니다! 25.11.20
댓글목록
등록된 댓글이 없습니다.
