fbpixel
Etiquetas: , , ,

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).

towerpro-servo-sg90 Controlar um servomotor com o Raspberry Pi

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.

raspberry-pi3-servomotor_bb Controlar um servomotor com o Raspberry Pi

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

rp2_pinout Controlar um servomotor com o Raspberry Pi

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