Controle um servo motor com Raspberry Pi Pico usando PWM em MicroPython

Tempo de leitura: 4 minutes

Com a esperança de que você esteja gostando de nossa série de tutoriais do Raspberry Pi Pico, estamos aqui com outro tutorial interessante. Neste tutorial, vamos controlar um servo motor com Raspberry Pi Pico usando a modulação por largura de pulso em MicroPython. Até agora, aprendemos como fazer a interface entre um OLED e um LCD. Junto com isso, também aprendemos como implementar a comunicação I2C, ADC com o Raspberry Pi Pico. Vamos agora entender como funciona uma modulação por largura de pulso.

Modulação de largura de pulso

A modulação por largura de pulso (PWM) é uma técnica para alterar a amplitude de sinais digitais para controlar dispositivos e aplicativos que requerem energia ou eletricidade. Ele efetivamente regula a quantidade de energia fornecida a um dispositivo do ponto de vista do componente de tensão, alternando rapidamente as fases liga e desliga de um sinal digital e alterando a amplitude da fase “ligada” ou ciclo de trabalho. Para o dispositivo, isso apareceria como uma entrada de energia constante com um valor médio de tensão determinado pela proporção do tempo ligado. O ciclo de trabalho é representado como uma porcentagem de estar totalmente (100%) ligado.

A imagem a seguir representa um sinal PWM com ciclo de trabalho de 50%. Podemos controlar o “on time” do sinal PWM variando o ciclo de trabalho de 0% a 100%. Vamos controlar um servo motor variando o ciclo de trabalho de um sinal PWM específico. Um período é o tempo LIGADO e DESLIGADO completo de um sinal PWM, conforme mostrado na figura acima. A frequência de um sinal PWM determina a rapidez com que um PWM completa um período. As fórmulas para calcular a frequência são fornecidas abaixo

Frequency = 1/Time Period
Time Period = On time + Off time

Normalmente, os sinais PWM gerados pelo microcontrolador serão em torno de 500 Hz, tais frequências altas serão usadas em dispositivos de chaveamento de alta velocidade como inversores ou conversores. Mas nem todas as aplicações requerem alta frequência. Por exemplo, para controlar um servo motor, precisamos produzir sinais PWM com frequência de 50 Hz, de forma que a frequência de um sinal PWM também seja controlável por programa para todos os microcontroladores. Para obter mais informações, você pode verificar nosso artigo O que é PWM: Modulação por largura de pulso.

 

Diagrama de circuito do servo motor com o Raspberry Pi Pico

A conexão de um servo motor é muito simples. Sabemos que um servo motor possui três fios. O fio preto ou marrom é para aterramento, o fio vermelho é usado como VCC e o fio amarelo ou laranja é usado para fornecer o sinal de pulso. No diagrama de circuito, você pode ver que conectamos o VCC do servo com o pino VBUS da placa Pico. O pino de sinal do servo motor foi conectado com o GPIO0 da placa do Pico e o pino de aterramento do servo foi conectado ao pino de aterramento da placa do Pico.

Código de controle do servo motor Raspberry Pi Pico em MicroPython

Segue o código completo do projeto, você pode salvar como “main.py” no editor Thonny.

from time import sleep
from machine import Pin
from machine import PWM

pwm = PWM(Pin(0))
pwm.freq(50)

#Função para definir um ângulo
#A posição é esperada como um parâmetro
def setServoCycle (position):
    pwm.duty_u16(position)
    sleep(0.01)
    
while True:
    for pos in range(1000,9000,50):
        setServoCycle(pos)
    for pos in range(9000,1000,-50):
        setServoCycle(pos)

Agora, vamos discutir sobre o arquivo main.py.

from machine import Pin, PWM
from time import sleep

Primeiramente, precisamos importar as classes Pin() e PWM() da biblioteca machine.py conforme mencionado acima. Em nossos tutoriais anteriores, usamos a biblioteca de máquina tantas vezes e espero que agora você esteja familiarizado com a biblioteca de máquina. O Pin() é usado para declarar o pino de sinal do servo motor.

pwm = PWM(Pin(0))
pwm.freq(50)

Como eu conectei o pino de sinal do servo motor ao GPIO0 da placa Pico, declarei o Pin(0) e configurei este pino como PWM passando-o para a função PWM(). A variável pwm é usada como um objeto aqui. Em seguida, atribuí a frequência como 50 Hz usando o pwm.freq(50).

#Função para definir um ângulo
#A posição é esperada como um parâmetro
def setServoCycle (position):
    pwm.duty_u16(position)
    sleep(0.01)

A função setServoCycle(posição) pode ser usada para definir a posição do servo passando o parâmetro de posição de 1000 para 9000. Os valores para duty_u16 estão em microssegundos em vez de graus. Os valores do servo 1000-9000 representam 0-180 graus.

while True:
    for pos in range(1000,9000,50):
        setServoCycle(pos)
    for pos in range(9000,1000,-50):
        setServoCycle(pos)

No loop while acima, estou usando dois loops for. O primeiro é usado para definir a posição do servo de 0 a 180 que é de 1000 a 9000 e o segundo loop for é usado para definir a posição do servo de 180 a 0 que é de 9000 a 1000. Agora, no IDE Thonny, abra o arquivo “main.py”. Para começar, salve o arquivo “main.py” no quadro do Pico pressionando as teclas “ctrl+shift+s” em seu teclado. Antes de salvar os arquivos, certifique-se de que sua placa Pico está conectada ao seu laptop. Ao salvar o código, uma janela pop-up aparecerá, conforme mostrado na imagem abaixo, você deve primeiro selecionar o Raspberry Pi Pico, então nomear o arquivo “main.py” e salvá-lo. Este procedimento permite que você execute o programa quando o Pico estiver ligado.

Ao fazer o upload e executar o código na placa pico, você verá que o servo está girando de 0 a 180 graus e de 180 a 0 graus continuamente. Você pode consultar o vídeo a seguir para obter mais detalhes.

Código

from time import sleep
from machine import Pin
from machine import PWM
pwm = PWM(Pin(0))
pwm.freq(50)
#Função para definir um ângulo
#A posição é esperada como um parâmetro
def setServoCycle (position):
    pwm.duty_u16(position)
    sleep(0.01)
while True:
    for pos in range(1000,9000,50):
        setServoCycle(pos)
    for pos in range(9000,1000,-50):
        setServoCycle(pos)

 

Código Fonte Python – para Download (Link)

Visits: 1 Visits: 1126495