블루투스 제어 장애물 회피 로봇: 스마트 원격 조종 차량 만들기
부품 및 소모품
| 부품 | 수량 | 비고 |
| Arduino Nano R3 | 1 | 메인 컨트롤러 |
| L298N 듀얼 H-브리지 모터 드라이버 | 1 | 모터 2개 제어 |
| HC-SR04 초음파 거리 센서 | 1 | 장애물 감지 |
| HC-05 블루투스 모듈 | 1 | 스마트폰과 통신 |
| RGB 확산형 공통 애노드 LED | 1 | 로봇 상태 표시 |
| 양방향 로직 레벨 컨버터 | 1 | HC-05(3.3V) ↔ Arduino(5V) 신호 변환 |
| 저항 330Ω | 1 | LED 전류 제한 |
| 브레드보드 | 1 | 회로 구성용 |
| 브레드보드 전원 모듈 5V/3.3V | 1 | 안정적 전원 공급 |
| DC 기어드 모터 12V | 2 | 구동용 |
| 점퍼 와이어 (수/암) | 1세트 | 배선용 |
소프트웨어 및 앱
- Arduino IDE
- Arduino BlueControl 앱 (구글 플레이스토어에서 다운로드)
프로젝트 소개
코로나19 봉쇄 기간 동안 12년 만에 로봇 제작 취미를 되살려 만든 프로젝트입니다. 스마트폰으로 블루투스를 통해 로봇을 제어하며, 초음파 센서로 전방 장애물을 감지하면 자동으로 정지하는 기능을 갖추었습니다.
시스템 구성
- 제어: 스마트폰(Arduino BlueControl 앱) → 블루투스(HC-05) → 아두이노 나노(시리얼 수신)
- 구동: 아두이노 나노 → L298N 모터 드라이버(PWM 속도 제어) → DC 기어드 모터 2개 (전진/후진/좌/우)
- 안전: HC-SR04 초음파 센서로 전방 20cm 내 장애물 감지 시 자동 정지
- 상태 표시: RGB LED로 동작 상태 표시 (초록: 전진, 빨강: 정지/장애물, 파랑: 후진 등)
핵심 포인트
- 로직 레벨 컨버터 필수: HC-05는 3.3V 로직, 아두이노 나노는 5V 로직이므로 TX/RX 라인에 레벨 컨버터 반드시 필요
- 모터 드라이버 필요: 아두이노 핀으로는 모터 구동 전류 부족 → L298N으로 대전류 제어
- PWM 속도 제어: ENA/ENB 핀에 PWM 신호로 모터 속도 조절
- 전원 분리: 브레드보드 전원 모듈로 5V(로직), 3.3V(블루투스) 별도 공급, 모터는 외부 12V 전원 사용
조립 구조
- 2륜 구동 베이스 (기어드 모터 2개 + 캐스터 휠 생략 가능)
- 브레드보드 위에 회로 구성
- 초음파 센서 전방 장착
- RGB LED 상단에 배치해 상태 확인 용이
소스 코드
/* Bluetooth Controlled Obstacle Avoidance Robot
Prepared by: Alok Talukdar
Date: 09.05.2020 */
#include <SoftwareSerial.h>
// L298N 모터 제어 핀
#define IN1 5 // 우측 모터
#define IN2 4
#define IN3 3 // 좌측 모터
#define IN4 2
#define ENA 9 // 우측 PWM
#define ENB 10 // 좌측 PWM
// RGB LED 핀 (공통 애노드)
#define redLED 8
#define greenLED A0
#define blueLED 11
// HC-SR04 초음파 센서
const int trigPin = 6;
const int echoPin = 7;
float duration, distance;
// HC-05 블루투스 (소프트웨어 시리얼)
SoftwareSerial mySerial(12, 13); // RX=12, TX=13
String data;
int btVal;
void setup() {
pinMode(trigPin, OUTPUT);
pinMode(echoPin, INPUT);
mySerial.begin(9600);
pinMode(IN1, OUTPUT); pinMode(IN2, OUTPUT);
pinMode(IN3, OUTPUT); pinMode(IN4, OUTPUT);
pinMode(ENA, OUTPUT); pinMode(ENB, OUTPUT);
pinMode(redLED, OUTPUT); pinMode(blueLED, OUTPUT); pinMode(greenLED, OUTPUT);
digitalWrite(IN1, LOW); digitalWrite(IN2, LOW);
digitalWrite(IN3, LOW); digitalWrite(IN4, LOW);
analogWrite(redLED, 255); // 공통 애노드: HIGH=OFF
digitalWrite(blueLED, HIGH);
digitalWrite(greenLED, HIGH);
}
void loop() {
// 블루투스 명령 수신
while (mySerial.available()) {
data = mySerial.readStringUntil('\n');
}
btVal = data.toInt();
switch (btVal) {
case 1: forward(); setLED(0, 255, HIGH); dist(); break; // 전진
case 2: reverse(); setLED(255, HIGH, LOW); break; // 후진
case 3: left(); break; // 좌회전
case 4: right(); break; // 우회전
case 5: stoprobot(); setLED(HIGH, 0, HIGH); break; // 정지
default: setLED(HIGH, 255, HIGH); break;
}
}
// 모터 제어 함수들
void forward() {
for(int i=0; i<=100; i++) {
analogWrite(ENA, i); analogWrite(ENB, i);
digitalWrite(IN1, HIGH); digitalWrite(IN2, LOW);
digitalWrite(IN3, LOW); digitalWrite(IN4, HIGH);
}
}
void reverse() {
for(int j=0; j<=100; j++) {
analogWrite(ENA, j); analogWrite(ENB, j);
digitalWrite(IN1, LOW); digitalWrite(IN2, HIGH);
digitalWrite(IN3, HIGH); digitalWrite(IN4, LOW);
}
}
void left() {
analogWrite(ENA, 127); analogWrite(ENB, 0);
digitalWrite(IN1, HIGH); digitalWrite(IN2, LOW);
digitalWrite(IN3, HIGH); digitalWrite(IN4, HIGH);
}
void right() {
analogWrite(ENA, 0); analogWrite(ENB, 127);
digitalWrite(IN1, HIGH); digitalWrite(IN2, HIGH);
digitalWrite(IN3, LOW); digitalWrite(IN4, HIGH);
}
void stoprobot() {
analogWrite(ENA, 0); analogWrite(ENB, 0);
digitalWrite(IN1, LOW); digitalWrite(IN2, LOW);
digitalWrite(IN3, LOW); digitalWrite(IN4, LOW);
}
void setLED(byte g, byte r, byte b) {
digitalWrite(greenLED, g);
analogWrite(redLED, r);
digitalWrite(blueLED, b);
}
void dist() {
digitalWrite(trigPin, LOW); delayMicroseconds(2);
digitalWrite(trigPin, HIGH); delayMicroseconds(10);
digitalWrite(trigPin, LOW);
duration = pulseIn(echoPin, HIGH);
distance = (duration * 0.0343) / 2; // cm 단위
if (distance < 20) { // 20cm 이내 장애물
stoprobot();
setLED(HIGH, 0, HIGH); // 빨강 점등 (정지 상태)
}
delay(1000);
}
회로도
프로젝트 페이지의 'Schematics' 섹션에서 전체 회로도 이미지 확인 가능.
확장 아이디어
- 가전제품 제어용 홈 오토메이션 로봇으로 확장
- 공장/창고 바닥 자율 주행 로봇으로 발전
- 카메라 모듈 추가로 FPV(1인칭 시점) 제어 구현