아두이노 나노로 만드는 음성 제어 로봇 - 블루투스와 안드로이드 앱 활용
부품 및 소모품
부품
수량
비고
아두이노 나노 R3 (Arduino Nano R3)
1
L298N 모터 드라이버 모듈
1
HC-05 블루투스 모듈
1
DC 모터 + 호환 휠
2
다기능 로봇 PCB
1
직접 제작 또는 브레드보드 사용 가능
수/암 헤더 핀
여러 개
필요 도구
앱 및 온라인 서비스
아두이노 IDE
MIT App Inventor로 제작한 안드로이드 앱 (음성 인식 기능 포함)
프로젝트 소개
로봇은 멋집니다. 내 음성 명령에 따라 움직이는 로봇이라면 더 멋지겠죠. 아두이노로 음성 제어 로봇을 만드는 건 더더욱 멋집니다. 아두이노는 저렴하고 수정하기 쉽기 때문입니다.
필요한 전자 부품들
1단계: 필요한 부품
전자 부품:
아두이노 나노 - 1개
L298N 모터 드라이버 모듈 - 1개
HC-05 블루투스 모듈 - 1개
DC 모터와 휠 - 2개
다기능 로봇 PCB - 1개 (링크 )
수/암 헤더 핀 약간
차체 제작용:
PVC 시트 (13cm x 13.5cm)
글루건
소프트웨어:
2단계: 작동 원리
아두이노는 마이크로컨트롤러로 음성 인식을 수행할 만큼의 연산 능력이 없습니다(현재 기준). 하지만 PCB에 블루투스 모듈 포트가 있어, 아두이노를 무선으로 다른 기기와 연결할 수 있습니다. 이를 활용해 안드로이드 앱에서 구글 API(인터넷 필요)를 이용해 '음성→텍스트' 변환을 수행하고, 변환된 텍스트를 블루투스로 아두이노에 전송하는 방식입니다.
예: "Forward"라고 말하면 앱이 'F' 문자를 아두이노로 전송 → 아두이노가 전진.
3단계: 차체 제작
PVC 시트를 칼로 잘라 모터와 휠을 보드 안쪽에 장착하고 글루건으로 고정했습니다. 영상을 참고하세요. 본인의 취향에 맞게 자유롭게 제작하시면 됩니다.
4단계: 회로 구성 - 브레드보드 vs PCB
EasyEDA로 설계한 PCB
PCB 레이아웃
브레드보드로도 가능하지만 배선이 복잡하고 한 번의 잘못된 연결로 전체 프로젝트가 망가질 수 있습니다. 그래서 저는 PCB를 선호합니다. EasyEDA로 설계하고 PCBWay에서 주문했습니다(10장에 $5, 학생 프로젝트 후원도 함). 블랙 색상으로 주문했는데 아주 깔끔하게 나왔습니다.
PCB 주문이 어렵다면 브레드보드나 기판에 직접 배선하셔도 됩니다. 프리칭 파일(speech-controlled-robot-schematic.fzz)을 제공합니다.
5단계: 전자 부품 연결
회로 연결도
모터 → 모터 드라이버:
모터 1 선 → 드라이버 한 쪽 단자
모터 2 선 → 드라이버 다른 쪽 단자
모터 제어 핀 (L298N → 아두이노):
모터 1 제어 핀 → 아두이노 2번, 3번 핀 (디지털)
모터 2 제어 핀 → 아두이노 4번, 5번 핀
블루투스 모듈 (HC-05 → 아두이노):
TX → 아두이노 RX
RX → 아두이노 TX
VCC → 5V/VCC
GND → GND
배터리:
모터용 7.4V 배터리를 모터 드라이버 입력단자와 아두이노 VIN, GND에 연결. 공통 그라운드 필수.
6단계: 아두이노 프로그래밍
시리얼로 문자를 수신하면 해당 동작 수행:
'F' - 전진
'B' - 후진
'L' - 좌회전
'R' - 우회전
블루투스 모듈은 시리얼 포트(9600 bps)로 통신.
코드 설명
void setup() {
pinMode(lm1, OUTPUT); pinMode(lm2, OUTPUT);
pinMode(rm1, OUTPUT); pinMode(rm2, OUTPUT);
Serial.begin(9600);
}
void loop() {
while(Serial.available() == 0); // 데이터 수신 대기
val = Serial.read(); // 문자 읽기
if (val == 'F') { // 전진
digitalWrite(lm1, HIGH); digitalWrite(rm1, HIGH);
digitalWrite(lm2, LOW); digitalWrite(rm2, LOW);
}
else if (val == 'B') { // 후진
digitalWrite(lm2, HIGH); digitalWrite(rm2, HIGH);
digitalWrite(lm1, LOW); digitalWrite(rm1, LOW);
}
else if (val == 'R') { // 우회전
digitalWrite(lm1, HIGH); digitalWrite(rm2, HIGH);
digitalWrite(lm2, LOW); digitalWrite(rm1, LOW);
}
else if (val == 'L') { // 좌회전
digitalWrite(lm2, HIGH); digitalWrite(rm1, HIGH);
digitalWrite(lm1, LOW); digitalWrite(rm2, LOW);
}
else { // 정지
digitalWrite(lm1, LOW); digitalWrite(rm1, LOW);
digitalWrite(lm2, LOW); digitalWrite(rm2, LOW);
}
delay(10);
}
7단계: 음성 인식 안드로이드 앱 제작 (MIT App Inventor)
MIT App Inventor로 만든 음성 제어 앱
MIT App Inventor로 제작했으며, .aia 파일 을 다운로드해 수정·커스터마이징 가능합니다.
앱 동작 흐름:
HC-05 블루투스 모듈과 페어링 (기본 비밀번호: 1234 또는 0000)
구글 Speech-to-Text API로 음성을 텍스트 변환 (인터넷 필요)
소문자로 변환 후 if-else로 매칭
"forward" 감지 시 아두이노로 'F' 전송 → 전진
APK 파일로 빌드해 설치하거나 제공된 APK를 사용하세요.
8단계: 전원 켜고 앱 실행하고 출발!
배터리를 연결하고 안드로이드 앱으로 새 로봇을 조종해보세요!
코드
아두이노 전체 코드
/**** Arduino Speech/Voice Controlled Robot ***
* by Ashraf Minhaj
* mail: ashraf_minhaj@yahoo.com
* tutorial: ashrafminhajfb.blogspot.com
*/
int lm1 = 4; // 왼쪽 모터 핀
int lm2 = 5;
int rm1 = 2; // 오른쪽 모터 핀
int rm2 = 3;
char val;
void setup() {
pinMode(lm1, OUTPUT); pinMode(lm2, OUTPUT);
pinMode(rm1, OUTPUT); pinMode(rm2, OUTPUT);
Serial.begin(9600);
}
void loop() {
while(Serial.available() == 0);
val = Serial.read();
if (val == 'F') { // 전진
digitalWrite(lm1, HIGH); digitalWrite(rm1, HIGH);
digitalWrite(lm2, LOW); digitalWrite(rm2, LOW);
}
else if (val == 'B') { // 후진
digitalWrite(lm2, HIGH); digitalWrite(rm2, HIGH);
digitalWrite(lm1, LOW); digitalWrite(rm1, LOW);
}
else if (val == 'R') { // 우회전
digitalWrite(lm1, HIGH); digitalWrite(rm2, HIGH);
digitalWrite(lm2, LOW); digitalWrite(rm1, LOW);
}
else if (val == 'L') { // 좌회전
digitalWrite(lm2, HIGH); digitalWrite(rm1, HIGH);
digitalWrite(lm1, LOW); digitalWrite(rm2, LOW);
}
else { // 정지
digitalWrite(lm1, LOW); digitalWrite(rm1, LOW);
digitalWrite(lm2, LOW); digitalWrite(rm2, LOW);
}
delay(10);
}
회로도
Fritzing 회로도 (speech-controlled-robot-schematic_hUoWKpapKe.fzz)
GitHub
https://github.com/ashraf-minhaj/speech-controlled-robot