Академический Документы
Профессиональный Документы
Культура Документы
Chegou inteiro, mas desse jeito : o servo, os acessrios num plstico, e s. Uma etiqueta
escrito "Micro Servo 9g" foi a maior pista que eu tive do modelo.
A comea a parte divertida da coisa, que descobrir como o servo funciona, suas
conexes, voltagens e tal. Vasculhando no Google, descobri um modelo muito parecido,
chamado HXT900, e que sua voltagem de operao vai de 3 a 6v. J um comeo. Mas
e as conexes ?
Bom, o cabo tem 3 vias : Preto, vermelho e branco. Fcil, no ? Preto no GND,
vermelho no 5V e branco para dados.
Testei o servo usando o exemplo que j vem na IDE do Arduino, que usa um
potencimetro para controlar a rotao do motor :
O programa abaixo voc pode encontrar no menu Arquivo -> Exemplos -> Servo ->
Knob :
// Programa : Controlando a posicao de um servo usando
potenciometro
1 // Traducao e comentarios : Arduino e Cia
2 //
3 // Controlling a servo position using a potentiometer (variable
4 resistor)
5 // by Michal Rinott <http://people.interaction-ivrea.it/m.rinott>
6
7
8 #include <Servo.h>
9 Servo myservo; // create servo object to control a servo
10
11 // Pino analgico do potenciometro
12 int potpin = 0;
13
14 // Variavel que armazena o valor lido do potenciometro
15 int val;
16
17 void setup()
18 {
19 // Define que o servo esta ligado a porta 9
20 myservo.attach(9);
21 }
22
23 void loop()
24 {
25 // Le o valor do potenciometro (valores entre 0 e 1023)
26 val = analogRead(potpin);
27
28 // Converte o valor pra ser usado no servo (valores entre 0 e
29 180)
30 val = map(val, 0, 1023, 0, 179);
31
32 // Move o eixo do servo, de acordo com o angulo
33 myservo.write(val);
34
35 // Aguarda o servo atingir a posio
36 delay(15);
}
http://www.arduinoecia.com.br/2013/06/controlando-um-servo.html
________________________________________________________________
Para ter um primeiro contato com os servos, recorri a uma aplicao familiar, embora eu
a tenha implementado de forma bem diferente (e bem menos eficiente) que o elegante
mecanismo tradicional: um ventilador oscilante.
Os ventiladores tradicionais capazes de movimentar lateralmente seu corpo para dirigir
o vento a diferentes partes do ambiente usam um mecanismo que aproveita o mesmo
movimento do motor que gira a hlice para tambm fazer a oscilao lateral. Para o meu
objetivo, entretanto, bastava imitar o efeito produzido, e assim usei um motor parte
(justamente o servo, com o qual eu queria me familiarizar) para se encarregar da
oscilao, enquanto a hlice era operada pelo nosso velho amigo mdulo Keyes 14c04,
o mesmo que eu usei para soprar e apagar as chamas de um isqueiro no artigo Arduino,
sensor de chamas e hlice: detectando e apagando um isqueiro.
Como em vrios outros aspectos deste meu aprendizado sobre o Arduino, acabei
descobrindo que a operao bsica dos servos mais simples do que eu imaginava:
basta inicializ-los e depois "escrever" neles os ngulos para os quais queremos que eles
apontem. Isso ocorre devido existncia da biblioteca Servo, que acompanha o Arduino
e cuja documentao, incluindo a lista de funes que ela disponibiliza, foi suficiente
para realizar o experimento de hoje.
O circuito
Sobre o mdulo da hlice, os detalhes j constam no artigo anterior, mas vale resumir:
alm do pino de alimentao e do terra, temos 2 pinos de controle: INA e INB. Se
ambos estiverem com o mesmo valor (HIGH e HIGH ou LOW e LOW), a hlice para.
Se estiverem com valores diferentes, ela gira no sentido horrio ou anti-horrio,
conforme o caso.
Note que a simplicidade do circuito que eu montei talvez pudesse ser ainda maior:
segundo a documentao, como eu estou usando apenas 1 servo, eu poderia aliment-lo
diretamente do pino 5V do prprio Arduino, sem recorrer a uma fonte externa.
Mas eu fiz algumas contas por alto sobre a possibilidade de consumo no pior caso com
relao ao conjunto servo + ventilador, e preferi separar a alimentao do Arduino e a
dos 2 motores, recorrendo assim a um suporte para 4 pilhas AA. Tambm testei com a
obteno de alimentao de uma porta USB do computador, e funcionou igualmente
bem. Poderia ter usado transistores para chavear os pinos de comando, para separar
ainda mais o Arduino dos demais componentes, e talvez faa isso em futuras aplicaes.
Programao do Arduino para controlar o servo
O programa que eu tinha em mente era bem simples: considerando que o mdulo
ventilador foi fixado ao eixo do servo, bastava ligar a hlice e a instruir o servo para
apontar para diferentes ngulos, indo e voltando.
#include <Servo.h>
Servo servo90g;
void setup() {
servo90g.attach(A0);
pinMode(vent_INA,OUTPUT);
pinMode(vent_INB,OUTPUT);
digitalWrite(vent_INA,LOW);
digitalWrite(vent_INB,HIGH);
}
int angulo=0;
const int pausa=350;
const byte angbase=14;
const byte angmax=28;
void loop() {
for(angulo = angbase; angulo < angmax; angulo++)
{
servo90g.write(angulo);
delay(pausa);
}
for(angulo = angmax; angulo>=angbase; angulo--)
{
servo90g.write(angulo);
delay(pausa);
}
}
Para completar, em cor salmo, esto as 2 linhas que mandam o servo apontar para um
determinado ngulo. A primeira delas est em um loop crescente, e a segunda est em
um loop decrescente. Esses loops so os responsveis pelo efeito de ida e volta graduais
tpico da oscilao lateral de um ventilador domstico.
No necessrio saber ou entender isso para usar a biblioteca Servo mas, graas ao
captulo 5 do livro Arduino em Ao (publicado pela Novatec, patrocinadora do BR-
Arduino.org), eu satisfiz minha curiosidade sobre como o protocolo que a biblioteca
Servo usa para transmitir ngulos para um servomotor.
A biblioteca envia os comandos pelo pino de sinal, por meio de uma forma de PWM na
qual os parmetros importantes so a frequncia com que o pulso se repete (geralmente
a cada 20ms), e a durao de cada pulso, que indica o ngulo para o qual o servo deve
apontar.
A imagem abaixo mostra 3 variaes de durao de pulso, e seu efeito sobre um modelo
de servo em particular:
Observe: se o pulso dura 1ms, o servo apontar para o seu ngulo mnimo. Com um
pulso de 1,5ms, ele apontar para a posio central, e se o pulso for de 2ms, apontar
para seu ngulo mximo. Assim, o ngulo ser proporcional a qualquer valor entre 1ms
e 2ms.
Esses valores so tpicos e esperados, mas podem variar: cada modelo de servo tem seu
ngulo mnimo e mximo, bem como pode alterar os limites mnimos e mximos de
durao do pulso. Para verificar se o seu motor pode ir abaixo de 1ms (que podem
corresponder a ngulos inferiores a 0) ou acima de 2ms (ngulos superiores a 180),
voc pode usar a funo writeMicroseconds(), mas leia bem a documentao dela antes,
pois ela contm um alerta sobre uma situao a ser evitada.
O exemplo acima bsico mas explora o essencial da interao entre Arduino e servos:
inicializ-los e faz-los apontar para ngulos.
Na maior parte dos modelos de Arduino, at 12 servos podem ser controlados pela
biblioteca Servo. Vale observar que, nesses mesmos modelos, o uso de PWM (comando
analogWrite()) nos pinos 9 e 10 fica desativado quando a biblioteca Servo estiver em
uso.
http://br-arduino.org/2015/01/arduino-e-servos-como-controlar-servomotores.html
http://automacaoerobotica.blogspot.com.br/2012/07/controlando-servomotores-com-
arduino.html
J recebi varios e-mails perguntando se possvel controlar dois ou mais servo motores
com o Arduino, fiquei de postar o cdigo aqui mas sempre acabava esquecendo.
Como voc j deve ter visto, no projeto que desenvolvi com o Emotiv Epoc + Arduino
utilizo dois servo motores para representar o prottipo.
Se a primeira vez que voc vai se aventurar com Arduino e servo motores, aconselho
dar uma lida neste post (Controlando Servo Motor utilizando o teclado com Arduino e
C#), e claro, para isso, necessrio que voc j tenha um mnimo de conhecimento no
assunto. Caso queira pesquisar mais, sugiro que de uma olhada no site oficial do
Arduino (arduino.cc).
O que eu fiz foi colocar um bloco if e fazendo a verificao da string de entrada via
serial para identificar para qual servo motor queremos enviar o comando.
simples, no projeto com apenas um servo, enviamos uma string, por exemplo: 180,
e o servo movimenta 180 graus. Com dois, acrescentamos um caracter ao final, por
exemplo: 180a, movimentamos o servo A 180 graus.
Como voc deve j ter observado, a comparao feita utilizando o cdigo do caracter
de acordo com a tabela ASCII.
Se voc precisar controlar mais de dois servo motores, s implementar mais condies
(seria mais elegante usar o bloco switch) e utilizar outros caracteres (da tabela ASCII)
para se identificar os motores.
No sei se essa a forma mais elegante de se implementar isto, mas foi uma soluo
que encontrei quando me deparei com este problema, se algum possui alguma outra
forma, por favor contribua.
Como eu disse anteriormente, se voc j seguiu este tutorial no ter problema algum
em entender o funcionamento e vai lhe servir muito bem.
http://www.renatopeterman.com.br/blog/2011/07/26/controlando-dois-ou-mais-servo-
motores-com-arduino/
O encoder que utilizamos tem rotao contnua, e tambm um boto (basta empurrar o eixo)
que vamos usar para selecionar uma das opes do "menu" no display.
Ligando o encoder no Arduino
O primeiro circuito de testes utiliza somente o encoder. Vamos utilizar 3 pinos do Arduino para
ligar o componente, sendo que os pinos analgicos A2 e A3 sero ligados nos pinos de medio,
e o pino digital 7 no pino do boto, junto com um resistor pull-up.
Caso voc esteja utilizando somente o encoder (sem o mdulo, siga o esquema ligao abaixo:
Teste esse circuito carregando o programa abaixo, que utiliza a biblioteca RotaryEncoder
(download). Baixe a biblioteca e coloque-a na pasta LIBRARIES da IDE do Arduino.
Esse um circuito bem simples que voc pode usar para testar se o seu encoder est
funcionando corretamente.
No loop, testamos se o boto foi pressionado, e tambm limitamos as opes de seleo entre
1 e 6, atravs do comando encoder.setPosition(). O programa checa se o valor do encoder foi
alterado e, em caso positivo, chama a rotina destaque_selecionado(), que atualiza os dados da
tela.
Achou a explicao muito complicada ? D uma olhada no vdeo abaixo, que mostra esse circuito
em funcionamento:
O programa atualiza os valores somente na tela, mas voc pode modificar facilmente este
programa para que ele acione portas do Arduino ou envie e receba dados de algum sensor
http://www.arduinoecia.com.br/2015/08/como-usar-encoder-rotativo-ky-040-arduino.html