이 아두이노 튜토리얼에서는 두 개의 HC-05 블루투스 모듈을 마스터와 슬레이브 장치로 설정하고 페어링하는 방법을 배웁니다. 아래 비디오를 시청하거나 작성된 튜토리얼을 읽어보세요.
개요
이전 두 튜토리얼에서 HC-05 블루투스 모듈을 아두이노에 연결하고 안드로이드 스마트폰과 아두이노 간 통신하는 방법을 배웠습니다. 그때는 HC-05를 기본 설정인 슬레이브 모드로 사용했습니다.
HC-05 블루투스 모듈 설정 – AT 명령어
이 튜토리얼에서는 두 모듈 모두를 설정해야 합니다. 이를 위해 AT 명령 모드로 진입해야 하는데, 방법은 다음과 같습니다. 먼저 이전 튜토리얼의 회로도대로 블루투스 모듈을 아두이노에 연결합니다. 추가로 블루투스 모듈의 "EN" 핀을 5V에 연결하고 아두이노 보드의 TX, RX 핀을 서로 바꿔 연결합니다.
아두이노 RX 핀을 블루투스 모듈 RX 핀에(전압 분배기 통해), 아두이노 TX 핀을 블루투스 모듈 TX 핀에 연결합니다. "EN" 핀 위의 작은 버튼을 누른 채로 모듈에 전원을 공급하면 명령 모드에 진입합니다. 블루투스 모듈 LED가 2초마다 깜빡이면 AT 명령 모드 진입 성공입니다.
이후 아두이노에 빈 스케치를 업로드합니다(업로드 시 RX, TX 라인은 분리). 시리얼 모니터를 실행하고 "Both NL and CR", "38400 baud"를 선택합니다(블루투스 모듈 기본 보드레이트). 이제 명령 전송 준비 완료. 명령 형식은 다음과 같습니다.
모든 명령은 "AT"로 시작, "+" 기호, 순이며, "?"로 현재 값 조회, "="로 새 값 설정.
슬레이브 설정
예를 들어 "AT"(테스트 명령) 전송 → "OK" 반환. "AT+UART?" → 기본 보드레이트 38400 반환. "AT+ROLE?" → "+ROLE=0" 반환(슬레이브 모드). "AT+ADDR?" → 블루투스 모듈 주소 반환, 예: 98d3:34:905d3f.
이 주소를 적어두세요. 마스터 장치 설정 시 필요합니다. 슬레이브 설정 시 주소 확인만 하면 되지만, 이름, 보드레이트, 페어링 비밀번호 등 다양한 파라미터 변경 가능(이 예제에서는 생략).
마스터 설정
이제 다른 블루투스 모듈을 마스터로 설정합니다. 먼저 보드레이트가 슬레이브와 같은 38400인지 확인. "AT+ROLE=1"로 마스터 모드 설정. "AT+CMODE=0"으로 연결 모드를 "고정 주소"로 설정. "AT+BIND=" 명령어로 앞서 적어둔 슬레이브 주소 설정.
주소 입력 시 콜론(:) 대신 콤마(,) 사용. "AT+CMODE"에 "0" 대신 "1"을 넣으면 마스터가 전송 범위 내 아무 기기나 연결하지만 보안상 덜 안전. 전체 명령어와 파라미터 목록: HC-05 AT Commands List
기본 설정 완료. 이제 일반 데이터 모드로 재연결하고 모듈 전원을 다시 켜면 몇 초 내에 마스터가 슬레이브에 연결됩니다. 두 모듈 모두 2초마다 깜빡이며 성공적 연결을 나타냅니다.
두 HC-05 블루투스 모듈 간 통신 예제
실습 예제 준비. 회로도는 다음과 같습니다. 마스터 측에서 포텐쇼미터로 슬레이브 측 서보 모터 제어, 반대로 슬레이브 측 푸시 버튼으로 마스터 측 LED 제어.
필요한 부품은 아래 사이트에서 구할 수 있습니다:
HC-05 블루투스 모듈 …………….
아두이노 보드 ……………………………
서보 모터…………………………….….
포텐쇼미터……………..………..…….
220옴 저항 3개…………………
브레드보드와 점퍼 와이어 ……….
아두이노 소스 코드
설명: 핀 정의와 프로그램 필요 변수 정의. setup에서 마스터 측 LED 핀을 출력으로 설정하고 바로 로우, 시리얼 통신 38400 보드레이트 시작. 슬레이브 측도 버튼 핀 입력 설정, 서보 연결 핀 정의, 같은 보드레이트로 시리얼 통신 시작.
loop에서 양쪽 코드 모두 Serial.available()로 시리얼 포트 읽을 데이터 있는지 확인, Serial.read()로 읽어 "state" 변수에 저장. 마스터가 슬레이브에서 버튼 눌림 시 전송되는 문자 '1' 수신하면 LED 켜기, '0'이면 끄기.
서보 모터 제어: 마스터에서 포텐쇼미터 값 읽어 0~255 범위로 매핑, 이 값을 슬레이브로 전송, 슬레이브는 받아서 서보 모터 회전.
마스터 코드:
/*
* HC-05 블루투스 모듈 두 개 마스터/슬레이브 페어링 설정
* by Dejan Nedelkovski, www.HowToMechatronics.com
* == 마스터 코드 ==
*/
#define ledPin 9
int state = 0;
int potValue = 0;
void setup() {
pinMode(ledPin, OUTPUT);
digitalWrite(ledPin, LOW);
Serial.begin(38400); // 블루투스 모듈 기본 통신 속도
}
void loop() {
if (Serial.available() > 0) {
state = Serial.read();
}
// LED 제어
if (state == '1') {
digitalWrite(ledPin, HIGH);
state = 0;
} else if (state == '0') {
digitalWrite(ledPin, LOW);
state = 0;
}
// 포텐쇼미터 읽기
potValue = analogRead(A0);
int potValueMapped = map(potValue, 0, 1023, 0, 255);
Serial.write(potValueMapped); // 서보 모터로 전송
delay(10);
}코드 언어: Arduino (arduino)
슬레이브 코드:
/*
* HC-05 블루투스 모듈 두 개 마스터/슬레이브 페어링 설정
* by Dejan Nedelkovski, www.HowToMechatronics.com
* == 슬레이브 코드 ==
*/
#include <Servo.h>
#define button 8
Servo myServo;
int state = 20;
int buttonState = 0;
void setup() {
pinMode(button, INPUT);
myServo.attach(9);
Serial.begin(38400);
}
void loop() {
if (Serial.available() > 0) {
state = Serial.read();
}
// 서보 모터 제어
myServo.write(state);
delay(10);
// 버튼 읽기
buttonState = digitalRead(button);
if (buttonState == HIGH) {
Serial.write('1'); // 마스터로 '1' 전송해 LED 켜기
} else {
Serial.write('0');
}
}코드 언어: Arduino (arduino)