Um dos principais objetivos da robótica é articular objetos. Para isso, é muito comum usar motores elétricos, e mais especificamente servomotores. Neste artigo, veremos como programar a placa Raspberry Pi para controlar um servomotor.
Pré-requisitos: Programar com Raspberry Pi
Material
- Ecrã
- Cabo HDMI
- Teclado
- Raspberry Pi 3 (com OS em micro SD)
- Mouse
- Carregador micro USB B
- Servomotor
Servomotor
Os servomotores são pequenos concentrados de tecnologia que unem mecânica e eletrônica, amplamente utilizados em modelismo, em robótica e outras aplicações. Seu nome vem do fato de poderem controlar a sua própria posição (ou velocidade).

Os servomotores se compõem de um motor de corrente contínua, uma caixa de redução e uma placa eletrônica embutida que permite o controle da posição por meio de um sinal de modulação por largura de pulso (PWM).
Esquema de ligação
O servomotor é alimentado através do fio preto/castanho (GND) e do fio vermelho (+5V). Um sinal PWM enviado ao fio amarelo/branco (terminal 12) permite controlar a posição e a velocidade do servomotor. Dependendo da quantidade de servomotores utilizados e da sua potência, eles podem ser alimentados pelo terminal 5V da placa Raspberry Pi. Ainda assim, é fortemente aconselhado o uso de uma fonte de energia externa para proteger a placa.

Para lembrar, aqui está o descritivo dos pinos do Raspberry Pi 3:

Código básico para controle de servomotores
Para controlar a posição do servomotor, precisamos enviar um sinal de modulação por largura de pulso (PWM). Para isso, é necessário configurar um terminal GPIO do Raspberry PI como saída PWM.
#!/usr/bin/env python
# -*- coding: utf-8 -*-
import RPi.GPIO as GPIO
import time
def AngleToDuty(ang):
return float(pos)/10.+5.
#Setup servoPin as PWM output of frequancy 100Hz
servoPin=12
GPIO.setmode(GPIO.BOARD)
GPIO.setup(servoPin,GPIO.OUT)
pwm=GPIO.PWM(servoPin,100)
#setup sweep parameters
depart =0
arrivee=180
DELAY=0.1
incStep=5
pos=depart
if __name__ == '__main__' :
pwm.start(AngleToDuty(pos)) #star pwm
nbRun=3
i=0
while i<nbRun:
print("--------------------------run {}".format(i))
for pos in range(depart,arrivee,incStep):
duty=AngleToDuty(pos)
pwm.ChangeDutyCycle(duty)
time.sleep(DELAY)
print("position: {}° -> duty cycle : {}%".format(pos,duty))
for pos in range(arrivee,depart,-incStep):
duty=AngleToDuty(pos)
pwm.ChangeDutyCycle(duty)
time.sleep(DELAY)
print("position: {}° -> duty cycle : {}%".format(pos,duty))
i=i+1
pwm.stop() #stop sending value to output
GPIO.cleanup() #release channel
Obs: Fique atento às indentações ao escrever ou copiar um código, para evitar erros de compilação.
Fontes
- A grande referência https://www.raspberrypi.org/help/
- Programar com Raspberry Pi
Retrouvez nos tutoriels et d’autres exemples dans notre générateur automatique de code
La Programmerie