Controlar um servo com Raspberry Pi Pico W e PWM
Um servo é uma das formas mais fundamentais de aprender a usar a modulação por largura de pulso (PWM) com o Raspberry Pi. Neste artigo, vou mostrar-vos como 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:
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
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
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.
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?
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 pode ver, existe um objeto que é o cursor.
Há também um que mostra o grau de rotação.
A parte do JavaScript actualiza o bem como actualiza o 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,