quarta-feira, 21 de setembro de 2011

arduino + gambiarra

Eletrônica digital com Arduino: sensor ultrasônico + servo motor = olhos

Para o nosso robô caminhar com a capacidade de desviar-se de obstáculos, decidi fazer seus ‘olhos’ com um sensor ultrasônico HC-SR04, bastante popular em Arduino – tanto que possui até uma biblioteca, que pode ser baixada nesse link. Baixe o arquivo e extraia-o em arduino-0022/libraries/. Será criado um diretório chamado Ultrasonic contendo a classe e a estrutura da classe. O sensor:

Seu uso é bastante simples. Como se pode ver na imagem, à esquerda a alimentação (5V), Trig, Echo e ground, seguidamente.
No setup() do programa, seguimos os passos básicos:

#include <Ultrasonic.h>

//Define os pinos trig e echo:
int pin_trig = 12; //recebe o retorno
int pin_echo = 13; //emite o som
//Cria-se o objeto:
Ultrasonic ultrasonic(pin_trig, pin_echo);

Essa classe é muito simples de utilizar, bastando chamar o método que retorna a distância, com o parâmetro CM para retorno em centímetros:

//no setup() inicia-se a comunicacao serial:
Serial.begin(9600);

//no loop(), insere-se esse print:
Serial.print(ultrasonic.Ranging(CM));
//um mero delay:
delay(300);

O resultado já poderá ser visto abrindo o console serial da interface do Arduino.
Já que é possível pegar esse retorno rapidamente (240m/s, conforme especificação do dispositivo), então fica fácil utilizá-lo como olhos, para escolher a direção em que o robô deverá andar. Para tanto, criei uma nova biblioteca para definir o servo como o ‘pescoço’ do nosso sensor. A classe foi chamada Brain (cérebro em inglês), pois todas as ações serão pensadas por ele. Essa classe devera cumprir as seguintes tarefas:
- caminhar (para frente ou para trás)
- escolher a direção a andar.
- alinhar o corpo do robô na direção escolhida.
Essa classe possui alguns atributos como por exemplo, a distância de tolerância, que é de 15 centímetros; quando a distância for menor que isso, então o ‘pescoço’ começa a se deslocar para esquerda e direita à procura de uma direção que haja uma distância maior que 15 centímetros. Quando encontrada, alinha o corpo na direção dos ‘olhos’ e inicia a caminhada. Se em um ângulo de 180 graus não for encontrada uma direção com mais de 15 centímetros (por exemplo, a junção de duas paredes), então o robô deverá dar uma ré girando até 180 graus, alinhar-se e seguir em frente.
Eu sei que tem algorítmos complexos para definir caminhos, algorítmos baseados no caminhar dos pombos, na dança dos cisnes, no balé de Berlin, etc – mas aqui o único e simples objetivo é construir um robô para prova de conceito. Assim o faremos.
Nesse primeiro momento, minha classe está incompleta e não pode ser totalmente implementada ainda, mas já consegui experimentar a idéia. Explanarei sobre essa classe mais adiante.
O circuito no Arduino fica assim:

Gostou do desenho? Utilizei o Fritzing, que é um free software. Infelizmente não encontrei em sua biblioteca o HC-SR04, então utilizei um sensor infra-vermelho para representá-lo (gambiarra numero 1).
As imagens da composição para que se possa dar uma observada (gambiarra numero 2).
Perfil:

Vista superior. Utilizei um suporte de tomada para fixar o sensor ultrasonico. O servo-motor está preso a uma mini-morsa.

A protoboard não está sendo utilizada corretamente, mas tive que fazer assim por causa da falta de espaço (gambiarra numero 3).

Ainda não está terminada, então não disponibilizarei a classe Brain para download, mas vou explicar como a utilizei:
- Copiei a classe e a estrutura da classe para ~/arduino-002/libraries/Brain/

//fazer o include da biblioteca Brain no comeco do codigo
#include <Brain.h>
//Ainda no comeco do codigo, criar o objeto com a posicao inicial do servo:
Brain brain(89);
//Criar a variavel posicao no setup():
int posicao = 89;
//no loop(), inserir essa linha:
posicao = brain.findDirectionToGo(int(ultrasonic.Ranging(CM)));

O resto do código é relacionado ao servo, basicamente. Quando disponibilizar a biblioteca, disponibilizarei também o código desse projeto.
Para finalizar, eis o video dos ‘olhos’ do robô:

Nenhum comentário:

Postar um comentário