로봇과 대화하기: 간단한 음성 인식 로봇 프로젝트
페이지 정보
작성자 관리자 작성일 25-11-20 13:07 조회 274 댓글 0본문
로봇과 대화하기: 간단한 음성 인식 로봇 프로젝트
로봇과 대화하는 것은 마치 영화 속에서나 볼 법한 일처럼 느껴지지만, 사실 간단한 음성 인식 기술을 활용하면 우리만의 로봇도 명령에 반응하여 움직이게 할 수 있습니다. 이 프로젝트는 블루투스 모듈과 스마트폰 앱을 이용하여 로봇에게 음성으로 명령을 내리고 로봇이 움직이도록 하는 방법을 설명해 드립니다.
1단계: 음성 인식 로봇의 '원리' 이해하기
이 프로젝트의 음성 인식 로봇은 다음과 같은 원리로 작동합니다.
명령 (음성): 사용자가 스마트폰 마이크에 로봇에게 명령할 단어(예: "전진", "왼쪽")를 말합니다.
음성 인식 (스마트폰 앱): 스마트폰 앱이 사용자의 음성을 텍스트로 변환합니다.
데이터 변환 (스마트폰 앱): 앱은 인식된 텍스트에 해당하는 미리 정해진 문자(예: "전진" → 'F', "왼쪽" → 'L')를 만듭니다.
무선 전송 (블루투스): 스마트폰 앱이 이 명령 문자를 블루투스 통신을 통해 무선 신호로 변환하여 로봇에게 전송합니다.
명령 수신 (블루투스 모듈): 로봇에 연결된 HC-05 또는 HC-06 블루투스 모듈이 무선 신호를 받아 아두이노가 이해할 수 있는 디지털 신호(문자)로 바꿉니다.
판단 (아두이노): 아두이노가 블루투스 모듈로부터 받은 명령 문자(예: 'F')를 읽고, 그에 따라 어떤 움직임을 해야 할지 코드를 통해 판단합니다.
행동 (모터): 아두이노의 판단에 따라 모터 드라이버를 통해 로봇 바퀴의 모터를 제어하여 로봇을 움직입니다.
2단계: 필수 준비물 확인 및 구매
원격 제어 RC카 프로젝트와 대부분 동일하며, 여기에 스마트폰 음성 인식 앱이 추가됩니다.
컨트롤러:
아두이노 우노 R3 (Arduino Uno R3) 호환 보드: 1개
USB 케이블: 아두이노와 컴퓨터 연결용.
로봇 섀시:
2WD 로봇 자동차 섀시 키트: 1개 (모터 2개, 바퀴 2개, 프레임, 캐스터 포함)
액추에이터:
모터 드라이버 (L298N): 1개 (DC 모터 2개 제어용)
통신 모듈:
HC-05 또는 HC-06 블루투스 모듈: 1개
전원:
AA 배터리 홀더 (4개용): 1개 (모터 전원용)
AA 배터리: 4개
(선택 사항) 9V 배터리 & 스냅 커넥터: 아두이노 별도 전원용.
연결 재료:
브레드보드: 1개 (선택 사항)
점퍼 케이블 (수-수, 수-암): 넉넉하게
공구:
드라이버 세트, 니퍼, 양면테이프 또는 글루건.
스마트폰: 음성 인식 앱 설치용.
3단계: 로봇의 '몸' 조립하기 (기계적 조립)
RC카 프로젝트와 동일합니다.
로봇 섀시 조립: 프레임, 모터, 바퀴, 캐스터 등을 조립합니다.
아두이노/모터 드라이버 고정: 아두이노 보드와 L298N 모터 드라이버를 로봇 프레임에 단단히 고정합니다.
블루투스 모듈 고정: HC-06/HC-05 모듈을 로봇 프레임의 적절한 위치에 고정합니다 (양면테이프 이용).
4단계: 로봇의 '신경망' 연결하기 (전기 배선)
원격 제어 RC카 프로젝트와 동일하게 배선합니다. HC-06 RXD 핀의 전압 분배 회로에 주의하세요.
바퀴 모터와 L298N 모터 드라이버 연결
전원부 연결
L298N 드라이버와 아두이노 연결
HC-05/HC-06 블루투스 모듈과 아두이노 연결:
HC-06 VCC → 아두이노 5V
HC-06 GND → 아두이노 GND
HC-06 TXD → 아두이노 핀 2 (SoftwareSerial의 RX 핀으로 사용)
HC-06 RXD → 아두이노 핀 3 (SoftwareSerial의 TX 핀으로 사용)
(HC-06 RXD와 아두이노 핀 3 사이에 전압 분배 저항 회로 권장 - 1kΩ, 2kΩ)
배선 시 주의사항: 모든 배선은 전원이 없는 상태에서 하고, 정확한 연결을 거듭 확인해야 합니다.
5단계: 로봇의 '명령' 프로그래밍하기 (아두이노 코딩)
원격 제어 RC카 프로젝트의 코드와 거의 동일합니다.
5.1. 아두이노 IDE 설정 (이전 프로젝트와 동일)
5.2. 음성 인식 로봇 기본 코드 예시
cpp
#include <SoftwareSerial.h> // SoftwareSerial 라이브러리 포함
// 모터 제어 핀 정의 (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 핀)
// 블루투스 모듈 연결 핀 정의 (SoftwareSerial)
// HC-06 TXD -> Arduino Pin 2 (SoftwareSerial RX)
// HC-06 RXD -> Arduino Pin 3 (SoftwareSerial TX, 저항 분배 회로 권장)
SoftwareSerial btSerial(2, 3);
// 모터 속도 (0-255)
const int drive_speed = 180; // 주행 속도
const int turn_speed = 150; // 회전 속도
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);
Serial.begin(9600); // 컴퓨터 시리얼 모니터 시작 (디버깅용)
btSerial.begin(9600); // 블루투스 시리얼 통신 시작 (HC-06/05의 기본 통신 속도)
Serial.println("Voice Controlled Robot Ready!");
}
void loop() {
char command; // 스마트폰에서 수신할 명령어 저장 변수
// 블루투스 모듈로부터 데이터가 들어오면
if (btSerial.available()) {
command = btSerial.read(); // 한 글자(바이트) 읽어오기
Serial.print("Received command: ");
Serial.println(command);
// 수신된 명령어에 따라 로봇 제어
switch (command) {
case 'F': // Forward (전진)
moveForward();
break;
case 'B': // Backward (후진)
moveBackward();
break;
case 'L': // Turn Left (좌회전)
turnLeft();
break;
case 'R': // Turn Right (우회전)
turnRight();
break;
case 'S': // Stop (정지)
stopRobot();
break;
default: // 알 수 없는 명령은 무시하거나 정지
stopRobot();
break;
}
}
}
// 로봇 제어 함수들 (RC카 프로젝트와 동일)
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);
}
5.3. 코드 업로드 및 스마트폰 음성 인식 앱 준비
코드 업로드: 위 코드를 아두이노 IDE에 복사하여 붙여넣기 합니다. 스케치(Sketch) → 컴파일/업로드(Upload)를 클릭하여 코드를 아두이노 보드에 업로드합니다.
스마트폰 음성 인식 앱 준비:
구글 플레이 스토어(안드로이드)에서 'Arduino Voice Control', 'Voice Control for Arduino Bluetooth' 또는 Voice Bluetooth for Arduino 등과 같은 앱을 검색하여 설치합니다.
앱을 실행한 후 스마트폰의 블루투스를 켜고 HC-06/HC-05 모듈을 찾아 연결합니다. (모듈 초기 페어링 비밀번호는 보통 1234 또는 0000)
대부분의 음성 인식 앱은 사용자가 말하는 음성 명령(예: "Go Forward", "Turn Left", "Stop")을 미리 지정된 문자(예: 'F', 'L', 'S')로 매핑할 수 있는 기능을 제공합니다. 앱 설정에서 이를 구성합니다.
음성 명령을 말하여 로봇이 움직이는지 테스트합니다.
6단계: 로봇 테스트 및 최적화
초기 테스트: 로봇에 전원을 켜고 스마트폰 앱에 음성 명령을 내려 로봇이 예상대로 움직이는지 확인합니다.
명령어 정확도: 음성 인식 앱에서 명령어를 명확하게 인식하는지, 텍스트 변환이 정확한지 확인합니다. 잘 인식되지 않는다면 앱 설정에서 음성 명령 단어를 재조정하거나, 더 쉬운 단어로 바꿔봅니다.
모터 방향/속도 조절: RC카 프로젝트와 동일하게 drive_speed, turn_speed 값을 조정하거나 모터 제어 로직을 수정합니다.
블루투스 연결 안정성: 연결이 불안정하다면, 스마트폰과 로봇 간의 거리를 확인하고 주변의 다른 무선 장치 간섭 여부를 확인합니다.
커스텀 음성 명령: 다양한 음성 명령을 추가하여 로봇에게 춤을 추게 하거나, 불빛을 켜고 끄는 등 새로운 행동을 시켜볼 수 있습니다.
축하합니다! 이제 당신만의 음성 인식 로봇이 완성되었습니다!
블루투스 모듈과 스마트폰 앱을 활용하여 로봇과 직접 대화하고 명령을 내리는 경험은 로봇 공학의 가장 매력적인 부분 중 하나입니다. 이 프로젝트를 통해 '말하는 대로 움직이는' 로봇을 만들며 미래 기술을 직접 체험해 보세요. 이제 로봇과 함께 즐거운 대화를 나누시길 바랍니다!
댓글목록 0
등록된 댓글이 없습니다.
