H.LAB
블루투스로 스위치 제어하기 - 1 (Control the switch with Bluetooth) 본문
복층에 살고 있는데 1층에 전등 스위치가 있어 불끄는 것이 생각보다 귀찮다.
아이폰을 쓰고 있고 아두이노로 제어를 하면 재밌을 것 같아 시작한 프로젝트다.
Chat GPT 도움을 받아 프로젝트를 진행했다.
C언어 문법은 잘 모르기에 하면서 배워나가려 한다.
프로젝트 목표
- 아이폰 -> 블루투스 모듈(HM-10) -> 아두이노 우노 -> 서보모터 제어 -> 3D 프린터 출력 물로 기존 스위치를 물리적으로 누르기.
- 전원은 18650 배터리를 사용해 아두이노와 서보모터에 공급
GPT한테 하고 싶은 프로젝트를 얘기했고,
필요한 부품 중 없는 부품은 알리익스프레스에서 구매했다.
필요한 부품 리스트 | |
1 | 아두이노 우노 |
2 | 블루투스 모듈 HM-10 |
3 | 서보 모터 (SG90 또는 MG996R) |
4 | 18650 배터리 |
5 | DC-DC 전압 조정 모듈 (MT3608) |
6 | 18650 홀더(Mr.아재) https://youtu.be/5FejHAyJl4I?si=_bAzqn59lFjolGr4 |
7 | 점퍼 케이블 및 브레드 보드 |
8 | 멀티미터 |
<작업 흐름>
1. 아이폰에서 BLE 앱을 통해 신호를 보냄.2. 아두이노가 블루투스 모듈을 통해 신호를 수신.3. 아두이노가 서보모터를 제어해 움직임을 수행.4. 서보모터가 3D 프린터 출력물을 움직여 기존 스위치를 눌러 전등 제어.
제품이 도착하기 전 Frizing으로 회로를 그려봤다.
많이 복잡하게 보이지만 생각보다 간단하다.

1. 18650 +와 MT3608 VIN + 연결, 18650 -와 MT3608 VIN -끼리 연결.
2. MT3608 OUT +, -에서 5V 가 나오는지 멀티미터 DC 전압 체크로 확인.
3. MT3608 OUT +, -를 브레드 보드 +, - 라인에 연결.
4. 브레드 보드 + 라인에 아두이노 5V, 서보모터 + 를 연결, 브레드 보드 - 라인에 아두이노 GND, 서보모터 GND를 연결.
5. 블루투스 모듈 vcc와 아두이노 3.3V 연결, 블루투스 모듈 GND와 브레드 보드 - 라인 연결.
6. 블투 모듈 RX와 아두이노 디지털 3핀 연결, 블투 모듈 TX와 아두이노 2핀 연결.
(처음에 아두이노 0 핀과 1핀에 RX, TX가 적혀있어 연결 했는데 이렇게 연결하면 통신이 안되어 <SoftwareSerial.h> 라이브러리를 추가 후 아두이노 디지털 핀 2, 3번을 설정해줘야 함. 아래 코드를 확인할 것.)
7. 서보모터 제어용 핀과 아두이노 디지털 핀(ex. 9번 핀)을 연결.
Frizing에선 블루투스 통신을 구현할 수 없다하여 일단 회로만 만들어보며 시뮬레이션을 했다.
Frizing에 없는 파일은 인터넷으로 검색하니 쉽게 구할 수 있었다.
기다리던 부품들이 다 도착 후 그려둔 회로도를 그림으로 인쇄하여 부품을 체크했다.
회로 설계 도면에서는 내가 추가한 부품들 중 몇 개가 제대로 뜨지 않아 그림으로 출력했다.
막상 모아두니 별거 없었는데 혹시 모를 쇼트에 조금 겁은 났다.

처음으로 무선 통신과 배터리로 전원 공급하는데 성공!
문제는... LightBlue Explore 어플로 연동을 시도 했는데 저가형 호환 블루투스 모듈을 사서 그런건지.. 연결은 됐지만 통신은 안됐다.
몇 시간 찾아봤지만 해결이 안되어 다음날로 미뤘다.
다음날. 역시 전날에 안되는건 다음날에 된다!
전날에 봤던 방법을 다시 꼼꼼하게 읽어보고 코드를 추가, 삭제하며 결국 통신에 성공!
아이폰으로 서보모터 제어에 성공했다.
문제의 원인은 <SoftwareSerial.h> 파일을 include 해주고 몇 가지 코드를 추가해야 했다.
#include <SoftwareSerial.h> // SoftwareSerial 라이브러리 추가, 블루투스 모듈과 시리얼 모니터를 동시에 사용 가능.
#include <Servo.h> //서보 모터 제어 라이브러리
// SoftwareSerial 핀 설정
SoftwareSerial BTSerial(2, 3);
Servo myServo; // 서보 모터 객체 생성
int servoPin = 9; // 서보 모터 핀
int angle = 0; // 초기 각도
void setup() {
// 블루투스 통신 초기화
BTSerial.begin(9600); // HM-10과 통신 설정
Serial.begin(9600); // 블루투스 통신을 위한 시리얼 통신 시작
myServo.attach(servoPin); // 서보 모터 제어 핀 설정
Serial.println("Ready to receive commands: '1' for 90 degs, '0' for 0 degs.");
}
void loop() {
// 블루투스 데이터 처리
if (BTSerial.available()) {
char command = BTSerial.read();
handleCommand(command);
}
// PC 시리얼 모니터 데이터 처리
if (Serial.available()) {
char command = Serial.read();
handleCommand(command);
}
}
// 명령어 처리 함수
void handleCommand(char command) {
if (command == '1') { // '1' 명령어: 서보 모터 90도로 회전
angle = 90;
myServo.write(angle);
Serial.println("Servo moved to 90 degs");
}
else if (command == '0') { // '0' 명령어: 서보 모터 0도로 회전
angle = 0;
myServo.write(angle);
Serial.println("Servo moved to 0 degs");
}
else {
Serial.println("Invalid command. Send '1' or '0'.");
}
}
후.. 한 차례 큰 산은 넘었으니 여기에 맞는 기구물 설계만 남았다.
'[Make] > PROJECT' 카테고리의 다른 글
블루투스로 스위치 제어하기 - 2 (Control the switch with Bluetooth) (0) | 2025.01.01 |
---|