Manual
do
Maker
.
com
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.
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.
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.
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.
Autor do blog "Do bit Ao Byte / Manual do Maker".
Viciado em embarcados desde 2006.
LinuxUser 158.760, desde 1997.