아두이노 & 비트보이서로 만드는 2륜 음성 제어 로봇
부품 및 소모품
| 아두이노 우노 R3 |
1개 |
| Pololu Dual MC33926 모터 드라이버 실드 |
1개 (5-28V, 채널당 3A 연속) |
| SparkFun XBee 실드 |
1개 |
| Microchip RN171VX WiFi 모듈 (안테나 포함) |
1개 (XBee 폼팩터 호환) |
| SparkFun 일렉트렛 마이크 브레이크아웃 (증폭 내장) |
1개 |
| 2WD 로봇 섀시 키트 |
1개 (아크릴 베이스, 기어드 모터 2개, 360° 캐스터, AA 배터리 홀더 포함) |
| LM1117 3.3V 레귤레이터 (TO-220) + 10µF 전해 커패시터 |
각 1개 (ADC 레퍼런스 전압 안정화용) |
| LED 4개 + 330Ω 저항 4개 |
상태 표시용 |
| AA 배터리 4개 (모터용) + 9V 배터리 1개 (아두이노용) + 배럴 잭 어댑터 |
전원 공급 |
| 점퍼 와이어, 구리 와이어, 나사, 플라스틱 클램프, 납땜 도구 |
조립용 |
필요 도구
소프트웨어
- BitVoicer Server 1.0 (유료 라이선스 필요)
- 아두이노 IDE + Pololu 모터 드라이버 라이브러리 + BitVoicer 라이브러리(BVSP, BVSMic)
작동 원리
- 마이크가 음성을 수집·증폭
- 아두이노 ADC로 디지털화 및 버퍼링
- RN171VX WiFi 모듈로 BitVoicer Server에 오디오 스트림 전송
- 서버에서 음성 인식 후 사전 정의된 명령으로 매핑
- 명령을 아두이노로 전송 (TCP/IP)
- 아두이노가 명령 해석 → 모터 속도/방향/시간 결정
- 모터 드라이버가 모터 구동
제작 단계
Step 1: 부품 이해 및 준비
- 아두이노 우노: 가장 대중적이라 선택. 두에(Due) 사용 시 음성 응답 추가 가능.
- Pololu 모터 드라이버: 문서가 훌륭하고 라이브러리 간편(
setSpeeds(좌, 우), -400~+400). 사용 핀: D4,7,8,9,10,12, A0,A1. PWM은 D9,D10(타이머1) 사용하여 BitVoicer의 타이머2와 충돌 방지.
- RN171VX WiFi: 시리얼 명령으로 간편 설정. XBee 실드와 호환. 주의: WiFi 전송 시 ADC 노이즈 발생 문제 → 3.3V 레귤레이터+커패시터로 ADC 레퍼런스 별도 공급하여 해결.
- 상태 LED 4개 (XBee 실드 프로토 영역에 납땜):
- 서버 실행/연결 상태
- 데이터 포워딩 상태
- 음성 인식 엔진 할당 여부
- 활성화 단어 감지 기간 표시
- 마이크: 아날로그 출력, 100배 증폭 이상 권장. 철사 스탠드 + 펠트/스펀지로 진동/소음 차단 시도.
Step 2: 기계적 조립
사진 참조. 섀시 위에 아두이노+실드 스택 올리고, 배터리 홀더, 마이크 스탠드 고정. 브레드보드 대신 실드 프로토 영역 활용 권장.
Step 3: WiFi 모듈 설정
시리얼로 $$$ → 명령 모드 진입 → SSID, 비밀번호, 고정 IP, 포트 등 설정 → save → exit. XBee 실드의 DLINE/UART 스위치: 업로드 시 DLINE, 실행 시 UART.
// WiFi Module Setup 스케치 주요 부분
Serial.begin(115200);
delay(5000);
Serial.print("$$$"); delay(1000);
Serial.println("set wlan auth 4"); // WPA2
Serial.println("set wlan phrase YOUR_PASSWORD");
Serial.println("set wlan ssid YOUR_SSID");
Serial.println("set ip dhcp 0");
Serial.println("set ip address 192.168.0.XX"); // 원하는 고정 IP
Serial.println("set comm open 0");
Serial.println("set comm size 500");
Serial.println("set comm time 50");
Serial.println("set uart baud 115200");
Serial.println("save"); delay(1000);
Serial.println("exit");
설정 후 핑 테스트로 확인.
Step 4: 로봇 움직임 설계
엔코더/초음파 센서 없이 모터 속도/시간만으로 제어. 기준 속도 측정(예: 62.5% 속도에서 13.7cm/s) 후 거리→시간 환산. 회전/아크 운동은 삼각함수 활용. 복잡한 움직임(사각형, 삼각형, 원 그리기)은 BitVoicer 서버 측에서 기본 명령 시퀀스로 조합.
Step 5: 아두이노 메인 코드 업로드
BVS_Demo3.ino 업로드 (DLINE 모드). 주요 구성:
- 상수: 모터 속도(STOP/SLOW/NORMAL/FAST), 방향, 명령 바이트 값(0~39)
- 실행 제어 변수:
motorSpeed, cmdDuration, cmdStartTime, cmdRunning, lastFwdCmd
- WiFi 연결/재연결:
Connect()/Disconnect()로 TCP 세션 관리
- RunCommand(): 수신된 명령 바이트에 따라 모터 속도/시간 설정,
cmdRunning=true로 타이머 시작
- 메인 루프: 연결 유지, 오디오 스트리밍(BVSMic), 명령 수신(BVSP), 명령 만료 시 모터 정지
Step 6: BitVoicer Server 보이스 스키마 구성
- 디바이스 'ArduinoUnoWiFi' 생성 (TCP/IP, 고정 IP). Cue로 활성화 기간 LED 제어.
- 문장(Sentence) 정의: 같은 명령에 여러 문장 매핑 가능(예: "move forward one meter", "go forward one meter").
- 복합 명령: 여러 기본 명령을 지연 시간 두고 순차 전송 (예: "do a square" → 전진, 회전 반복).
- 기본 명령(Default Command) 설정, 명령 복사/붙여넣기로 효율화.
솔루션 오브젝트 파일(Device.sof, VoiceSchema.sof)로 일괄 임포트 가능.
Step 7: 실행 및 테스트
AA 배터리 + 9V 배터리 연결 → UART 스위치 확인 → 전원 온. 상태 LED 3개 점등되면 준비 완료. 음성 명령으로 로봇 제어.
회고 및 개선점
- 음성 인식률은 만족스러웠으나, 모터 오픈루프 제어라 이동 정밀도 낮음.
- 개선: 휠 엔코더(키트 동봉 디코더 디스크 활용) + 초음파 센서 추가로 정밀 이동 및 장애물 회피 구현 예정.
코드 및 회로도
전체 아두이노 스케치(BVS_Demo3.ino), WiFi 설정 스케치, 회로도 이미지, 솔루션 오브젝트 파일 제공.