Notice
Recent Posts
Recent Comments
Link
«   2026/04   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30
Archives
Today
Total
관리 메뉴

memo6759 님의 블로그

2025-10-16(서브모터 제어, MQTT 통신 (자바)) 본문

HDC 학습일지

2025-10-16(서브모터 제어, MQTT 통신 (자바))

heewon09 2025. 10. 16. 19:54

서브모터 제어 원리

서브 모터는 
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()


각도듀티사이클(대략)설명

2.5% 가장 왼쪽
90° 7.5% 가운데
180° 12.5% 가장 오른쪽

각도를 듀티사이클로 변환하는 계산식

→ 0°일 때: 0/18 + 2.5 = 2.5
→ 180°일 때: 180/18 + 2.5 = 12.5

pwn.txt

라즈베리파이 + 자바 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)

 내부 동작

  1. 클라이언트가 브로커에 연결 (connect() 메서드)
  2. MQTT 프로토콜 기반으로 메시지를 발행(Publish)
  3. 발행할 데이터는 MqttMessage 객체 형태로 만들어서 전송
client.connect();
MqttMessage message = new MqttMessage("Hello MQTT".getBytes());
client.publish("iot", message);

개념설명

Payload 전송할 실제 데이터 내용 (MqttMessage 안에 저장됨)
Broker 메시지를 받아서 구독 중인 클라이언트들에게 전달

메시지 받기 (Subscribe)

내부 동작 

  1. 브로커에 연결(connect)
  2. 구독할 토픽(topic) 을 지정하고 구독 신청
  3.  다른 곳에서 같은 토픽으로 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()

publish(메세지 보내기)
subscribe(콘솔로 메세지 받기)