로그인회원가입

ESP32-C3와 MicroPython으로 구현한 정밀 위치 제어 시스템 (PID 제어 및 WebSocket GUI)

단순한 모터 회전을 넘어, 엔코더 신호를 정밀하게 분석하여 원하는 각도에 정확히 멈추는 절대 위치 제어 시스템을 구축했습니다. 특히, 저해상도 엔코더의 한계를 극복하기 위한 PID 튜닝 과정과 브라우저에서 실시간으로 조작 가능한 WebSocket 기반의 현대적인 웹 GUI 구현 과정을 공유합니다.


1. 하드웨어의 한계를 소프트웨어로 극복하기

처음 사용한 펄스당 2회(PPR 2)의 저해상도 엔코더와 높은 기어비(666:359) 환경에서 발생하는 오차를 줄이기 위해 PID(Proportional-Integral-Derivative) 제어를 도입했습니다.

  • Kp(비례): 목표치에 빠르게 도달하는 힘
  • Ki(적분): 누적된 미세 오차를 제거
  • Kd(미분): 목표 지점 근처에서 브레이크를 걸어 오버슈트 방지 사용자 맞춤형 튜닝을 통해 모터가 부드럽고 정확하게 멈추는 최적의 값을 찾아가는 과정을 담았습니다.

2. WebSocket을 이용한 실시간 웹 컨트롤러

HTTP 방식의 느린 반응 속도를 해결하기 위해 WebSocket 핸드쉐이크를 직접 구현했습니다.

  • 실시간성: 브라우저의 슬라이더를 움직이는 즉시 모터가 반응합니다.
  • 다크 모드 GUI: 터치가 용이하도록 큼직한 버튼과 직관적인 슬라이더 디자인을 적용하여 사용자 편의성을 극대화했습니다.
  • 제로 포인트 설정: 물리적 위치가 틀어졌을 때 언제든 현재 위치를 0도로 고정할 수 있는 ‘SET ZERO’ 기능을 추가하여 실용성을 높였습니다.

3. 고해상도 상상(Quadrature) 엔코더로의 진화

더 정밀한 제어를 위해 Phase A/B 두 개의 신호를 사용하는 상상 엔코더 방식으로 시스템을 업그레이드했습니다. ESP32-C3의 인터럽트 기능을 활용해 방향 판별과 카운팅을 실시간으로 처리하며, 촘촘한 엔코더 디스크 환경에서도 데이터 누락 없이 안정적으로 동작하는 코드를 완성했습니다.

4. 주요 설정 팁: Duty_u16과 속도 제한

마이크로파이썬의 duty_u16이 가진 0~65535 범위를 효율적으로 배분했습니다. 기구부의 수명과 안정성을 고려해 MAX_DUTY를 제한하고, 모터가 멈추지 않고 돌아갈 수 있는 최소 전압인 MIN_DUTY를 설정하여 제어의 품질을 한 단계 끌어올렸습니다.


IR 엔코더에서 두개 신호로 정회전 역회전 구분하는 원리

IR 엔코더(일반적으로 광학식 인크리멘탈 엔코더)에서 회전 방향을 구분하는 핵심 원리는 **’위상차가 있는 두 개의 신호’**를 사용하는 것입니다. 보통 이 신호를 **A상(Phase A)**과 **B상(Phase B)**이라고 부릅니다.

상세한 원리는 다음과 같습니다.

1. 쿼드러처(Quadrature) 신호의 생성

엔코더 내부에는 슬릿(구멍)이 있는 디스크와 이를 감지하는 두 개의 IR 센서가 약간 어긋난 위치에 배치되어 있습니다. 디스크가 회전하면 두 센서는 각각 독립적인 펄스 신호를 만들어내는데, 이때 센서의 배치 덕분에 두 신호는 정확히 **90도(1/4 주기)**의 위상차를 갖게 됩니다.


2. 회전 방향에 따른 파형의 변화

정회전과 역회전일 때 A상과 B상 중 어느 것이 먼저 “상승”하느냐에 따라 방향을 판별합니다.

  • 정회전 (Clockwise): A상 신호가 B상 신호보다 앞서서 발생합니다. 즉, A상이 ‘High’가 된 직후에 B상이 ‘High’가 됩니다.
  • 역회전 (Counter-Clockwise): B상 신호가 A상 신호보다 앞서서 발생합니다. 즉, B상이 ‘High’가 된 직후에 A상이 ‘High’가 됩니다.

3. 상태 변화 판별 로직

실제 마이크로컨트롤러(MCU)에서 방향을 읽을 때는 특정 시점의 신호 상태를 비교합니다. 예를 들어, **A상이 상승 에지(Low → High)**일 때 B상의 상태를 확인하는 방식입니다.

기준점 (A상의 상승 에지)B상의 상태판별 결과
A: ↑ (Rising)B: Low (0)정회전
A: ↑ (Rising)B: High (1)역회전

이처럼 두 신호의 조합을 통해 현재 바퀴나 모터가 어느 쪽으로 돌고 있는지, 그리고 펄스의 개수를 세어 얼마나 돌았는지(변위)를 동시에 계산할 수 있습니다.

센서가 하나만 있다면 속도는 알 수 있지만 방향은 알 수 없기 때문에, 정밀 제어가 필요한 모터 시스템에서는 반드시 이 두 개의 신호(A, B상)를 활용하는 것이 표준입니다.

과학상자 모터에 엔코딩

프린터에서 추출한 엔코더 DC모터

코멘트

답글 남기기