Páginas

segunda-feira, 23 de agosto de 2010

Controlar Um Servo motor de Parabólica Com Arduino.

Em uma de minhas andanças pela internet, encontrei o site de um amigo (Jeronimo Avelar Filho),
http://blogdoje.com.br/2008/11/07/controlando-motor-servo-de-parabolica-com-arduino/ que serviu de inspiração para que publicasse este post. (Afinal pra quê reinventar a roda! rsrsrsrs.)
 
Software

Um dos motores servos mais baratos encontrados no mercado é o “motorzinho azul de parabólica.”. Ele possui curso de 0 a 180 graus e é usado para movimentar o elemento receptor da uma antena parabólica .É facilmente encontrado, com preços entre R$15,00 e R$ 20,00 reais, em lojas de eletronica ou especializadas em sistemas de tv por satelite


Como é comum a todos os servos este motor possui três fios: preto para o terra , vermelho para a tensão de alimentação e branco ou azul para o sinal de controle . Este sinal de controle determina o ângulo de giro do motor através da largura do pulso enviado ao motor. O sinal de controle é facilmente gerado por um microcontrolador através de uma saida PWM e no caso do Arduino, podemos gerar este sinal através de uma aplicação simule o pwm atraves de mudanças no estado do pino de saida ou usar uma biblioteca já pronta e atualmente disponível no ambiente de desenvolvimento do Arduino versão 0012.

Para testar a biblioteca e o motor liguei o fio branco de controle do motor servo ao pino 10 do Arduino .

O programa de exemplo abaixo utiliza a porta serial emulada através da conexão USB para enviar um menu com as opções de angulo de giro do motor e aguarda o recebimento da opção através da porta serial. Ao receber uma opção válida , o programa faz o motor servo se posicionar de 0 a 180 graus de acordo com a opção que houver sido selecionada a partir do menu .

O programa é muito simples e merecem atenção as instruções servo.attach e servo.write . A função servo.attach função pode ser usada em sua forma mais simples que especifica apenas o pino no qual o servo está ligado e usados os valores defaut para o tempo mínimo e máximo do pulso ( 544 e 2400 microsegundos respectivamente) ou então pode ter também passados os este valores como parâmetros da função. O objetivo de passar estes valores é propiciar um ajuste fino para o motor servo que se está utilizando. No caso do motor servo de parabólica, eu utilizei os valores de x e y nos quais os motor se posicionou de forma mais precisa nos referenciais de 0 e 180 graus . Pra fazer o servo girar para um determinado angulo é utilizada a função nome_do_servo.write(angulo) como no exemplo abaixo.

Servo myservo ;
int led = 13 ;
int flag = 0 ;
int i ;
int char_in ;
void setup()
{
Serial.begin(9600) ;
pinMode(led , OUTPUT) ;
myservo.attach(10,880,2300) ;
colocaMenu() ;
}
//
...
...
//
case '1':
myservo.write(0) ;
Serial.println("Posicionado em 0 graus") ;
break;

Este motor servo de parabólica não possui um torque muito elevado e é preciso avaliar o que se vai movimentar com ele já que todas as suas partes são em plástico. Um detalhe importante é que a peça abaixo ligada ao eixo do motor é projetada para utilização na antena parabólica e é necessário adaptar ou construir uma peça de plástico para um formato mais adequado a utilização final no seu projeto .



Este motor internamente possui uma trava mecânica e se for enviado para ele um pulso maior que o máximo suportado, ele ficará batendo contra esta trava e poderá ser danificado .

Internamente o motorzinho possui um circuito de controle com um potenciómetro ligado ao eixo de movimentação, que identifica se o eixo está no ângulo correto .


Existem diversos outros servos que podem ser utilizados principalmente os usados em aeromodelos. Estes servos estao disponiveis em diversos modelos e tamanhos com torques maiores e acabamentos em metal , proporcionando maior controle na movimentação e resistencia ao desgaste das peças , pas para começar a brincar e fazer algum projeto que não necessite de componentes com maior precisão , este motorzinho de parabólica é uma mão na roda .

Programa para teste do Servo :
#include <Servo.h>


Servo myservo ;

int led = 13 ;

int flag = 0 ;

int i ;

int char_in ;



void setup()

{

Serial.begin(9600) ;

pinMode(led , OUTPUT) ;

myservo.attach(8,880,2300) ;

colocaMenu() ;

}



void loop()

{

//piscaled() ;

if(Serial.available() > 0 ) {

char_in = Serial.read() ;

if(char_in != -1) {

Serial.println(char_in,BYTE) ;

piscaled() ;

switch (char_in) {

case '1':

myservo.write(0) ;

Serial.println("Posicionado em 0 graus") ;

break;

case '2':

Serial.println("Posicionado em 45 graus") ;

myservo.write(45) ;

break;

case '3':

Serial.println("Posicionado em 90 graus") ;

myservo.write(90) ;

break;

case '4':

Serial.println("Posicionado em 135 graus") ;

myservo.write(135) ;

break;

case '5':

Serial.println("Posicionado em 180 graus") ;

myservo.write(180) ;

break;

//case '6':

//Serial.println("Posicionado em 225 graus") ;

//myservo.write(225) ;

//break;

//case '7':

//Serial.println("Posicionado em 270 graus") ;

//myservo.write(270) ;

//break;

default :

Serial.println("Opcao Invalida") ;

break;

}

}



}

}



void colocaMenu() {

Serial.println("Teste de motor servo") ;

Serial.println("Selecione :") ;

Serial.println("1 - Posicionar em 0 graus") ;

Serial.println("2 - Posicionar em 45 graus") ;

Serial.println("3 - Posicionar em 90 graus") ;

Serial.println("4 - Posicionar em 135 graus") ;

Serial.println("5 - Posicionar em 180 graus") ;

Serial.println("6 - Posicionar em 225 graus") ;

Serial.println("7 - Posicionar em 270 graus") ;

Serial.println("Opcao ? ") ;

}



void piscaled() {

if( flag==0) {

digitalWrite(led,HIGH) ;

flag =1 ;

} else {

digitalWrite(led,LOW) ;

flag =0 ;

}

}


 
Em fim meus caros; Espero que estejam gostando!
o código pronto para teste está no linck abaixo,
link Programa controle servo pronto P/Transferir arduino.pde

Existe uma interface feita em C# que pode ser utilizada com este programa:

É bem simples e intuitiva, basta selecionar a porta (em minha máquina = 9)
a velocidade (9600).
click em "start"
após establizar a conecção, digitar o comando e enviar para que o servo se posicione.
vejam as figuras a seguir:









Viu para teste este projeto ajuda bastante!
eis o link para baixar:

easy talk compilado ( .exe )

easy talk compilado (.zip)

Façam comentários pois o termômetro deste site são vocês!
Neste site nada é proibido! Toda sugestão será bem vinda!
agora vou dormir um pouco...

Att.: Marcelo Bacana.

3 comentários:

  1. achei bastante interessante este esquema...mas gostaria de saber como comandar dois servos independentes, com placa "arduino".O servo1 indo de 0 a 180 e, parando e, o servo2 de 180 a 0, com controlo de passo 1º e, chegando ao fim do loop, saido do programa.Poderá me indicar o código para que eu possa testar? Muito obrigado

    ResponderExcluir
  2. Ok, bom tutorial so faltou uma imagem do esquema do servo com o Arduino, pro pessoal menos experiente, ajuda muito esse esquema.

    Valeu!!

    ResponderExcluir

teste comentario