Chapter 8. 아날로그 입력 및 모터 제어 (가변저항, SG90 서보모터)
0과 1뿐만 아니라 연속적인 아날로그 값을 다뤄봅니다. 가변저항의 아날로그 값을 읽어 정밀 제어용 관절 소자인 서보모터의 회전 각도를 제어해 봅니다.
8.1 가변저항의 아날로그 값(ADC) 읽기
Pico 2는 12비트 아날로그-디지털 변환기(ADC)를 내장하고 있으나, 마이크로파이썬 내부 표준에 의해 16비트 범위인 0 ~ 65535 값으로 변환되어 읽힙니다.
가변저항 3핀: 좌측 핀→3V3, 중앙(Wiper) 핀→GP26(ADC0), 우측 핀→GND. 노브를 돌리면 GP26에서 읽히는 전압이 0V~3.3V 사이로 변합니다.
from machine import ADC, Pin
import time
# Pico 2의 ADC0번 채널(GPIO 26번 핀)에 가변저항 가운데 핀 연결
potentiometer = ADC(Pin(26))
while True:
# 아날로그 전압 읽기 (범위: 0 ~ 65535)
raw_value = potentiometer.read_u16()
# 아날로그 값을 실제 인가되는 전압(0.0V ~ 3.3V) 값으로 환산계산
voltage = (raw_value * 3.3) / 65535
print(f"정밀 ADC 데이터: {raw_value} | 환산 전압: {voltage:.2f} V")
time.sleep(0.3)
8.2 SG90 서보모터 정밀 각도 통제
서보모터는 50Hz 주기의 PWM 펄스 폭을 조절하여 0도부터 180도까지의 원하는 각도를 정밀 조율합니다.
SG90 서보: 빨간선→VSYS(5V), 주황선→GP19(PWM), 갈색선→GND. 서보는 5V 구동이 필요하므로 VSYS 핀을 사용합니다. USB 전원 시 최대 전류 제한에 주의하세요.
[응용 실습] 가변저항 돌리는 대로 서보모터 동적 조각하기
from machine import Pin, PWM, ADC
import time
pot = ADC(Pin(26))
servo = PWM(Pin(19))
servo.freq(50) # 서보모터 표준 동작 주파수 50Hz 설정
# SG90 서보모터 마이크로파이썬 16비트 기준 듀티값 정의
# 0도 일 때 대략 1638 / 180도 일 때 대략 8192
def set_angle(angle):
duty = int(1638 + (angle * (8192 - 1638) / 180))
servo.duty_u16(duty)
print("연동 제어 시스템 가동. 가변저항을 돌려보세요.")
while True:
pot_val = pot.read_u16()
# 0~65535 의 가변저항 범위를 0~180도 모터 각도 범위로 매핑변환
target_angle = (pot_val * 180) / 65535
set_angle(target_angle)
print(f"가변저항 위치: {pot_val} -> 모터 제어 각도: {target_angle:.1f}°")
time.sleep(0.05)