똑똑한 청소 로봇? 나만의 로봇 청소기 만들기 도전! > 초보자를 위한 로봇 프로젝트

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

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

똑똑한 청소 로봇? 나만의 로봇 청소기 만들기 도전!

페이지 정보

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

본문

똑똑한 청소 로봇? 나만의 로봇 청소기 만들기 도전!

이 프로젝트는 초음파 센서로 장애물을 피하고, 모터와 브러시를 이용해 바닥의 먼지를 쓸어 담는 가장 기본적인 형태의 로봇 청소기를 만들어 볼 것입니다.


1단계: 나만의 로봇 청소기 '원리' 이해하기

나만의 로봇 청소기는 다음과 같은 원리로 움직입니다.


인지 (초음파 센서): 로봇 앞쪽의 초음파 센서가 전방의 장애물까지의 거리를 지속적으로 측정합니다.

판단 (컨트롤러/코드): 아두이노가 센서 값으로 장애물 유무와 거리를 판단하고, 그에 따라 청소 전략을 결정합니다.

장애물이 없을 때: 일정 시간(혹은 일정 거리) 동안 앞으로 직진하며 청소.

장애물이 감지될 때: 일단 정지한 후, 다른 방향(예: 왼쪽, 오른쪽)에 장애물이 없는지 확인 후 그 방향으로 회전. (장애물 회피 로봇과 동일)

모든 방향이 막혔을 때: 후진하거나 다른 임의의 방향으로 회전.

행동 (모터 및 브러시): 아두이노의 판단에 따라 로봇의 바퀴 모터를 제어하여 이동하고, 청소용 브러시 모터를 제어하여 먼지를 쓸어 담습니다.

2단계: 필수 준비물 확인 및 구매

컨트롤러:

아두이노 우노 R3 (Arduino Uno R3) 호환 보드: 1개

USB 케이블: 아두이노와 컴퓨터 연결용.

로봇 섀시:

2WD 로봇 자동차 섀시 키트: 1개 (약 10,000원 ~ 15,000원) - 모터 2개, 바퀴 2개, 프레임, 캐스터 포함

액추에이터:

모터 드라이버 (L298N): 1개 (바퀴 모터 2개 제어용)

작은 DC 모터 (청소용 브러시 구동용): 1개 (예: 3V~6V 미니 DC 모터)

모터 드라이버 (L9110S) 또는 릴레이 모듈: 1개 (작은 DC 모터 제어용) - L9110S는 DC 모터 2개를 제어할 수 있어 남는 채널 활용.

SG90 마이크로 서보 모터: 1개 (선택 사항, 초음파 센서 방향 전환용)

센서:

초음파 센서 모듈 (HC-SR04): 1개 (장애물 감지용)

청소 부품:

회전 브러시: 작은 칫솔이나 청소솔을 재활용하여 모터에 부착할 수 있도록 개조하거나, 작은 솔을 모터에 직접 부착.

먼지통: 로봇 바닥면에 붙일 작은 플라스틱 통이나 박스.

전원:

AA 배터리 홀더 (4개용): 1개 (바퀴 모터 및 아두이노 전원용)

AA 배터리: 4개

(선택 사항) 9V 배터리 & 스냅 커넥터: 아두이노 별도 전원용. (LiPo 배터리는 고출력이 가능하지만, 초보자는 안전을 위해 AA 건전지를 추천합니다.)

연결 재료:

브레드보드: 1개

점퍼 케이블 (수-수, 수-암): 넉넉하게

공구:

드라이버 세트, 니퍼, 양면테이프 또는 글루건, 케이블 타이, 칼.

3단계: 로봇의 '몸' 조립하기 (기계적 조립)

기존 로봇 조립에 '청소' 기능을 위한 부품이 추가됩니다.


로봇 섀시 조립: 프레임, 바퀴 모터, 바퀴, 캐스터 등을 조립합니다.

아두이노/모터 드라이버 고정: 아두이노 보드와 L298N 모터 드라이버를 로봇 프레임(주로 상판)에 고정합니다.

초음파 센서 부착:

(선택 사항) SG90 서보 모터에 HC-SR04를 부착하여 로봇 앞쪽에 고정합니다. (장애물 회피 로봇과 동일)

또는 서보 모터 없이 로봇 정면에 고정합니다.

청소용 브러시 및 모터 부착:

브러시 모터 고정: 작은 DC 모터를 로봇 바닥면 앞쪽에 브러시가 바닥에 닿도록 고정합니다. (L9110S 드라이버도 로봇 프레임에 고정)

브러시 연결: 작은 칫솔 등을 잘라 DC 모터 축에 글루건 등으로 단단히 고정하여 브러시가 회전할 수 있도록 합니다. 브러시가 바닥에 살짝 닿도록 높이를 조절합니다.

먼지통 설치: 브러시 바로 뒤에 먼지가 쓸려 들어갈 작은 먼지통(플라스틱 통)을 부착합니다.

흡입팬 (선택 사항): 흡입팬은 초보자에게 어려울 수 있으므로, 처음에는 회전 브러시만 사용합니다.

4단계: 로봇의 '신경망' 연결하기 (전기 배선)

4.1. 바퀴 모터와 L298N 모터 드라이버 연결 (장애물 회피 로봇과 동일)

L298N OUT1, OUT2 → 왼쪽 바퀴 모터

L298N OUT3, OUT4 → 오른쪽 바퀴 모터

4.2. 청소용 브러시 모터와 L9110S 드라이버 연결

L9110S 드라이버의 OUTA, OUTB → 청소용 브러시 모터

L9110S 드라이버의 VCC → AA 배터리 홀더의 + (또는 아두이노 5V, 용량 확인)

L9110S 드라이버의 GND → AA 배터리 홀더의 - (아두이노 GND와 연결됨)

4.3. 전원부 연결 (아두이노와 모터 공용 배터리)

AA 배터리 홀더의 + (양극) → L298N +12V (또는 VCC)

AA 배터리 홀더의 - (음극) → L298N GND

L298N GND와 아두이노 GND 연결 (가장 중요!)

L298N의 5V 점퍼를 제거한 후, L298N의 5V 출력 핀을 아두이노의 Vin 핀에 연결하여 아두이노에 전원 공급. (이때 배터리는 7.2V 이상이어야 안정적이며, 일반적으로 4개의 AA 배터리 6V로도 아두이노 5V 레귤레이터가 동작 가능할 수 있습니다. 키트에 따라 다름)

대안: AA 배터리 홀더를 2개 사용하여 하나는 모터(6V), 다른 하나는 아두이노(9V 이상 권장)에 독립적으로 연결하고 GND만 공유하는 것이 더 안전하고 안정적입니다.

팁: 4개 AA 배터리(6V)를 L298N과 아두이노의 Vin에 연결해도 대부분 작동은 하지만, 안정적인 동작을 위해서는 6V 이상(예: 7.2V 배터리 팩이나 9V 배터리)을 사용하거나, 아두이노는 별도 전원 공급(9V 배터리)을 하는 것이 좋습니다.

4.4. L298N 드라이버와 아두이노 연결 (장애물 회피 로봇과 동일)

L298N IN1 → 아두이노 핀 8

L298N IN2 → 아두이노 핀 9

L298N IN3 → 아두이노 핀 10

L298N IN4 → 아두이노 핀 11

L298N ENA → 아두이노 핀 5 (PWM 핀)

L298N ENB → 아두이노 핀 6 (PWM 핀)

4.5. 초음파 센서 (HC-SR04)와 아두이노 연결 (장애물 회피 로봇과 동일)

HC-SR04 VCC → 아두이노 5V

HC-SR04 GND → 아두이노 GND

HC-SR04 Trig → 아두이노 핀 4

HC-SR04 Echo → 아두이노 핀 7

4.6. 청소용 브러시 모터 제어 핀과 아두이노 연결

L9110S 드라이버의 INA → 아두이노 핀 12

L9110S 드라이버의 INB → 아두이노 핀 13 (브러시 모터는 한 방향으로만 돌리면 되므로 INA만 연결하고 INB는 GND에 연결해도 됩니다.)

배선 시 주의사항: (이전 프로젝트와 동일) 모든 배선은 전원이 없는 상태에서 하고, 정확한 연결을 거듭 확인해야 합니다.


5단계: 로봇의 '명령' 프로그래밍하기 (아두이노 코딩)

장애물 회피 로직과 청소용 브러시 모터 제어를 통합합니다.


5.1. 아두이노 IDE 설정 (이전 프로젝트와 동일)

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 trigPin = 4;

const int echoPin = 7;


// 청소 브러시 모터 핀 (L9110S)

const int brush_motor_inA = 12; // 브러시 모터 A1

const int brush_motor_inB = 13; // 브러시 모터 B1 (HIGH/LOW 조합으로 방향 제어. 한 방향만 돌릴 경우 INB는 LOW 고정 가능)


// 모터 속도

const int drive_speed = 180; // 주행 속도

const int turn_speed = 120;  // 회전 속도


// 장애물 감지 거리 임계값 (cm)

const int obstacle_threshold = 25; // 25cm 이내면 장애물로 간주


// SG90 서보 모터 (초음파 센서 좌우 회전용)

// 서보 모터가 있다면 여기에 연결

// #include <Servo.h>

// Servo myservo;

// const int servoPin = A1; // 아날로그 핀 A1에 서보 연결 (디지털 핀 사용 가능)


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(trigPin, OUTPUT);

  pinMode(echoPin, INPUT);


  pinMode(brush_motor_inA, OUTPUT); pinMode(brush_motor_inB, OUTPUT);


  // myservo.attach(servoPin); // 서보 모터가 있다면

  // myservo.write(90);

  // delay(500);


  Serial.begin(9600);

  // 시작과 동시에 청소 브러시 가동

  startBrushMotor();

}


void loop() {

  long distance = measureDistance(); // 현재 전방 거리 측정


  Serial.print("Distance: ");

  Serial.print(distance);

  Serial.println(" cm");


  if (distance > obstacle_threshold) {

    moveForward(); // 장애물이 없으면 전진

  } else {

    stopRobot(); // 장애물이 가까우면 정지

    delay(500);


    // 장애물이 있으므로 회피 동작

    // 간단하게 후진 후 회전

    moveBackward();

    delay(500); // 0.5초 후진


    int randomTurnTime = random(500, 1500); // 0.5초에서 1.5초 사이 랜덤 회전

    int randomDirection = random(0, 2); // 0: 왼쪽, 1: 오른쪽


    if (randomDirection == 0) {

      turnLeft();

    } else {

      turnRight();

    }

    delay(randomTurnTime); // 랜덤 시간만큼 회전


    stopRobot();

    delay(200); // 회전 후 잠시 멈춤

  }

}


// 거리 측정 함수 (초음파 센서)

long measureDistance() {

  digitalWrite(trigPin, LOW);

  delayMicroseconds(2);

  digitalWrite(trigPin, HIGH);

  delayMicroseconds(10);

  digitalWrite(trigPin, LOW);

  long duration = pulseIn(echoPin, HIGH);

  return duration * 0.034 / 2;

}


// 청소 브러시 모터 가동 함수

void startBrushMotor() {

  digitalWrite(brush_motor_inA, HIGH); // INA 핀 HIGH로 설정

  digitalWrite(brush_motor_inB, LOW);  // INB 핀 LOW로 설정 (정방향 회전)

}


// 로봇 주행 제어 함수들 (이전 프로젝트들과 유사)


void moveForward() {

  digitalWrite(motor1_in1, HIGH); digitalWrite(motor1_in2, LOW);

  analogWrite(motor1_ena, drive_speed);


  digitalWrite(motor2_in1, HIGH); digitalWrite(motor2_in2, LOW);

  analogWrite(motor2_enb, drive_speed);

}


void moveBackward() {

  digitalWrite(motor1_in1, LOW); digitalWrite(motor1_in2, HIGH);

  analogWrite(motor1_ena, drive_speed);


  digitalWrite(motor2_in1, LOW); digitalWrite(motor2_in2, HIGH);

  analogWrite(motor2_enb, drive_speed);

}


void turnLeft() {

  digitalWrite(motor1_in1, LOW); digitalWrite(motor1_in2, HIGH); // 왼쪽 바퀴 후진

  analogWrite(motor1_ena, turn_speed);


  digitalWrite(motor2_in1, HIGH); digitalWrite(motor2_in2, LOW); // 오른쪽 바퀴 전진

  analogWrite(motor2_enb, turn_speed);

}


void turnRight() {

  digitalWrite(motor1_in1, HIGH); digitalWrite(motor1_in2, LOW); // 왼쪽 바퀴 전진

  analogWrite(motor1_ena, turn_speed);


  digitalWrite(motor2_in1, LOW); digitalWrite(motor2_in2, HIGH); // 오른쪽 바퀴 후진

  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);

}


// 만약 SG90 서보 모터를 사용하여 센서를 좌우로 돌리는 장애물 회피를 구현하려면,

// loop() 함수 내에서 distance 측정 부분을 obstacle_avoidance_robot 프로젝트의 measureDistance() 함수처럼 수정하고,

// randomTurnTime 대신 좌우 거리 비교로 더 먼 쪽으로 회전하도록 로직을 바꿔주면 됩니다.

5.3. 코드 업로드 및 테스트

위 코드를 아두이노 IDE에 복사하여 붙여넣기 합니다.

스케치(Sketch) → 컴파일/업로드(Upload)를 클릭하여 코드를 아두이노 보드에 업로드합니다.

툴(Tools) → 시리얼 모니터(Serial Monitor)를 열어 초음파 센서가 정확한 거리를 측정하는지 확인합니다.

6단계: 로봇 청소기 테스트 및 최적화

테스트 환경 준비: 로봇이 움직일 수 있는 바닥 공간에 가벼운 장애물과 소량의 먼지(혹은 작은 종이 부스러기)를 뿌려 테스트 환경을 만듭니다.

시험 운행: 로봇에 전원을 켜고 청소 브러시가 회전하며 이동하는지 확인합니다.

디버깅 및 조정:

장애물 감지 및 회피: 로봇이 장애물에 부딪히지 않고 잘 회피하는지 확인합니다. obstacle_threshold 값을 조절하고, 회전 속도 및 시간을 조정하여 부드러운 회피 동작을 만듭니다.

청소 효율: 브러시가 바닥에 적절하게 닿아 먼지를 잘 쓸어 담는지, 먼지통으로 잘 들어가는지 확인합니다. 브러시 모터의 속도나 브러시의 형태를 개선할 수 있습니다.

청소 경로: 현재 코드는 단순한 랜덤 워크 방식이므로, 로봇이 특정 영역에 오래 머무르거나 전혀 가지 않는 영역이 생길 수 있습니다. 좀 더 효율적인 청소 경로(예: 지그재그 패턴, 나선형 패턴)를 구현하는 것은 다음 단계의 도전이 됩니다.

전원 안정성: 브러시 모터까지 동시에 작동시키므로 전력 소모가 커집니다. 로봇이 중간에 멈추거나 불안정하게 움직인다면 배터리 용량이 충분한지 확인하거나, 모터 드라이버의 전력 공급을 개선할 방법을 모색합니다.

축하합니다! 이제 당신만의 똑똑한 청소 로봇이 완성되었습니다!


이 프로젝트는 로봇이 '환경 인지(초음파)'와 '행동(이동 + 청소)'을 통합하여 '유용한 작업(청소)'을 수행하는 진정한 로봇의 면모를 보여줍니다. 여기서 더 나아가:


라인 센서 추가: 특정 영역을 청소하는 구획 청소 기능.

벽 감지 센서 추가: 벽을 따라 이동하며 모서리 청소.

맵핑 기능: 로봇이 스스로 방의 지도를 그리고 효율적인 청소 경로를 계획하는 기능 (라즈베리 파이 필요).

작은 아이디어에서 시작하여 직접 만들어본 청소 로봇과 함께 즐거운 시간을 보내시길 바랍니다!

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

댓글목록

등록된 댓글이 없습니다.


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

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

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