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 recentemente e veio em boa hora, já que faltava no blog um post de servo motor com Arduino.

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, tensão de trabalho e tal. Vasculhando no Google, descobri um modelo muito parecido, chamado HXT900, e que sua tensão de operação vai de 3 a 6v. Já é um começo. Mas e as conexões?
Testando o servo motor com Arduino
Bom, o cabo tem 3 vias : Preto, vermelho e branco. Fácil, não ? Preto no GND, vermelho no 5V e branco para dados (ou sinal).
Testei o servo motor com Arduino usando o exemplo que já vem na IDE, que usa um potenciômetro para controlar a rotação do motor:
O programa abaixo para usar o servo com Arduino você pode encontrar no menu Arquivo -> Exemplos -> Servo -> Knob:
// Programa : Controlando a posicao de um servo usando potenciometro
// Traducao e comentarios : Arduino e Cia
//
// Controlling a servo position using a potentiometer (variable resistor)
// by Michal Rinott <http://people.interaction-ivrea.it/m.rinott>
#include <Servo.h>
Servo myservo; // create servo object to control a servo
// Pino analgico do potenciometro
int potpin = 0;
// Variavel que armazena o valor lido do potenciometro
int val;
void setup()
{
// Define que o servo esta ligado a porta 9
myservo.attach(9);
}
void loop()
{
// Le o valor do potenciometro (valores entre 0 e 1023)
val = analogRead(potpin);
// Converte o valor pra ser usado no servo (valores entre 0 e 180)
val = map(val, 0, 1023, 0, 179);
// Move o eixo do servo, de acordo com o angulo
myservo.write(val);
// Aguarda o servo atingir a posição
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:
// Programa : Controlando o servo com 3 chaves
// Autor: Arduino e Cia
#include <Servo.h>
Servo myservo;
int val;
int ChaveEsquerda=3; //Pino a ser ligado na chave esquerda
int ChaveCentral=4; //Pino a ser ligado na chave central
int ChaveDireita=5; //Pino a ser ligado na chave direita
void setup()
{
// Pino de dados do servo conectado ao pino 9 do Arduino
myservo.attach(9);
//Define o pino como entrada
pinMode(ChaveEsquerda, INPUT);
//Aciona o resistor pull-up interno
digitalWrite(ChaveEsquerda, HIGH);
pinMode(ChaveCentral, INPUT);
digitalWrite(ChaveCentral, HIGH);
pinMode(ChaveDireita, INPUT);
digitalWrite(ChaveDireita, HIGH);
}
void loop()
{
//Le o valor da Chave Esquerda (On/Off)
val=digitalRead(ChaveEsquerda);
//Caso a chave seja pressionada, movimenta o servo
if(val!=1)
{
myservo.write(60); //Move o servo para o angulo de 60 graus
delay(15); //Delay para o servo atingir a posiçao
}
val=digitalRead(ChaveCentral);
if(val!=1)
{
myservo.write(90); //Move o servo para o angulo de 90 graus
delay(15);
}
val=digitalRead(ChaveDireita);
if(val!=1)
{
myservo.write(120); //Move o servo para o angulo de 120 graus
delay(15);
}
}
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.