Como controlar um servo motor com o Raspberry Pi
Comentáriosⓘ Cet article peut avoir été partiellement ou totalement traduit à l'aide d'outils automatiques. Nous nous excusons des erreurs que cela pourrait engendrer.
Este tutorial é a terceira parte de um arquivo dedicado à descoberta de eletrônicos com o Raspberry Pi. Se você ainda não leu, aconselho que consulte o primeiro tutorial para controlar um LED com o Raspberry Pi e também o segundo tutorial para usar um leitor RFID com o Raspberry Pi.
Ao iniciar a automação residencial, uma necessidade clássica é controlar o movimento físico na realidade a partir de um programa.
Neste tutorial, veremos como usar o Raspberry Pi para controlar um servo motor.
Acessórios para controlar um servomotor
Para poder seguir este tutorial e controlar um servomotor, precisaremos do seguinte material:
Qual é a diferença entre motor, servo motor e motor de passo?
Antes de começar a conectar nosso servomotor ao Raspberry Pi, vamos dar uma olhada nos diferentes tipos de motores convencionalmente usados em eletrônica.
Sem entrar em detalhes, podemos dividir aproximadamente os motores usados na eletrônica em três categorias:
- O motor: funciona enquanto estiver alimentado. É adequado quando você deseja realizar um movimento contínuo que não requeira grande precisão.
- O motor de passo: gira em uma espécie de pequenos saltos sucessivos. Ou seja, você poderá pedir-lhe que faça, por exemplo, 50 saltos, ou 112 saltos, que corresponderão a um determinado movimento (por exemplo um quarto de volta). É adequado quando você deseja fazer um movimento contínuo com alta precisão (eles são usados por exemplo em impressoras 3D).
- O servomotor: gira em um determinado ângulo, definido de acordo com um sinal do tipo PWM (Pulse Width Modulation). Freqüentemente, os motores pequenos são limitados e não podem fazer mais de uma revolução. Eles são, portanto, usados para um movimento curto de grande precisão.
Ainda haveria muitas outras coisas a dizer sobre esses diferentes motores, mas então entraremos em questões mecânicas que vão muito além do escopo de nosso tutorial.
No nosso caso, usaremos um servo motor porque é o motor de precisão mais fácil de controlar a partir de um Raspberry Pi.
Conecte um servo motor ao Raspberry Pi
A primeira coisa a fazer para poder usar nosso servo motor é conectá-lo ao Raspberry Pi.
Os atuadores possuem 3 conectores elétricos. As cores podem mudar dependendo do fabricante, mas geralmente você encontrará algo como:
- Um fio vermelho, que serve como fonte de alimentação.
- Um fio preto ou marrom, que funciona como GDN.
- Outro fio, que é usado para transmitir o sinal PWM controlando a posição do motor.
Portanto, conectaremos esses cabos diferentes ao Raspberry Pi, o fio vermelho a uma porta GPIO de 5 volts e o preto a uma porta GND.
Por outro lado, para a porta PWM, teremos necessariamente que conectá-la ao 12º pino GPIO do Raspberry Pi. Na verdade, é o único pino GPIO que suporta um sinal PWM por padrão.
Então você deve ter uma montagem como esta.
Observe, aqui estamos alimentando nosso servo motor diretamente do Raspberry Pi. Isso funciona porque estamos usando um servo motor muito pequeno, mas em um modelo maior precisaríamos de uma fonte de alimentação dedicada.
Controle o servomotor nas linhas de comando
Agora que conectamos nosso servomotor, poderemos acioná-lo diretamente da linha de comando do Raspberry Pi.
Para fazer isso, começaremos ativando o modo PWM na porta 12, ou seja, GPIO 18 de acordo com a numeração do processador.
gpio -o mode 18 pwm
E vamos ativar o modo Mark / Space do PWM, que permite ter um sinal mais adequado ao nosso uso.
gpio pwm-ms
Finalmente, iremos configurar a duração de um ciclo, as frequências de uso, etc.
O servomotor está configurado para operar a uma frequência de 50 Hz, ou seja, 20 ms. O sinal Raspberry Pi funciona em outra frequência, 19,2 MHz. Usando esses dois números, podemos calcular um período e um intervalo (graças a ramboise314.fr pela fórmula):
50 = 19.2 * 10^6 / 192 / 2000
Portanto, definiremos o Raspberry Pi para usar estes valores:
gpio pwmc 192 gpio pwmr 2000
Finalmente, poderemos colocar nosso motor em movimento! Observe que não passamos um ângulo para o servomotor, mas um número que será convertido em um ângulo. Nosso servo motor vai de 0 ° a 180 °. Após alguns testes, parece que 0 ° corresponde a 230, 90 ° a 150 e 180 ° a 70.
Para enviar nosso motor a 90 °, usaremos o comando:
gpio -g pwm 18 150
E substituiremos 150 por 230 para ir para 0 °, 70 para ir para 180 ° ou qualquer valor intermediário conforme necessário.
Note que esses motores pequenos suportam um ângulo de 180 ° de forma precisa, mas têm uma pequena margem que pode fazer com que façam 190 ° ou 200 ° e até mesmo dêem uma volta completa se colocar um valor suficientemente baixo. É específico para cada modelo de motor.
Conduza o servomotor com Python
Como nos tutoriais anteriores desta série, o objetivo é antes controlar nosso mecanismo com Python, em vez de diretamente das linhas de comando. Considero que agora você já tem o básico do Python, se não for ler os tutoriais anteriores, os links estão disponíveis no início deste artigo.
Para controlar nosso motor a partir de um script Python, usaremos mais uma vez a biblioteca Rpi.GPIO
.
No Python e no Pi, o ângulo do motor é calculado como uma porcentagem do ciclo. Este percentual é denominado "Ciclo de Trabalho".
Um sinal de 0,5 ms corresponde a 0 ° e um sinal de 2,5 ms a 180 °. Sabendo que nosso ciclo é de 50 Hz, ou seja, 20 ms, isso nos permite calcular o Ciclo de Trabalho para 0 ° e 180 ° assim:
x = 0.5 / 20 y = 2.5 / 20
Descobrimos então que o Ciclo de Trabalho correspondente a 0 ° é 0,025, ou 2,5%, e que aquele correspondente a 180 ° é 0,125 ou 12,5%.
Pequeno problema, porém, se este valor for teoricamente bom, na verdade ele tende a acionar uma rotação completa do motor por 0 ° … Portanto, recomendo que você use 4% para 0 °. O valor de 12,5% para 180 é bom.
Para controlar o motor, precisamos apenas definir o pino 12 como nosso sinal PWM e usar as funções start
e ChangeDutyCycle
.
Você pode, portanto, criar um arquivo servo.py
e coloque o seguinte código lá:
#!/usr/bin/env python3
#-- coding: utf-8 --
import RPi.GPIO as GPIO
import time
#Set function to calculate percent from angle
def angle_to_percent (angle) :
if angle > 180 or angle < 0 :
return False
start = 4
end = 12.5
ratio = (end - start)/180 #Calcul ratio from angle to percent
angle_as_percent = angle * ratio
return start + angle_as_percent
GPIO.setmode(GPIO.BOARD) #Use Board numerotation mode
GPIO.setwarnings(False) #Disable warnings
#Use pin 12 for PWM signal
pwm_gpio = 12
frequence = 50
GPIO.setup(pwm_gpio, GPIO.OUT)
pwm = GPIO.PWM(pwm_gpio, frequence)
#Init at 0°
pwm.start(angle_to_percent(0))
time.sleep(1)
#Go at 90°
pwm.ChangeDutyCycle(angle_to_percent(90))
time.sleep(1)
#Finish at 180°
pwm.ChangeDutyCycle(angle_to_percent(180))
time.sleep(1)
#Close GPIO & cleanup
pwm.stop()
GPIO.cleanup()
Tudo que você precisa fazer é executar o script fazendo:
python3 ./servo.py
Você deverá ver o motor arrancar em 0 °, mudar para 90 ° e finalmente parar em 180 °.
Tudo o que você precisa fazer é adaptar este script às suas necessidades!