Postagem em destaque

Controle PID de Potência em Corrente Alternada - Arduino e TRIAC - Parte I

Este post é o primeiro de uma série de seis que escrevi tratando de controle de potência e PID (controle proporcional, integral e derivativo...

sexta-feira, 18 de abril de 2014

Acionando servo-motores de giro contínuo com o Raspberry Pi e Python

Agora vejamos como comandar um servo-motor com o Raspberry. Nesse post eu não vou entrar em muitos detalhes sobre o funcionamento de servos, nem sobre como usar o GPIO do Raspberry. Se precisar de mais detalhes, dê um Google sobre servos e leia o post Entendendo o Raspberry GPIO: piscando LED, neste blog.

Para acionar um servo precisamos de três fios: alimentação (5 a 6 Vcc), terra e dados. Como um servo, por menor que seja, usa muita corrente, vc deve usar uma fonte separada e não ligar o servo aos pinos 5V e terra do Raspberry, sob pena de queimá-lo. Pode-se usar por exemplo um conjunto com quatro pilhas, ou uma bateria como a que usei e que vcs verão em foto abaixo.

O terceiro fio receberá o sinal que comanda o servo. Para controlar um servo devemos enviar um sinal de pulsos com uma determinada frequência. Esses pulsos nada mais são do que um "liga/desliga", quer dizer, o Raspberry deve criar na sua porta um sinal que alterne 0V e 5V com um determinado intervalo de mudanças pré definido. No post anterior eu montei um circuito onde a frequência era 0,5 Hz, ou seja, o LED fica um segundo aceso e um segundo apagado, ou seja, cada ciclo dura dois segundos. Para controlar um motor de passo os pulsos são da ordem de milissegundos.

Existem dois tipos de servos que são mais utilizados por hobistas, que servem a propósitos diferentes e são comandados de forma diferente.

1) Servo com giro limitado a um determinado ângulo (geralmente 90° ou 180°): esse tipo de servo é posicional, ou seja, se a gente manda uma determinada frequência e ele se move para um determinado ângulo. Especificamente, na maioria dos servos, vc tem o seguinte comportamento:

Pulso      Ângulo
0.5 ms         0°
1.5 ms        90°
2.5 ms       180°

Em tese um único pulso posicionaria o motor no ângulo desejado. Porém, o que se faz na prática é mandar muitos ou ficar mandando continuamente, de maneira a dar tempo para que ele se posicione.

2) Servo de giro contínuo: esse tipo de servo não tem uma referência, ou seja, ele não "sabe" a sua posição. Assim, ele funciona como um motor normal, só que roda a uma velocidade reduzida e portanto tem mais torque que um motor CC de mesma potência.

Nesse caso também comandamos o servo com pulsos, mas o comportamento é outro:

Pulso     Direção
< 0.5 ms  Sentido anti-horário
1.5 ms    Parado
> 2.5 ms  Sentido horário

A velocidade aumenta, num sentido ou noutro, à medida em que nos afastamos de 1.5 ms de pulso. No motor que estou testando, qualquer pulso com duração entre 1.4 e 1.5 ms já para o servo. Já no sentido horário o motor já é acionado a partir de 1.53 ms. Ou seja, é testar prá ver no que dá.

Acontece que o Raspberry é um dispositivo multitarefa, ou seja, ele faz mais de uma coisa ao mesmo tempo. Isso significa que esses pulsos podem ser afetados se o processador for exigido por alguma outra tarefa que ele esteja rodando, o que pode fazer a velocidade variar ou mesmo inviabilizar o uso do servo. Quando precisamos de um controle preciso ou de comandar mais de um servo, é recomendado usar uma placa controladora de servos a ser comandada pelo Pi ou mesmo usar um Arduino, também comandado pelo Pi.

Abaixo, imagens do circuito montado:

Circuito
A fonte que "toca" o motor é essa bateria verde. Ela por sua vez está ligada a uma plaquinha que alimenta a protoboard. Se for um motor daqueles pequenininhos azuis, de aeromodelismo, dá prá ligar direto no Pi. Os fios vermelho, preto e branco saindo pela parte inferior estão conectado ao servo. O fio branco se conecta, através do dio verde, à porta GPIO17 do Raspberry.

Não se esqueça de ligar o terra da fonte ao terra do Pi, para que o circuito funcione.


Aqui a visão mostrando o motor também. Ele tem um CD acoplado em cima para servir de base a um troço que estou querendo montar depois.

Bom, agora o sofware. Moleza:

from RPIO import PWM
import time

servo = PWM.Servo()

servo.set_servo(17, 1530)
time.sleep(60)
servo.stop_servo(17)

Observem que eu usei uma biblioteca chamada RPIO. É uma biblioteca mais ou menos igual à RPi, mas como ela já tem um objeto servo, eu decidi usá-la. Ela também usa alguns artifícios para fazer com que os pulsos sejam bem estáveis, evitando perturbações de velocidade descritas anteriormente.

Para instalar a RPIO é simples. No terminal do RasPi, dar os comandos:

sudo apt-get install python-setuptools
sudo easy_install -U RPIO

Ao rodar o programa acima, o meu motor gira bem lentamente no sentido horário durante 60s. conforme vc pode ver abaixo:


É isso!