Servo Shield

Servo Shield는 PCA9685 서보 / PWM 컨트롤러를 사용하여 OpenMV Cam에서 I2C를 통해 최대 8개의 취미용 서보를 병렬로 구동합니다.

Servo Shield

전체 데이터시트, 사진, 주문 정보는 Servo Shield 제품 페이지 를 참고하세요.

주요 특징

  • PCA9685 서보 / PWM 컨트롤러

  • I2C를 통한 8개의 독립 서보 채널

  • Motor Shield 및 Pan and Tilt Shield와 적층 가능

핀아웃

Servo Shield 핀아웃

핀 참조

기능

P4

I²C SCL — PCA9685로의 클럭

P5

I²C SDA — PCA9685로의 데이터

VIN 레일

서보에 전원 공급(카메라의 VIN 핀에서)

3.3V 레일

PCA9685 로직에 전원 공급

GND 레일

서보와 카메라의 공통 접지

기본 I²C 주소는 0x40 입니다. 온보드 솔더 브리지를 연결하면 주소를 0x60 으로 변경합니다.

참고

쉴드는 카메라의 VIN 핀에서 직접 서보 전원을 끌어옵니다. 어떤 OpenMV Cam에서도 USB는 VIN에 전원을 공급하지 않으므로, VIN은 외부에서(배터리, 벤치 전원 공급 장치 등) 공급해야 합니다. 구동하려는 모든 서보의 합산 스톨 전류에 맞는 정격을 가진 전원을 선택하세요.

사용법

I²C를 통해 PCA9685로 8개의 서보 채널을 구동합니다. 펄스 폭 범위는 서보마다 다르므로, MIN_USMAX_US 를 사용 중인 서보에 맞게 조정하세요. 일반적인 값은 약 1000–2000 µs입니다:

import time
from machine import SoftI2C, Pin


class PCA9685:
    """Minimal PCA9685 driver — 12-bit PWM on any of 8 channels."""

    def __init__(self, bus, address=0x40, freq=50):
        self._bus = bus
        self._addr = address
        bus.writeto_mem(address, 0x00, b"\x00")            # reset Mode1
        prescale = round(25_000_000 / (4096 * freq)) - 1
        bus.writeto_mem(address, 0x00, b"\x10")            # sleep
        bus.writeto_mem(address, 0xFE, bytes([prescale]))  # prescale
        bus.writeto_mem(address, 0x00, b"\x00")            # wake
        time.sleep_us(5)
        bus.writeto_mem(address, 0x00, b"\xA1")            # restart + AI + allcall
        self._period_us = 1_000_000 // freq

    def set_duty(self, channel, duty):
        duty &= 0xFFF                                      # 12-bit
        if duty == 0:
            on, off = 0, 0x1000                            # FULL_OFF
        elif duty == 0xFFF:
            on, off = 0x1000, 0                            # FULL_ON
        else:
            on, off = 0, duty
        self._bus.writeto_mem(
            self._addr, 0x06 + 4 * channel,
            bytes([on & 0xFF, on >> 8, off & 0xFF, off >> 8]))

    def set_us(self, channel, pulse_us):
        self.set_duty(channel, (pulse_us * 4096) // self._period_us)


MIN_US = 1000  # full-left pulse width (microseconds)
MAX_US = 2000  # full-right pulse width

bus = SoftI2C(scl=Pin("P4"), sda=Pin("P5"))
pca = PCA9685(bus, address=0x40, freq=50)


def angle(channel, deg):
    pca.set_us(channel, MIN_US + (deg * (MAX_US - MIN_US)) // 180)


while True:
    for ch in range(8):
        angle(ch, 0)
    time.sleep_ms(2000)
    for ch in range(8):
        angle(ch, 180)
    time.sleep_ms(2000)

PCA9685는 또한 임의의 주파수에서 일반적인 12비트 PWM도 처리합니다. 동일한 클래스를 set_duty (0–4095)와 함께 재사용하여, 예를 들어 채널 0에서 1 kHz로 LED를 페이드할 수 있습니다. 아래의 헬퍼는 0.0–100.0% 부동소수점 값을 칩의 0–4095 듀티 범위로 스케일링합니다:

import time
from machine import SoftI2C, Pin

bus = SoftI2C(scl=Pin("P4"), sda=Pin("P5"))
pca = PCA9685(bus, address=0x40, freq=1000)


def brightness(channel, pct):
    pca.set_duty(channel, int(pct * 4095 / 100))


while True:
    # Ramp up 0 → 100%.
    for pct in range(101):
        brightness(0, float(pct))
        time.sleep_ms(20)
    # Ramp down 100 → 0%.
    for pct in reversed(range(101)):
        brightness(0, float(pct))
        time.sleep_ms(20)