memo6759 님의 블로그
2025-10-16(서브모터 제어, MQTT 통신 (자바)) 본문
서브모터 제어 원리
서브 모터는
PWM 신호의 듀티사이클에 따라 축이 특정 각도로 회전
즉, pwm의 펄스 폭을 바꾸면 > 모터 움직이는 각도가 바뀌게 된다
# 서브모터가 0도부터 180도까지 움직임을 나타낼 수 있도록 제어해보기
import RPi.GPIO as gpio
from time import sleep
servo_pin = 20
gpio.setmode(gpio.BCM)
gpio.setup(servo_pin,gpio.OUT)
pwm = gpio.PWM(servo_pin,50)
# 서보에 힘이 들어가 있지 않은 상태에서 작업을 하는 거라
# 시작할때 서보의 떨림 현상이 더 발생할 수 있다.
pwm.start(3) # 듀티사이클 0
def set_servo_degree(degree):
if degree > 180:
degree = 180
elif degree<0:
degree = 0
duty = degree /18 +2.5
# 매개변수로 전달 받은 각도를 듀티비로 환산해서 서보모터에 전달
try:
while True:
set_servo_degree(0)
sleep()
set_servo_degree(50)
sleep()
set_servo_degree(90)
sleep()
set_servo_degree(130)
sleep()
set_servo_degree(180)
sleep()
pwm.ChangeDutyCycle(3)
finally:
pwm.stop()
gpio.cleanup()
각도듀티사이클(대략)설명
| 0° | 2.5% | 가장 왼쪽 |
| 90° | 7.5% | 가운데 |
| 180° | 12.5% | 가장 오른쪽 |
각도를 듀티사이클로 변환하는 계산식
→ 0°일 때: 0/18 + 2.5 = 2.5
→ 180°일 때: 180/18 + 2.5 = 12.5

라즈베리파이 + 자바 MQTT 통신 요약
1. 전체 개요
- MQTT는 IoT(사물인터넷)에서 자주 쓰는 경량 메시지 프로토콜
- Publisher → Broker → Subscriber 구조
- 라즈베리파이: MQTT 클라이언트로서 메시지 발행·구독
- 자바 프로젝트: Eclipse에서 MQTT 연결 및 제어 구현
역할설명
| Publisher | 브로커(Broker)에 메시지를 전송 (publish) |
| Subscriber | 브로커로부터 메시지를 수신 (subscribe) |
| Broker | 메시지를 중개하는 서버 |
2. 자바 프로젝트 설정
- 프로젝트 생성 후 JDBC와 MQTT 연동 준비
- DB 연동용: mysql-connector-java-8.0.21.jar 추가
- MQTT 연동용: org.eclipse.paho.client.mqttv3 라이브러리 추가
- 빌드패스:
Project → Build Path → Configure Build Path → Libraries → Add External JARs
3. MQTT 통신 개념
역할설명
| Client | 메시지를 발행(Publish)하거나 구독(Subscribe)하는 주체 |
| Broker (Server) | 메시지를 받아서 구독자들에게 전달 |
| Connect Options | 브로커 접속 정보(IP, Port, KeepAlive 등) 저장 |
| Callback | 메시지 도착, 연결 끊김 등의 이벤트를 처리하는 객체 |
객체 생성 시 필요한 정보
MqttClient client = new MqttClient("tcp://192.168.14.56:1883", "heewon");
개변수의미
| "tcp://192.168.14.56:1883" | 브로커의 주소 (프로토콜 + IP + 포트) |
| "heewon" | 클라이언트 ID (브로커가 클라이언트를 구분할 때 사용) |
메시지 보내기 (Publish)
내부 동작
- 클라이언트가 브로커에 연결 (connect() 메서드)
- MQTT 프로토콜 기반으로 메시지를 발행(Publish)
- 발행할 데이터는 MqttMessage 객체 형태로 만들어서 전송
client.connect();
MqttMessage message = new MqttMessage("Hello MQTT".getBytes());
client.publish("iot", message);
개념설명
| Payload | 전송할 실제 데이터 내용 (MqttMessage 안에 저장됨) |
| Broker | 메시지를 받아서 구독 중인 클라이언트들에게 전달 |
메시지 받기 (Subscribe)
내부 동작
- 브로커에 연결(connect)
- 구독할 토픽(topic) 을 지정하고 구독 신청
- 다른 곳에서 같은 토픽으로 publish한 메시지가 도착하면 자동 수신
→ 이때 콜백 메서드(messageArrived)가 자동 실행됨
프로그램 작성 흐름
1. MqttClient 객체 생성
→ 브로커 주소와 클라이언트 ID지정
2. 옵션 객체 생성 (MqttConnecOptions)
→ CleanSession, KeepAliveInterval 등의 설정
3. 콜백 메서드 등록(MqttCallback 구현)
→ 메시지 수신 시 자동 실행될 코드 작성
4. 브로커 연결 → 구독 신청
QoS(Quality of Service) - 메시지 전달 품질 수준
수준이름설명
| 0 | At most once | “한 번만 시도, 안 가면 끝” — 빠르지만 안정성 낮음 |
| 1 | At least once | “적어도 한 번은 간다” — 중복 수신 가능성 있음 |
| 2 | Exactly once | “딱 한 번만 정확히 보냄” — 가장 안정적 (결제 등 중요 데이터용) |
MqttCallback 인터페이스
MQTT 이벤트(연결 끊김, 메시지 수신, 발송 완료 등)를 처리하기 위한 콜백 인터페이스
메서드호출 시점역할
| connectionLost(Throwable cause) | 브로커와의 연결이 끊겼을 때 | 네트워크 재연결 처리 |
| deliveryComplete(IMqttDeliveryToken token) | 발행한 메시지가 브로커로 정상 전달된 뒤 | 발행 완료 알림 |
| messageArrived(String topic, MqttMessage message) | 구독 중인 토픽으로 메시지 수신 시 | 수신 메시지 처리 |
핵심 요약 한눈에 보기
구분역할주요 메서드
| MqttClient | MQTT 통신 담당 객체 | connect(), publish(), subscribe() |
| MqttConnectOptions | 연결 옵션 설정 | setCleanSession(), setKeepAliveInterval() |
| MqttMessage | 메시지 데이터 | setPayload() |
| MqttCallback | 이벤트 처리 (비동기 콜백) | messageArrived(), deliveryComplete(), connectionLost() |


'HDC 학습일지' 카테고리의 다른 글
| 스마트 빌딩 관리 시스템 (미니 프로젝트) (0) | 2025.10.20 |
|---|---|
| 2025-10-17 [라즈베리파이 mqtt ,쓰레드(상속,이너클래스)] (0) | 2025.10.19 |
| 2025-10-15(라즈베리파이-2, PWM (0) | 2025.10.16 |
| 2025-10-14(라즈베리파이) (0) | 2025.10.15 |
| 2025-10-13(라즈베리파이(리눅스 명령어)) (0) | 2025.10.14 |