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