세상에서 가장 쉬운 라인트레이서 로봇 만들기 > 초보자를 위한 로봇 프로젝트

본문 바로가기
사이트 내 전체검색

초보자를 위한 로봇 프로젝트

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

페이지 정보

profile_image
작성자 관리자
댓글 0건 조회 264회 작성일 25-11-20 12:34

본문

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

라인트레이서 로봇은 바닥에 그려진 선(주로 검은색 선)을 따라 움직이는 로봇입니다. 여기서는 아두이노와 가장 기본적인 부품들을 활용하여, 단계별로 아주 쉽고 상세하게 설명해 드릴게요.


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 조건문이 정확한지 다시 확인합니다.

모터 소음/발열: 모터 드라이버나 모터 자체에 이상이 없는지 확인합니다.

전원 부족: 배터리가 부족하면 로봇이 느려지거나 멈출 수 있습니다.

반복: 만족스러운 결과가 나올 때까지 계속해서 코드와 센서, 모터 속도를 조정하며 반복 테스트합니다.

축하합니다! 이제 당신만의 라인트레이서 로봇이 완성되었습니다.


이 프로젝트는 로봇이 어떻게 센서로 환경을 인지하고, 컨트롤러로 판단하며, 모터로 행동하는지 가장 쉽고 직관적으로 보여줍니다. 여기서 더 나아가 초음파 센서를 달아 장애물을 피하거나, 더 많은 센서로 복잡한 트랙을 달리도록 개선해 보세요. 로봇 공학의 문은 이제 막 열렸습니다!

[이 게시물은 관리자님에 의해 2025-11-22 10:15:07 초보자를 위한 로봇 프로젝트에서 이동 됨]
[이 게시물은 관리자님에 의해 2025-11-29 13:01:12 18에서 이동 됨]

댓글목록

등록된 댓글이 없습니다.


회사소개 개인정보취급방침 서비스이용약관 모바일 버전으로 보기 상단으로

작크와콩나무
대표:이강복 등록번호:129-30-34337 개인정보관리책임자:이경영

Copyright © https://roboman.co.kr/ All rights reserved.