Chapter 8. 아날로그 입력 및 모터 제어 (가변저항, SG90 서보모터)

0과 1뿐만 아니라 연속적인 아날로그 값을 다뤄봅니다. 가변저항의 아날로그 값을 읽어 정밀 제어용 관절 소자인 서보모터의 회전 각도를 제어해 봅니다.

ADC (0~65535) PWM (0°~180°)

8.1 가변저항의 아날로그 값(ADC) 읽기

Pico 2는 12비트 아날로그-디지털 변환기(ADC)를 내장하고 있으나, 마이크로파이썬 내부 표준에 의해 16비트 범위인 0 ~ 65535 값으로 변환되어 읽힙니다.

Pico 2 3V3 GP26 GND 가변저항 핀1 핀2 핀3 VCC (좌측) WIPER (중앙) GND (우측) ← 아날로그값(ADC0)

가변저항 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도까지의 원하는 각도를 정밀 조율합니다.

Pico 2 VSYS GP19 GND SG90 서보 커넥터 빨간선 (VCC 5V) 주황선 (Signal) 갈색선 (GND) → PWM 50Hz(OUT)

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)