Como controlar servo com Raspberry Pi Pico W e modulação de largura de pulso (PWM)

Um servo é uma das formas mais fundamentais de aprender a usar a modulação da largura de pulso com o Raspberry Pi.

Vamos aprender a fazer isto com um Raspberry Pi Pico W.

Objectivos do tutorial PWM

  • Aprenda a usar o PWM para controlar o ângulo do servo
  • Configurar um servidor com o Pico W
  • Servidor entrega página web com um selector para controlar servo

Peças necessárias

  • Raspberry Pi Pico W com cabeçalhos
  • Fio de salta
  • Servo (estamos a utilizar o micro servo Tower Pro SG90)

O que é a modulação da largura de pulso?

As crianças acham divertido acender e apagar as luzes repetidamente.

Para eles, é tão divertido ver as luzes a piscar e a apagar-se enquanto alternam o interruptor de luz. Os pais podem não achar piada, mas isto proporciona um momento de aprendizagem para todos nós.

Se você ou os seus filhos já o fizeram, então experimentaram uma forma primitiva de modulação da largura do pulso.

Com um Raspberry Pi, pode fazer isto facilmente de forma automatizada. Em essência, diria ao Raspberry Pi quantas vezes quereria que as coisas estivessem "ON" num período específico.

Isto permite-lhe escurecer os LEDs:

picockpit gpio pwm controlo remoto
Alternar o brilho do LED com a função PWM do PiCockpit

Além disso, isto permite controlar o ângulo do braço do servo.

Um importante conceito de PWM: o ciclo de trabalho

Um ciclo de serviço é basicamente o tempo em que o circuito permanece "elevado", o que significa que está ligado.

Por isso, vamos ao seu circuito em metade do tempo. Podemos, portanto, dizer que o ciclo de serviço é de 50%.

Se o tiver sempre ligado, o seu ciclo de funcionamento seria 100%, e vice-versa, desligado a toda a hora significa um 0

Ilustração do ciclo de trabalho de Sparkfun (CC BY-SA 4.0)

Voltando ao exemplo de uma criança a ligar e desligar as luzes a um ritmo regular, a razão pela qual as luzes não se acendem completamente ou escurecem completamente é porque só estamos a fornecer uma saída de tensão para uma porção específica de tempo.

Para um LED, isto significa que o LED é aceso durante um período de tempo, depois a energia é puxada, depois a energia é entregue novamente, e repete-se.

Assim, o LED nunca fica suficientemente brilhante para atingir o seu pleno brilho, nem tem tempo suficiente para ficar completamente escuro.

Controlo servo SG90 com PWM

Teríamos de ser cautelosos aqui, pois nem todos os servos operam da mesma forma. Este tutorial é específico para os micro servos Tower Pro SG90.

O SG90 tem uma rotação de 180 graus, mas alguns servos são servos de 120 graus. Os servos de controlo por rádio são mais susceptíveis de serem servos de 120 graus, por isso certifique-se de verificar a folha de dados do servo que pretende manipular, pois é possível danificar os servos se lhe der um sinal fora de alcance.

Esta é a folha de dados para o SG90, da Luxor Parts:

A ficha de dados diz-lhe duas coisas importantes: qual a cor que corresponde a positivo, terra e sinal e a frequência de pulso/ciclo de trabalho.

  • Castanho = negativo
  • Vermelho = positivo
  • Laranja = sinal

E para frequência de pulso/ciclo de trabalho

  • Terá de ter um ciclo de funcionamento de 20ms ou 50Hz.
  • Um sinal de 1ms = zero graus
  • Um sinal de 2ms = 180 graus de rotação
Com um sinal de 1ms, o servo é rodado a zero graus.

Isto significa que a cada ms, o servo vai procurar uma actualização. Se continuar a enviar-lhe um sinal de 2ms, ele permanecerá em rotação completa (180 graus). Se o alterar para 1,5ms, ele irá rodar 90 graus, e a 1ms, será rodado a zero graus.

Com um sinal de 2ms, o servo é rodado 180 graus.

Ligação do servo ao Pico W

A fim de utilizar o nosso código, tem de ligar o fio de sinal para GPIO 0. O fio de sinal é o fio laranja no SG90.

Em seguida, ligar o fio vermelho a VBUS (o que lhe dá 5V). Como pode ver na ficha técnica, a tensão de funcionamento para o SG50 é de 4,8V a 6V, pelo que o pino de 3,3V no Pico W não funcionará.

Codificação do servocomando Pico W

Pode encontrar o código aqui no nosso Github.

Vamos analisar o código.

Em main.pyque é uma convenção de nomenclatura para o ficheiro que queremos executar no arranque, criamos uma classe para o servo e instanciamo-la:


class Servo:
    def __init__(self, MIN_DUTY=300000, MAX_DUTY=2300000, pin=0, freq=50):
        self.pwm = machine.PWM(machine.Pin(pin))
        self.pwm.freq(freq)
        self.MIN_DUTY = MIN_DUTY
        self.MAX_DUTY = MAX_DUTY
        
    def rotateDeg(self, deg):
        if deg < 0:
            deg = 0
        elif deg > 180:
            deg = 180
        duty_ns = int(self.MAX_DUTY - deg * (self.MAX_DUTY-self.MIN_DUTY)/180)
        self.pwm.duty_ns(duty_ns)

servo = Servo()

A classe Servo utiliza a máquina. A classe PWM disponível em MicroPython. Ver documentação aqui.

Neste exemplo, estamos a utilizar o Pico W como um ponto de acesso. Aqui está o código para que isso aconteça:

ssid = 'Servo-Control'
password = 'PicoW-Servo'

ap = network.WLAN(network.AP_IF)
ap.config(essid=ssid, password=password)
ap.active(True)

while ap.active() == False:
  pass

print('Connection successful')
print(ap.ifconfig())

Como pode ver nas duas primeiras linhas, o SSID que procura é Servo-Control e a senha é PicoW-Servo.

Uma vez conectado à rede WiFi, pode ir para o endereço IP do Pico W, que por defeito é 192.168.4.1. Alternativamente, pode também verificar o log on Thonny para ver qual é o endereço IP do seu Pico.

Como é que a página Web comunica com o servo?

Controlo do servo deslizante

Ao entrar no endereço IP do Pico W, é-lhe enviado o ficheiro index.html, que pode ser encontrado no repo de Github.

O ficheiro index.html tem estas importantes linhas:

 <form id="form">
            <input type="range" class="slider" min="0" max="180" value="slider_value" name="servo" id="servo">
            <output></output>
        </form>

Como se pode ver, há um objecto que é o deslizador.

Há também uma que mostra o grau de rotação.

A parte JavaScript actualiza a assim como actualiza a URL para que o Pico W possa capturar os dados e rodar o servo.

Os elementos e têm um pai.

Aqui está o guião na parte da frente,

        <script>
            let i = document.getElementById('servo'),
                o = document.querySelector('output');

            o.innerHTML = i.value;

            i.addEventListener('input', function () {
              o.innerHTML = i.value;
            }, false);
            
            i.addEventListener('change', function ()  {
                document.getElementById("form").submit();
            }, false);
        </script>

Notará aqui dois EventListeners. Quando interage com o deslizador, desencadeia uma actualização do campo e também faz com que o se submeta.

Quando o é submetido, faz com que o URL tenha um parâmetro "servo=[graus]". Por exemplo, se tiver puxado o deslizador para 180, será "index.html?servo=180".

Este parâmetro é capturado pelo backend do Pico W (main.py), processado para encontrar os graus especificados pelo utilizador e depois o rotateDeg método é chamado.

        index = request.find('servo=') + len('servo=')
        if request[index].isdigit():
            offset = 1
            if request[index+1].isdigit():
                offset = 2
                if request[index+2].isdigit():
                    offset = 3
            deg = int(request[index:index+offset])
            print(deg)
        
            servo.rotateDeg(deg)

Utilizações práticas

Um servo é uma ferramenta mecânica muito importante a conhecer porque pode ser utilizado em muitos ambientes. De facto, mesmo projectos complicados como braços robóticos compreendem muitos servos que trabalham em uníssono.

Pode agora construir um projecto que apague as luzes do seu quarto:

controlo de servo interruptor sem fios diy
Servo em rotação completa, desligando o interruptor

Por outro lado, também se podem construir classificadores de cereais, como este Pequeno Classificador, feito com AI e um microcontrolador.

Tiny Sorter da Google Creative Lab. (foto do Google)

Se olhar atentamente para o topo onde estão os olhos de googly, há um servo SG90 atrás dele.

Deixe um comentário