Um servomotor é composto por um motor de corrente contínua (DC) acoplado a um sistema de controle que ajusta a posição do eixo conforme necessário. A grande vantagem do servomotor é sua capacidade de movimentar-se para uma posição específica dentro de um intervalo, geralmente de 0 a 180 graus, com alta precisão. Ele contém um circuito de controle que compara a posição atual do eixo com a posição desejada e ajusta o motor para corrigir qualquer desvio.
Os servomotores são motores que oferecem controle preciso de posição, velocidade e aceleração. Eles são amplamente utilizados em robótica, automação e sistemas de controle, pois permitem que dispositivos se movimentem de forma controlada. Na BitDogLab, você pode integrar servomotores aos projetos e controlá-los facilmente usando a Raspberry Pi Pico e sinais PWM (Modulação por Largura de Pulso). Embora servomotores não usem diretamente o protocolo I2C, eles podem ser controlados de maneira eficiente com o PWM.
Na BitDogLab, o controle do servomotor é feito por meio de sinais PWM gerados pelos pinos GPIO da Raspberry Pi Pico. O servomotor recebe um pulso de controle e ajusta sua posição de acordo com a largura do pulso. A Raspberry Pi Pico pode gerar esses sinais diretamente através de suas saídas digitais, sem necessidade de componentes adicionais.

Figura: Micro Servo Motor 9g SG90
O GPIO da Raspberry Pi Pico envia sinais PWM ao pino de controle do servomotor, ajustando a posição do motor com base no comprimento do pulso. Geralmente, um pulso de 1ms coloca o servo a 0 graus, 1,5ms a 90 graus e 2ms a 180 graus.
Aqui está um exemplo de como controlar um servomotor na BitDogLab usando a biblioteca PWM no Micropython:
from machine import Pin, PWM
import time
# Conectar o servomotor ao GPIO21
servo = PWM(Pin(21))
servo.freq(50) # Frequência para controle de servomotores
def set_angle(angle):
# Converter o ângulo para um valor de duty cycle (entre 1000 e 9000)
duty = int((angle / 180) * 8000 + 1000)
servo.duty_u16(duty)
# Mover o servo de 0 a 180 graus
for angle in range(0, 181, 10):
set_angle(angle)
time.sleep(0.5)
# Retornar o servo para a posição inicial
set_angle(0)