Manual

do

Maker

.

com

Controle digital do servo motor com Arduino

Controle digital do servo motor com Arduino

No post anterior foi detalhado o procedimento para funcionar um servo motor com interação analógica. Agora vamos fazer os experimentos para interação digital, para que posteriormente o robô faça sozinho essa interação.

Não era meu intuito falar de objetos, mas será inevitável. Serão necessários conhecimentos mais específicos da linguagem C e C++, portanto recomendo o site http://www.cplusplus.com/ (em inglês). Nesse site você poderá encontrar todas as referências necessárias para maior entendimento dos recursos que serão empregados daqui em diante, mas tentarei explicar sempre da maneira mais simples possível.

Controle do servo motor

O comportamento do servo motor é simples; ele possui 180º de movimento, sendo que operaremos controlando seu movimento com valores variáveis que vão de 0 a 179. Chamemos essa variável de posicao.

Biblioteca e objeto

Para controle do servo, há uma biblioteca padrão do Arduino, chamada Servo. Para utilizá-lo, o primeiro passo é incluí-lo no código principal do seu programa:

#include <Servo.h>

O próximo passo é criar o objeto do servo:

Servo servo1;

Sem entrar em detalhes, o comando anterior cria um objeto chamado servo1, a partir da classe Servo, da biblioteca Servo.h importada. A partir de agora é possível utilizar os métodos dessa classe no seu programa utilizando o objeto criado (servo1).

Métodos são conjuntos de instruções para se executar uma determinada tarefa (consulte por classes, métodos, atributos). No nosso caso, a primeira chamada de um método do nosso servo é a especificação da porta que será utilizada para ler sua posição. Esse método recebe como parâmetro o número da porta e o atribui a uma variavel contida na classe Servo. A porta como uma variável interna da classe Servo é chamada "atributo". Antes de iniciarmos a porta em setup(), vamos criar a variável posicao e em seguida iniciamos a porta:

//centraliza-se na posicao 90 (0-89|90-179)
int posicao = 90;
//cria-se uma variavel para left e right
char LeftRight;
void setup(){
    servo1.attach(8); // Porta onde sera ligado o servo
    Serial.begin(9600) // inicializar porta serial
}

No loop, simplesmente vamos fazer a leitura serial de um char 'r' ou 'l' para right e left respectivamente. Criamos a variável que guardará a posição e a variável para guardar o char. É um exemplo simples, mas divertido. Veja porque:

//inicia-se o loop
void loop(){
  //Faz-se uma leitura serial:
  LeftRight = Serial.read();
  //se digitado 'r' e a posicao for menor que o maximo...
  if (LeftRight == 108 && posicao < 175){
    //add 5 da posicao (direita)
    posicao += 5;
  }
  else if (LeftRight == 114 && posicao >0){
    posicao -=5;
  }
  //imprime o valor decimal do byte digitado via seria
  Serial.println(int(LeftRight));
  //trocando o valor de LeftRight para nao cair na condicao
  LeftRight = 'z';
  //troca-se a posicao do servo conforme a condicao
  servo1.write(posicao);
  //pausa de 0.3s
  delay(300);
}

O interessante aqui é o seguinte; se 'r' ou 'l' for digitado mais de uma vez, o movimento ocorrerá tantas vezes quanto for digitado antes do enter (até os limites da condição, claro). E pode-se mesclar 'r' e 'l' várias vezes. No robô não utilizaremos serial; ou será comunicação por ethernet ou será automático o movimento.

Em relação ao artigo anterior, não toquei na estrutura eletrônica (de propósito); apenas "mudei a direção" da origem da posição, que ao invés de vir de uma variação do potenciômetro, vem agora do apontamento da variável 'posicao' através da manipulação serial.

Por fim, o video desse experimento, direto da interface de desenvolvimento do arduino, utilizando o monitor serial.

Recomendo a leitura do artigo do projeto de um robô que utiliza servo para direcionar um sensor ultrassõnico para encontrar a direção a seguir.

Nome do Autor

Djames Suhanko

Autor do blog "Do bit Ao Byte / Manual do Maker".

Viciado em embarcados desde 2006.
LinuxUser 158.760, desde 1997.