Controlando um servo motor com Arduino
O grande barato de comprar as coisas pela internet, e no exterior, é a quase completa falta de
manuais. Um exemplo disso é o servo motor abaixo, que chegou essa semana :
Chegou inteiro, mas desse jeito : o servo, os acessórios num plástico, e só. Uma etiqueta
escrito "Micro Servo 9g" foi a maior pista que eu tive do modelo.
Aí começa a parte divertida da coisa, que é descobrir como o servo funciona, suas conexões,
voltagens e tal. Vasculhando no Google, descobri um modelo muito parecido,
chamado HXT900, e que sua voltagem de operação vai de 3 a 6v. Já é um começo. Mas e as
conexões ?
Bom, o cabo tem 3 vias : Preto, vermelho e branco. Fácil, não ? 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 potenciômetro
para controlar a rotação do motor :
O programa abaixo você pode encontrar no menu Arquivo -> Exemplos -> Servo -> Knob :
1 // Programa : Controlando a posicao de um servo usando
2 potenciometro
3 // Traducao e comentarios : Arduino e Cia
4 //
5 // Controlling a servo position using a potentiometer (variable
6 resistor)
// by Michal Rinott <http://people.interaction-ivrea.it/m.rinott>
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 posição
36 delay(15);
}
O programa lê as informações do potenciômetro ligado à entrada analógica (valores de 0 a
1023), converte esses valores para serem usados no servo (0 a 180), e move o servo motor
para a posição correspondente. Gire o potenciômetro nos 2 sentidos, e o servo irá acompanhar
o movimento do potenciômetro.
Também podemos controlar o servo usando posições pré-estabelecidas, o que é muito útil
quando precisamos usar o motor para movimentos repetitivos. Como no exemplo abaixo, onde
utilizei 3 chaves (push-button) :
e o seguinte programa :
1 // Programa : Controlando o servo com 3 chaves
2 // Autor: Arduino e Cia
3
4 #include <Servo.h>
5
6 Servo myservo;
7
8 int val;
9 int ChaveEsquerda=3; //Pino a ser ligado na chave esquerda
10 int ChaveCentral=4; //Pino a ser ligado na chave central
11 int ChaveDireita=5; //Pino a ser ligado na chave direita
12
13 void setup()
14 {
15 // Pino de dados do servo conectado ao pino 9 do Arduino
16 myservo.attach(9);
17 //Define o pino como entrada
18 pinMode(ChaveEsquerda, INPUT);
19 //Aciona o resistor pull-up interno
20 digitalWrite(ChaveEsquerda, HIGH);
21 pinMode(ChaveCentral, INPUT);
22 digitalWrite(ChaveCentral, HIGH);
23 pinMode(ChaveDireita, INPUT);
24 digitalWrite(ChaveDireita, HIGH);
25 }
26
27 void loop()
28 {
29 //Le o valor da Chave Esquerda (On/Off)
30 val=digitalRead(ChaveEsquerda);
31 //Caso a chave seja pressionada, movimenta o servo
32 if(val!=1)
33 {
34 myservo.write(60); //Move o servo para o angulo de 60
35 graus
36 delay(15); //Delay para o servo atingir a posiçao
37 }
38
val=digitalRead(ChaveCentral);
if(val!=1)
39 {
40 myservo.write(90); //Move o servo para o angulo de 90
41 graus
42 delay(15);
43 }
44
45 val=digitalRead(ChaveDireita);
46 if(val!=1)
47 {
48 myservo.write(120); //Move o servo para o angulo de 120
49 graus
50 delay(15);
51 }
}
Ao pressionar o botão da esquerda, o servo se movimenta para a posição "60 graus", o botão
central leva à posição 90 graus, e o botão da direita, à posição 120 graus.