C#과 아두이노 우노로 만드는 간단 음성 인식 제어 시스템
프로젝트 개요
별도의 음성 인식 모듈 없이, PC의 내장 마이크 또는 이어폰 마이크와 C#(.NET Framework)의 System.Speech 라이브러리를 활용해 음성 명령으로 아두이노의 LED를 제어하는 입문자용 프로젝트입니다. 2020년 업데이트 튜토리얼은 Medium에서 확인 가능합니다.
동작 원리
- PC에서 C# 윈폼 앱 실행:
System.Speech.Recognition으로 음성 인식 엔진 구동
- 사전 정의된 명령어("Blue On", "Red Off" 등) 인식 시 해당 문자('B', 'X' 등)를 시리얼 포트로 아두이노 전송
- 아두이노: 시리얼 수신 문자 파싱하여 해당 LED ON/OFF (디지털 핀 8, 9, 10)
하드웨어 구성
| 부품 | 수량 | 비고 |
| 아두이노 우노 | 1 | |
| LED (파랑, 빨강, 초록) | 각 1 | |
| 220Ω 저항 (임의 값 가능) | 3 | LED 전류 제한 |
| 브레드보드 | 1 | |
| 점퍼 와이어 | 1세트 | |
| 마이크 내장 이어폰 또는 PC 내장 마이크 | 1 | 음성 입력용 |
회로도
- 파랑 LED +극 → D10, -극 → 저항 → GND
- 빨강 LED +극 → D9, -극 → 저항 → GND
- 초록 LED +극 → D8, -극 → 저항 → GND
- 아두이노 GND → 브레드보드 공통 그라운드
소프트웨어 준비
- 아두이노 IDE 설치 및 스케치 업로드
- 마이크로소프트 비주얼 스튜디오 (2010 이상, .NET Framework 포함) 설치
- C# 윈폼 프로젝트 생성 후 참조 추가 → .NET → System.Speech 체크
- 코드 내 COM 포트(
myPort.PortName = "COM5")를 본인 환경에 맞게 수정 (아두이노 IDE와 동일해야 함)
아두이노 스케치 (C/C++)
const int blueLed = 10;
const int redLed = 9;
const int greenLed = 8;
char incomingData = '0';
void setup() {
Serial.begin(9600);
pinMode(blueLed, OUTPUT);
pinMode(redLed, OUTPUT);
pinMode(greenLed, OUTPUT);
}
void loop() {
incomingData = Serial.read();
switch (incomingData) {
case 'B': digitalWrite(blueLed, HIGH); break; // Blue On
case 'R': digitalWrite(redLed, HIGH); break; // Red On
case 'G': digitalWrite(greenLed, HIGH); break; // Green On
case 'Z': digitalWrite(blueLed, LOW); break; // Blue Off
case 'X': digitalWrite(redLed, LOW); break; // Red Off
case 'C': digitalWrite(greenLed, LOW); break; // Green Off
case 'V': // All On
digitalWrite(blueLed, HIGH);
digitalWrite(redLed, HIGH);
digitalWrite(greenLed, HIGH);
break;
case 'M': // All Off
digitalWrite(blueLed, LOW);
digitalWrite(redLed, LOW);
digitalWrite(greenLed, LOW);
break;
}
}
C# 윈폼 코드 핵심 부분
// 음성 인식 엔진 설정
SpeechRecognitionEngine re = new SpeechRecognitionEngine();
SpeechSynthesizer ss = new SpeechSynthesizer(); // 음성 합성(피드백용)
Choices commands = new Choices();
commands.Add(new string[] {
"Blue On", "Red On", "Green On",
"Blue Off", "Red Off", "Green Off",
"All On", "All Off",
"Exit", "Arduino Say Good Bye to makers"
});
Grammar gr = new Grammar(new GrammarBuilder(commands));
re.LoadGrammarAsync(gr);
re.SetInputToDefaultAudioDevice();
re.SpeechRecognized += re_SpeechRecognized;
re.RecognizeAsync(RecognizeMode.Multiple);
// 인식 이벤트 핸들러
void re_SpeechRecognized(object sender, SpeechRecognizedEventArgs e) {
switch (e.Result.Text) {
case "Blue On": sendDataToArduino('B'); break;
case "Red On": sendDataToArduino('R'); break;
case "Green On": sendDataToArduino('G'); break;
case "Blue Off": sendDataToArduino('Z'); break;
case "Red Off": sendDataToArduino('X'); break;
case "Green Off": sendDataToArduino('C'); break;
case "All On": sendDataToArduino('V'); break;
case "All Off": sendDataToArduino('M'); break;
case "Arduino Say Good Bye to makers":
ss.SpeakAsync("Good Bye Makers"); break;
case "Exit": Application.Exit(); break;
}
// 인식된 명령 텍스트박스에 기록
txtCommands.Text += e.Result.Text + Environment.NewLine;
}
void sendDataToArduino(char c) {
myPort.Open();
myPort.Write(c.ToString());
myPort.Close();
}
실행 방법
- 아두이노 USB 연결 → 스케치 업로드 → 시리얼 모니터로 COM 포트 확인
- C# 프로젝트 COM 포트 설정 일치 확인
- C# 앱 실행 → "Start" 버튼 클릭 → "Voice Recognition Started!" 메시지 확인
- 마이크에 대고 명령어 말하기 (예: "Blue On", "All Off")
확장 아이디어
- 릴레이 모듈로 실제 조명/가전 제어
- 서보 모터, DC 모터 제어 명령 추가
- 센서 값 읽어 음성으로 피드백 (System.Speech.Synthesis 활용)
- 한국어 음성 인식: Windows 음성 인식 언어 팩 설치 후 CultureInfo 설정 변경 필요
주의사항
System.Speech 라이브러리 참조 필수 (프로젝트 → 참조 추가 → .NET 탭에서 체크)
- 아두이노 IDE와 C# 코드의 COM 포트, 보드레이트(9600) 반드시 일치
- 마이크 권한 허용, 주변 소음 적은 환경 권장
- 초기 연결 시 아두이노 리셋 몇 회 필요할 수 있음