As bases robóticas autônomas, ou qualquer outro tipo de autômato, normalmente conta com algum tipo de "visão" computacional para reconhecer e/ou desviar de obstáculos, ou até mesmo para seguir um caminho fisicamente determinado, como fazem os seguidores de linha.
O protótipo para robô de movimento autônomo aqui apresentado é composto por uma base robótica e um circuito de controle por microcontrolador, que usa um Arduino e um Sensor de Distância acoplado a um Servo Motor, para a movimentação do sensor, "observando" o ambiente e escolhendo a melhor forma para desviar dos obstáculos do ambiente de uso.
A atuação do robô é bem limitada, onde o mesmo deve se deslocar em uma determinada direção e caso encontre um obstáculo, deve fazer um rápido retrocesso, "olhar" a direita e a esquerda e "apontar" para a direção onde não hajam obstáculos, ou que tenha maior distância entre o novo obstáculo e a base robótica. Como pode ser observado na Animação a seguir.
Esta categoria de produtos é basicamente composta por um o circuito de controle, que tem como função acionar os motores do robô de acordo com um comportamento previamente determinada - como nas descritas no parágrafo anterior. Para o produto aqui apresentado, o circuito é composto por um microcontrolador (neste caso o Arduino), que irá processar os dados vindos do sensor de distância (o HC-SR04) e, através de uma ponte de reversão de motores (a Ponte H com L298n), acionar os mesmos. Dito isso, observa-se que a simulação a seguir apresenta algumas poucas diferenças de implementação em relação ao produto a ser efetivamente desenvolvido. Estas diferenças estão principalmente relacionadas aos componentes encontrados no simulador, que não serão os mesmos disponíveis quando da implementação real, a saber: i) o controlador de rotação dos motores é o circuito integrado L293D e; ii) não será usado o Sensor Shield v5.0, que tem como função facilitar as conexões entre os dispositivos e o Arduino.
Como este é um produto desenvolvido especialmente para apresentações e oficinas práticas, uma especificação robusta, para componentes, foi definida. Desta forma, um kit comum de desenvolvimento robótico de baixo custo foi adquirido e montado. O vídeo a seguir é um dos muito exemplos que demonstram todo o processo de montagem do produto.
Algumas diferenças entre o kit adquirido e o efetivamente montado estão na troca da placa de acrílico (que quebrou na montagem) por uma de plástico rígido (metarreciclada e mais resistente que a de acrílico) e na troca de algumas das entradas (pinos) de sensores, pois em breve será adicionado a este produto, uma placa Bluetooth para controle por Smartphone. A apresentação de Slides a seguir, apresenta o processo de desenvolvimento do produto aqui desenvolvido.
A simulação do circuito já disponibiliza o programa que implementa as funcionalidades do robô. No entanto, o programa ainda usa a biblioteca padrão para uso do Sensor de Distância. A seguir está disponível o código fonte para a implementação que usa a biblioteca NewPing.
#include <Servo.h> // Biblioteca Servo Motor
#include <NewPing.h> // Biblioteca Sensor Ultrasonico - Instalar
// Constantes de Controle L298N
#define MotorDireitoAdiante 4
#define MotorDireitoRe 5
#define MotorEsquerdoAdiante 7
#define MotorEsquerdoRe 6
//Constantes Ultrason
#define PinoTrig A1
#define PinoEcho A2
#define Distancia_Max 200
// Variáveis Públicas
NewPing sonar( PinoTrig, PinoEcho, Distancia_Max ); // Cria Objeto "sonar"
Servo servo_motor; // Cria Objeto "servo_motor"
void setup(){
// Inicia Portas para Controlar Motores e Servo
pinMode( MotorDireitoAdiante, OUTPUT );
pinMode( MotorEsquerdoRe, OUTPUT );
pinMode( MotorEsquerdoAdiante, OUTPUT );
pinMode( MotorDireitoRe, OUTPUT );
servo_motor.attach( 11 );
servo_motor.write( 90 );
delay( 500 );
}
void loop(){
verificaObstaculo();
}
void verificaObstaculo() {
int idistDireita;
int idistEsquerda;
if( leituraPing() <= 25 ) {
pararMovimento();
delay( 300 );
moverRe();
delay( 400 );
pararMovimento();
delay( 300 );
idistDireita = olhar( 'd' );
delay( 300 );
idistEsquerda = olhar( 'e' );
delay( 300 );
if( idistDireita >= idistEsquerda ) moverDireita();
else moverEsquerda();
delay( 200 );
}
else moverAvante();
}
int olhar( char cDir ) {
int idistancia;
servo_motor.write( cDir == 'd' ? 20 : 160 );
delay( 400 );
idistancia = leituraPing();
delay( 50 );
servo_motor.write( 90 );
return idistancia;
}
int leituraPing( ) {
int iCm = 0;
delay( 50 );
iCm = sonar.ping_cm();
return( iCm == 0 ? 250 : iCm );
}
void pararMovimento(){
digitalWrite( MotorDireitoAdiante, LOW );
digitalWrite( MotorEsquerdoRe, LOW );
digitalWrite( MotorDireitoRe, LOW );
digitalWrite( MotorEsquerdoAdiante, LOW );
}
void moverAvante(){
digitalWrite( MotorDireitoAdiante, HIGH );
digitalWrite( MotorDireitoRe, LOW );
digitalWrite( MotorEsquerdoAdiante, LOW );
digitalWrite( MotorEsquerdoRe, HIGH );
}
void moverRe(){
digitalWrite( MotorDireitoAdiante, LOW );
digitalWrite( MotorDireitoRe, HIGH );
digitalWrite( MotorEsquerdoAdiante, HIGH );
digitalWrite( MotorEsquerdoRe, LOW );
}
void moverDireita(){
digitalWrite( MotorDireitoAdiante, LOW );
digitalWrite( MotorDireitoRe, HIGH );
digitalWrite( MotorEsquerdoAdiante, LOW );
digitalWrite( MotorEsquerdoRe, HIGH );
}
void moverEsquerda(){
digitalWrite( MotorDireitoAdiante, HIGH );
digitalWrite( MotorDireitoRe, LOW );
digitalWrite( MotorEsquerdoAdiante, HIGH );
digitalWrite( MotorEsquerdoRe, LOW );
}
Um robô de baixo custo como este, pode ter um bom número de aplicações. O vídeo usado para demonstrar o processo de montagem já inicia com um exemplo de aplicação, onde o produto poderia ser usado em uma demonstração das suas "habilidades". Como os produtos deste Web Site normalmente têm como alvo o aprendizado pela interação dos usuários com o produto, inicialmente é sugerida uma atividade com maior "contato" entre o usuário e o robô, onde em um primeiro momento os aprendizes observariam o "comportamento" dos robôs quanto ao desvio de obstáculos e, em um segundo momento, os aprendizes passariam a ser os "obstáculos móveis", fazendo o robô desviar até chegar em um local (alvo) pré-determinado.
O descrito no parágrafo anterior é apenas uma de muitas sugestões de novas aplicações para o produto. O vídeo a seguir mostra vários possíveis usos para um produto semelhante, que apenas adiciona um controle Bluetooth para controlar remotamente o produto.