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.