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...










segunda-feira, 19 de novembro de 2012

Sensor de Movimento - Pyroelectric Infra Red Sensor - PIR






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);




Sensor de Movimento - 
Pyroelectric "Passive" InfraRed Sensor - PIR 


Pyroelectric ("Passive") InfraRed sensors


Radiação Infra-vermelha:
A radiação infravermelha existe no espectro electromagnético a um comprimento de onda que é maior do que a luz visível. Ela não pode ser vista, mas pode ser detectada. Objetos que geram calor também geram radiação infra-vermelha e a estes objetos incluimos animais e corpo humano, cuja radiação é mais forte em um comprimento de onda de 9.4um. 
Nesta gama de infra-vermelhos a radiação não irá passar através de muitos tipos de materiais que passam a luz visível, tais como vidro de janela normal e plástico. No entanto, vai atravessar, com alguma atenuação material, que é opaca à luz visível, tais como germânio e silício. 
Uma pastilha de silício não transformado faz uma boa janela de IR em um gabinete a prova de intempéries para uso ao ar livre. Também proporciona filtragem adicional para a luz na gama do visível.
O 9.4um infravermelho também vai passar através de polietileno, que é normalmente utilizada para fazer as lentes de Fresnel para concentrar a radiação infra-vermelha sobre os elementos sensores.


PIR:
São componentes eletrônicos que permitem que possamos monitorar movimentos dentro de um ambiente. Muito usado para detectar presença de humanos ou animais se movimentando num determinado ambiente e assim poder gerar um alarme de presença ou intrusão.
Geralmente são dispositivos de baixo consumo e baixa tensão de alimentação usados em residências ou lugares de trabalho e comércio.

Sensores PIR são feitos comum Sensor Pyroelétrico (uma caneca de metal com uma abertura quadrada ou retangular, onde um disposito é capaz de detectar níveis de irradiação infra-vermelho ou o quão "quente" é o objeto ou ser.
Sensor PIR, componente



Dimensões do elemento sensor

Pinagem do elemento sensor

O sensor PIR tem um circuito eletrônico capaz de amplificar os sinais e assim poder modular um sinal de saída em nível digital. São circuitos formados com o componente BISS0001 que em sua saída geram um sinal "on" "off" para pode acionar ou desligar um circuito externo de alta potência.
Encapsulamento
Dispositivo e pinos

Circuito básico de uso do sensor

Para muitos projetos ou produtos básicos que necessitam detectar quando uma pessoa está em movimento, entra ou sai de um determinado ambiente,... sensores PIR são de baixo custo e alta eficiência, com uma ampla gama de lentes que podem ser usados com diversos fins e sensibilidades.
Sensor e Lentes de Fresnel

A lente do sensor é fixada para uma varredura com um certo alcance e ângulo, determinando uma distância em que o objeto pode se encontrar  do sensor.



Conceito de sensor de movimento


Lentes e visão geral
Configuração típica usada em projetos
Lentes de Fresnel:
Lentes de Fresnel, focalizam e concentram o sinal no elemento sensor

Características das Lentes de Fresnel, Frontal e Topo




Captação Termal a partir do topo da lente

Captação Termal a partir da lateral da lente


O módulo sensor PIR já vem com o circuito eletrônico necessário para detecção de movimento e acionamento de cargas, tais como: Alarmes, buzinas, lampadas, etc... bastando fazer um circuito extermo de driver de potência.

Abaixo um circuito eletrônico mais elaborado para uso do sensor.





Características básicas:

Sáida: Pulso digital (3V), quando acionado (detecção de movimento) digital baixo quando ocioso (sem detecção de movimento). Comprimentos de impulso são determinadas por resistências e condensadores no circuito impresso e diferem de sensor para sensor.
Alcance / Sensibilidade: (6 m​​), 110 ° x 70 °
Alimentação: 5V-9V

BISS00001 Datasheet: http://www.ladyada.net/media/sensors/BISS0001.pdf

RE200B Datasheet: 
http://www.ladyada.net/media/sensors/RE200B.pdf

NL11NH Lens Datasheet: 
http://www.ladyada.net/media/sensors/NL11NH.pdf


Informações detalhadas:

Recomendo muito, que para obter mais informações, leia os artigos dos sites abaixo:
http://www.ladyada.net/learn/sensors/pir.html ou http://www.glolab.com/pirparts/infrared.html 

Onde você terá mais informações e projetos sobre o assunto.



Projeto:
Alarme de presença.

Vamos agora ao nosso projeto; um alarme de presença ou movimento, usando o sensor PIR, com um aviso sonoro de movimento ou intrusão.
Neste projeto, podemos colocar o alarme no modo silencioso e assim não teremos o aviso sonoro mas um aviso luminoso através de um LED vermelho.

HARDWARE & COMPONENTES:
1 x Arduino UNO, MEGA, Duemilanove ou Teensy 2.0++
1 x BreadBoard
1 x Sensor PIR
1 x Resistor de 220Ω
1 x Resistor de 10KΩ
1 x LED vemelho
1 x Buzzer Piezzo-Elétrico
1 x Botão Tactil (Dactilar)
Fios e cabos para as conexões

LAYOUT & DIAGRAMAS:
Abaixo o esquema de ligação com Arduino. Lembre-se de modificar a pinagem no programa para:
Pino Sensor: Digital_8
Pino LED: Digital_7
Pino Botão: Digital_6
Pino Buzzer: Digital_5




Vista geral do projeto

Detalhe do sensor PIR

TeensyDuino 2.0++

Botão, *Buzzer e LED, detalhes da ligação
*Nota: foi ligado em serie com o buzzer, um resistor de 330Ω somente para reduzir um pouco o barulho durante os testes; no projeto final não deve existir este componente.


SOFTWARE & PROGRAMAÇÃO:

Obtenha o sketch para o Arduino diretamente do 4shared:



http://www.4shared.com/file/EVNCmME3/PIR_Sensor_5.html


Versão para o Teensy 2.0++ (facilmente modificável para o Arduino, sob mudança das pinagens apenas).

Explicação básica do programa:
O programa usa um pino para o LED (pino 12), um pino para o sensor PIR (pino 10), um pino para o buzzer/speaker (pino 14) e um pino para o botão de reset do alarme (pino 16).

Na função "setup()", é feito a declaração de cada pino como entrada ou saída e também é inicializado a comunicação serial.
Neste projeto, algumas mensagens são exibidas no monitor serial da IDE do Arduino/Teensy (também facilmente configurável para exteriorizar para um display LCD serial I2C).

Na função "loop()", é feito a leitura  da entrada do sensor  e verifica-se se o valor é "High" ou "Low.
Se "High" é porque foi detectado intrusão, acendendo o LED vermelho e tocando um alarme sonoro, que somente será desativado ao ser pressionado o botão.
Na serial é escrito uma mensagem, sempre que for detectado movimento e sempre que cessar a detecção de movimento.


VÍDEOS & TESTES:

Assista diretamente no Youtube e Screencast, links abaixo:

http://www.screencast.com/t/rnWOL0xnDveo

http://www.youtube.com/watch?v=xlUlZt8labE