아두이노와 안드로이드 블루투스 연동: 무선 프로젝트 제작 가이드
부품 및 소모품
| 부품 |
수량 |
| 아두이노 우노 (Arduino UNO) |
1 |
| HC-06 블루투스 모듈 |
1 |
| LED (범용) |
1 |
앱 및 온라인 서비스
- 아두이노 IDE
- MIT 앱 인벤터 2 (MIT App Inventor 2)
프로젝트 개요
블루투스(BT)는 오늘날 가장 널리 사용되는 근거리 무선 통신 기술입니다. 스마트폰, 스피커, 카메라 등 다양한 기기가 '파란 불빛'으로 연결되는 모습을 일상에서 흔히 볼 수 있습니다.
IoT 및 자동화 분야에서는 블루투스 기술을 활용한 모바일 원격 제어가 매우 일반적입니다. 이는 두 가지 핵심 요소 덕분입니다:
- 안드로이드 앱 개발이 쉬운 플랫폼 (MIT 앱 인벤터 2 등)
- 저렴한 블루투스 모듈 (HC-06 등)
본 튜토리얼에서는 모바일 기기를 통해 아두이노의 출력을 제어하여 로봇을 움직이거나 가정의 조명을 켜는 등 다양한 응용 아이디어를 다룹니다.
1단계: 블루투스 모듈과 아두이노 연결
시중에는 '마스터-슬레이브' 방식의 BT 3.0 모듈(HC-05)과 '슬레이브' 전용 모듈(HC-06)이 흔합니다. 최근에는 BT 4.0/BLE(Bluetooth Low Energy) 방식인 HC-08, HC-10도 등장했습니다. BLE 모듈만 아이폰과 연결 가능하며, 애플은 BT 3.0을 지원하지 않습니다.
본 프로젝트에서는 대중적이고 저렴한 HC-06을 사용합니다. HC-06은 5V로 구동되어 아두이노 우노와 직접 연결하기 쉽습니다. Tx/Rx 핀도 전압 분배기 없이 우노에 직결 가능합니다(ESP8266과 달리).
일반적으로 HC-06은 아두이노의 0번(Rx), 1번(Tx) 핀('시리얼 0')에 연결하지만, 프로그램 업로드 시 USB 포트와 충돌하므로 모듈을 분리해야 하는 번거로움이 있습니다. 이를 피하려면 SoftwareSerial 라이브러리를 이용해 10번(Rx), 11번(Tx) 핀으로 소프트웨어 시리얼 포트를 구성하면 편리합니다.
2단계: HC-06 테스트 및 설정
HC-06을 테스트하고 AT 명령어로 설정하는 간단한 코드입니다.
#include <SoftwareSerial.h>
SoftwareSerial BT(10, 11); // RX, TX
String command = "";
void setup() {
Serial.begin(9600);
Serial.println("AT 명령어 입력");
BT.begin(9600); // HC-06 기본 보드레이트
}
void loop() {
if (BT.available()) {
while (BT.available()) {
delay(10);
char c = BT.read();
command += c;
}
Serial.println(command);
command = "";
}
if (Serial.available()) {
delay(10);
BT.write(Serial.read());
}
}
업로드 후 시리얼 모니터로 기본 테스트를 진행합니다:
AT 전송 → OK 응답 확인
AT+VERSION → 펌웨어 버전 확인 (예: linvorV1.8)
AT+NAME<이름> → 모듈 이름 설정 (응답: OKsetname)
- 기본 PIN:
1234, 변경: AT+PINxxxx (4자리 숫자)
3단계: 안드로이드 기기 연동
구글 플레이 스토어에는 다양한 블루투스 제어 앱이 있습니다. 본 튜토리얼에서는 필자가 MIT 앱 인벤터 2로 제작한 'MJRoBot BT Digital Analog Voice Control' 앱을 사용합니다. 이 앱은 버튼/음성으로 디지털 명령과 아날로그 명령(PWM 제어용 0~255 값)을 전송합니다.
- 앱 다운로드 및 설치
- 안드로이드 설정 → 블루투스에서 HC-06 검색 및 페어링 (PIN: 1234 또는 변경한 값)
- 앱 실행 → 모듈 선택 → CONNECTED 표시 확인
- 앱 버튼 테스트: 시리얼 모니터에
dev1on dev1off dev2on dev2off... 등 수신 데이터 확인
4단계: 아두이노 출력 제어 (LED 제어)
앱의 버튼과 슬라이더로 LED 4개의 ON/OFF 및 밝기(PWM)를 제어하는 회로입니다.
연결 구성
| 장치 |
명령 |
LED 색상 |
아두이노 핀 |
비고 |
| Device 1 |
dev1on / dev1off |
빨강 |
3 (PWM) |
PWM 핀(~ 표시) 사용 |
| Device 2 |
dev2on / dev2off |
노랑 |
5 (PWM) |
| Device 3 |
dev3on / dev3off |
초록 |
6 (PWM) |
| Device 4 |
dev4on / dev4off |
파랑 |
9 (PWM) |
슬라이더 제어 시 문자 접두사 + PWM 값(0~255) 형식으로 전송:
- Dev A0:
r/0-255 → 빨강 LED (핀 3)
- Dev A1:
y/0-255 → 노랑 LED (핀 5)
- Dev A2:
g/0-255 → 초록 LED (핀 6)
- Dev A3:
b/0-255 → 파랑 LED (핀 9)
5단계: 음성 명령으로 IoT 기기 제어
안드로이드의 음성 인식 기능을 활용해 "TV 켜기" 같은 음성 명령을 텍스트로 변환해 아두이노로 전송합니다. 아두이노 코드에서 수신 문자열을 파싱하여 해당 동작(예: 녹색 LED 점등 = TV 릴레이 제어)을 수행합니다. 구글 음성 인식 결과와 코드 내 문자열이 정확히 일치해야 하므로, 자국어(한국어 등)로 짧고 명확한 명령어를 등록하는 것이 좋습니다.
MIT 앱 인벤터 2용 .aia 소스 파일을 제공하므로 직접 수정·확장 가능합니다.
6단계: 결론
블루투스, 안드로이드, 아두이노의 조합으로 '사물'을 제어하는 무한한 가능성을 확인할 수 있었습니다. 이 튜토리얼이 전자공학, 로봇공학, IoT 입문자에게 도움이 되길 바랍니다. 더 많은 프로젝트는 MJRoBot.org에서 확인하세요.
남반구에서 인사드립니다! 다음 튜토리얼에서 뵙겠습니다. 감사합니다. — 마르셀로
소스 코드
코드 1: HC-06 테스트용 기본 스케치
#include <SoftwareSerial.h>
SoftwareSerial BT(10, 11);
String command = "";
void setup() {
Serial.begin(9600);
Serial.println("Type AT commands");
BT.begin(9600);
}
void loop() {
if (BT.available()) {
while (BT.available()) {
delay(10);
char c = BT.read();
command += c;
}
Serial.println(command);
command = "";
}
if (Serial.available()) {
delay(10);
BT.write(Serial.read());
}
}
코드 2: LED 제어 메인 스케치 (파일명: FA44NBUIL8LGGAY.ino)
전체 코드는 원문 첨부 파일을 참조하세요. 버튼 명령(dev1on 등)과 슬라이더 명령(r/128 등)을 파싱하여 해당 핀에 digitalWrite/analogWrite로 제어하는 구조입니다.
코드 3: 앱에서 전송되는 샘플 데이터
dev1on dev1off dev2on dev2off dev3on dev3off dev4on dev4off