Site icon AranaCorp

Controlar um servomotor com o Raspberry Pi

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

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

Retrouvez nos tutoriels et d’autres exemples dans notre générateur automatique de code
La Programmerie

Exit mobile version