domingo, 16 de dezembro de 2012

PINGBot - Robot Explorador







Esta barra, indica o nível de dificuldade encontrado para cada experiência realizada.
sendo:
"VERDE", indicação de nível 1 a 5 (Fácil);
"AMARELO", indicação de nível 6 a 8 (Médio);
VERMELHO, indicação de nível 9 e 10 (Difícil);



PINGBot - O Robot Explorador


PINGBot é o Robot Explorador que usa um sensor ultra-sônico para poder desviar de objetos presentes em seu caminho.

Como já vimos em um post anterior, o sensor ultra-sônico emite pulsos na frequência de 40KHz (imperceptível ao ouvido humano e de animais), esses pulsos ao baterem em um objeto, são refletidos e retornam ao sensor, depois de um determinado tempo; sabendo o tempo total de ida e volta dos pulsos e a velocidade do som no meio (ar), fica fácil calcular a distancia percorrida pelos pulsos e assim determinar a distância do objeto em relação ao sensor.
Veja o post sobre sensor PING para maiores detalhes.

No nosso segundo projeto Robótico, o usaremos o mesmo chassis do BUGBot, agora com uma PONTE-H dual com um chip L298H para controlar 2 motores DC (controle de direção e velocidade), o que dará maior agilidade ao nosso protótipo.

O funcionamento básico é o seguinte:

Ao inicializar o sistema o chassi do robot, será mantido parado e o sensor calculará a distancia FRONTAL, DIREITA e ESQUERDA; ele fará uma comparação destas distância e assim poderá decidir qual é o melhor caminho a seguir (o maior caminho sempre será a melhor opção !).
Depois disto, ele iniciará a exploração, até o momento em que irá encontrar um objeto interferindo em seu progresso (ele deverá aproximar-se no máximo até uma distância limite, em centímetros, do objeto), quando ele deverá: parar, e analisar novamente as distâncias: FRONTAL, DIREITA e ESQUERDA; para assim poder novamente decidir qual é o melhor caminho a seguir - voltando novamente ao ciclo de operação.


Falando em termos de lógica de programação, temos:

incluir as bibliotecas;
inicializar as variáveis e constantes;
definir e inicializar os pinos;
inicializar comunicação serial;
"INÍCIO"
chamar rotina de parada dos motores;
posicionar servo a 90 graus;
fazer leitura de distância e armazenar (FRONTAL);
posicionar servo a 0 graus;
fazer leitura de distância e armazenar (ESQUERDA);
posicionar servo a 180 graus;
fazer leitura de distância e armazenar (DIREITA);
comparação(1): FRONTAL maior que ESQUERDA?;
sim:- comparação(2): FRONTAL maior que DIREITA?;
sim:- chamar rotina para seguir em frente;
não:- chamar rotina para girar a direita;
não:- (comparação(1) menor que:- chamar função para girar a esquerda;
caso nenhuma condição for possível (todas as distâncias exatamente iguais:- andar para frente por um tempo e parar, e assim começar novamente o ciclo.
andar até detectar distância menor que 20 centímetros;
loop para a posição "INÍCIO";

rotina para seguir em frente:
colocar nível alto no pino 2 e nível baixo no pino 1 de ambos os motores (definida rotação para frente;
habilitar o "enable" de ambos os motores com um valor PWM para controle da velocidade;
temporizar a ação;

Rotina para girar à direita:
colocar nível alto no pino 2 e nível baixo no pino 1 do motor esquerdo, definindo rotação para frente;

colocar nível baixo no pino 2 e nível alto no pino 1 do motor direito, definindo rotação para traz;
habilitar o "enable" de ambos os motores com um valor PWM para controle da velocidade;
temporizar a ação;

Rotina para girar à esquerda:
colocar nível baixo no pino 2 e nível alto no pino 1 do motor esquerdo, definindo rotação para traz;

colocar nível alto no pino 2 e nível baixo no pino 1 do motor direito, definindo rotação para frente;
habilitar o "enable" de ambos os motores com um valor PWM para controle da velocidade;
temporizar a ação;

Rotina para parada dos motores:
desabilitar o "enable" de ambos os motores com um valor baixo;
colocar valor baixo em ambos os pinos 1 e 2 dos motores;




Notar que:
os motores devem ser ligados de forma que quando acionado (valor alto) o pino 2  de cada motor (mantido o pino 1 em nível baixo) o mesmo tenha a rotação no sentido correto para levar o robot para frente.


Vejamos um fluxograma para realizar estas funções (somente exemplo):















Isso nos dá uma ideia de como efetuar a programação do Arduino e o que ele deve executar.

Nota:
Utilizando o mesmo hardware, uma segunda versão com um código mais simples e enxuto, foi criada.  Onde o funcionamento é o seguinte:
Inicialmente o robot anda para frente até encontrar um obstáculo a uma distância menor do que a distância limite; 
Então ele analisa a distância à direita - se a distância à direita for maior que a distância limite - ele opta por girar à direita e seguir em frente; 
Se a distância à direita for, também, menor que a distância limite - então ele analisa a distância à esquerda - se a distância à esquerda for maior do que a distância limite - ele opta por girar à direita e seguir em frente; 
Caso nenhuma das distâncias, tanto direita ou esquerda for satisfatória - então ele dá um gira à 180 graus e segue em frente.
Iniciando novamente o ciclo.

Na seção Software e Programação, você encontra as duas versões para download.


Hardware & Material:

Nesta seção vamos verificar as necessidades em termos de material necessário e hardware utilizado.

Usar o chassis construído para o BUGBot - Robot seguidor de Luz. Veja o post para maiores detalhes de construção.

Lista de material:
1 x Arduino UNO, MEGA, Duemilanove, Duecemila ou Teensy 2.0++
1 x Sensor ultra-sônico HC-SR04
1 x PONTE-H dual
1 x Servo Motor HXT900 9g/1,8Kg
1 x Kit Tamiya Box Gear com dois motores DC 3-6V
Pack de baterias para alimentar o Arduino e os Motores (9V)
Chassis para montagem
Fios e cabos para as conexões.


Sensor Ultra-Sônico HC-SR04:
HC-SR04, pinos VCC,Trig, Echo e GND
Ponte-H Dupla:




Detalhe da PONTE-H, outros modelos podem ser usados
Cada um com seus detalhes de interconexão

Layout & Esquemas:

Circuito do PINGBot;
Verificar as pinagens utilizadas no programa (algumas modificações foram feitas).




A alimentação do Arduino, pode ser utilizada a partir da pont-H.
Aconselho uma alimentação independente, com GNDs comuns entre elas. (devido a corrente elevada puxada pelos motores)

Muito cuidado com as ligações para não inverter alimentações... o dano pode ser irreversível.



Correspondência; pinos Arduino x Elementos Externos:

***Use esta correlação dos pinos e a versão 9 do código,
Modificações foram feitas com relação ao diagrama***


Arduino -> Elemento Externo


0  ->  N/A
1  ->  N/A

2  ->  N/A
3  ->  sensor PING pino echo
4  ->  sensor PING pino Trigger
5  ->  PONTE-H pino in1
6  ->  PONTE-H pino in2
7  ->  N/A
8  ->  N/A
9  ->  servo motor
10 -> PONTE-H pino in3
11 -> PONTE-H pino in4
12 -> buzzer
13 -> N/A 

Novo código pode ser obtido no github:

https://github.com/Arduinobymyself/PINGBot.git


"Tive muitos problemas com ruído no sistema sensor de distância, o qual foi resolvido adicionando capacitores de 100nF entre os pinos dos motores DC e suas carcaças (além do capacitor que normalmente é adicionado entre seus pinos).

O ruído interferia na leitura feita pelo sensor PING; de modo que o robot seguia em frente e parava, sem ter um objeto efetivamente ao alcance estipulado."

Abaixo o esquema que resolveu o problema:





Fotos reais do projeto na fase de execução:

Lembrar que o chassis utilizado foi o chassis do BUGBot, veja o post relacionado a ele para maiores detalhes de construção.


fixação do servo motor

Ponte H fixada e motores conectados

Sensor PING + anteparo + haste fixação do servo

Anteparo em acrílico

Sensor PING fixado ao servo motor

Servo motor fixado com fita dupla-face (experimento)

Arduino com ProtoShield e ligações

Servo motor fixado com cola quente - melhor opção (experimento)

Fixação ideal do servo, seria com parafusos


Detalhe do servo e sensor

Detalhe da ponte-H

detalhe do protoshield
 Numa primeira instancia, coloquei um buzzer para sinalizar movimentação... depois acabei tirando.
Mas a função ainda está no programa e é só implementar.

Retirado o buzzer, adicionado uma chave liga-desliga (alimentação da ponte-H)

Detalhe da bateria de alimentação da ponte-H

Detalhe da bateria de alimentação do Arduino

Vista Geral por cima

Vista Geral por cima

Vista Geral de frente
Detalhe dos capacitores adicionados para a solução de ruído

O problema de compartimento para baterias, também foi solucionado, utilizando duas peças plásticas (usadas em marcenaria e fabricação de móveis).
As peças foram colocadas em cima da roda 360 graus, aproveitando os parafusos de fixação da mesma.
Assim foi resolvido o problema e ainda deu mais estabilidade ao chassis.

As duas peças  usadas para fixar as baterias do motor e do Arduino
 Notar que a bateria do motor é do tipo recarregável... isso ajuda a economizar e dá maior potência ao carro.


Baterias acopladas

Visão superior

Software e Programação:

Várias versões foram feitas na fase de testes iniciais.
Foi feito programa para testes dos motores, duas versões para debug do software, até chagar a versão final V.5.
E mais as versões V.6 e V.7 para usar com servos de rotação contínua "servos hakeados", que pretendo montar em um outro chassis (redondo).

Os ajustes deram bastante trabalho, foram mais de 30h trabalhando no projeto. Acredito que para cada chassis e para cada tipo de motor utilizado, seja necessário uma demanda de tempo para debug e ajustes.

Obtenha o código e as bibliotecas do projeto no GitHub abaixo:
https://github.com/Arduinobymyself/PINGBot.git


Parâmetros de velocidade devem ser muito bem ajustados para compensar as diferenças dos motores (sabendo que não existem dois iguais e levando em conta os parâmetros do Gear-Box). 





Vídeos & Testes:

Dúvidas e sugestões enviem para: arduinobymyself@gmail.com

Assintam diretamente no YouTube, ou no screencast pelos links abaixo (para uma melhor qualidade).

Vídeo 1 (versão 4 do PINGBot):
screencast: http://www.screencast.com/t/C6KN0SNhO69p
youtube: http://youtu.be/h5sZfQm27yI



Vídeo 2 (versão 4 do PINGBot):
screencast: http://www.screencast.com/t/lMa4ZLQIAJj
youtube: http://www.youtube.com/watch?v=T-sAsfuGtDs       



Vídeo 3 (versão 5 do PINGBot):
screencast: http://www.screencast.com/t/7pmwaWJhu4dy
youtube: http://youtu.be/b4cjVJgoDPc


Vídeo 4 
Funcionamento geral do Robot em ação - saindo de uma situação de bloqueio.

screencast: http://www.screencast.com/t/9Uow4fyDy
youtube: http://www.youtube.com/watch?v=KMZmRc_-FhQ





Obrigado a todos!
Divulguem o blog arduinobymyself.blogspot.com.br, para que assim possamos divulgar conhecimento!
Hardware e Software livre para todos.


Este foi o último post do ano de 2012.

Boas festas, feliz natal e próspero Ano Novo

Em 2013, novos projetos virão...