Mostrar mensagens com a etiqueta Sensor. Mostrar todas as mensagens
Mostrar mensagens com a etiqueta Sensor. Mostrar todas as mensagens

quarta-feira, 5 de julho de 2017

Robôs low cost#5 - comunicando com o PC por bluetooth

De acordo com o projeto idealizado pela Alexandra e pelo Jorge, o envio dos dados para uma estação fixa era especificação fundamental, já que previa o protótipo de um robô que podia não ser recuperável.

Tendo disponível um módulo bluetooth HC-06, a solução passou por experimentar este modo de comunicação, com a consciência que, apresentando um alcance de 10 metros, esta não seria a solução mais adequada numa situação real de um robô exploratório, onde se imporia uma comunicação via rádio, por exemplo.

A solução bluetooth justificou-se neste trabalho por interesse académico e por razões práticas (por disponibilidade do equipamento).

Eis a imagem de um módulo bluetooth HC-06 e respetiva pinagem:



Caso o módulo disponível seja de 5V, a ligação deste componente ao arduino é bastante simples, bastando seguir as ligações propostas na tabela seguinte:

HC - 06
Arduino
Pino VCC
5V
Pino GND
GND
Pino TX
RX
Pino RX
TX
  
O módulo bluetooth com que os alunos trabalharam, no entanto, trabalha a 3,3V, pelo que houve que usar um divisor de tensão no pino RX para não danificar o componente:



Com um PC equipado com bluetooth, depois do equipamento emparelhado, a comunicação é automática. Para visualisar os dados foi utilizado o programa Tera Term, software gratuito disponibilizado pela empresa LogMeTT, bastando, ao fazer correr esse software, selecionar a abertura de uma porta série via bluetooth:



Depois...é só fazer correr um programa que esteja a escrever dados numa porta série, como o apresentado no post anterior - ao fazê-lo, os valores da temperatura e da humidade aparecerão no ecrã do computador:




Como nota importante, destacamos que, ao fazer o upload de qualquer programa para o arduino, é necessário retirar previamente o módulo bluetooth do circuito.

Robôs low cost#4 - medindo temperatura e humidade

Nesta série de posts intitulados "Robôs low cost#", tenho vindo a descrever o trabalho realizado ao longo do ano letivo pelo Jorge e pela Alexandra em ambiente de clube de robótica. Os alunos referidos são do 10º ano do curso de Ciências e Tecnologias e não têm no currículo nenhuma disciplina de eletrónica ou programação. Tudo o que foram construindo foi fruto de trabalho extra curricular, pesquisa autónoma, muita carolice. Trabalho que foi feito de forma voluntária e com a consciência que não seria refletido na avaliação das disciplinas do curso. Só por isto, os alunos que se envolvem - com responsabilidade e persistência - neste tipo de projetos merecem o meu respeito e a minha simpatia.

De forma a colmatar este "vazio de reconhecimento", promovi a inscrição por parte dos alunos em projetos dinamizados por entidades exteriores à escola, nem que fosse para criar uma meta e um objetivo para o trabalho desenvolvido.

Foi assim que a Alexandra e o Jorge se inscreveram no ONControl, um desafio lançado pelo Politécnico de Setúbal às escolas secundárias da região com o objetivo de criar protótipos controlados por arduino.

O projeto que a Alexandra e o Jorge idealizaram para concorrer ao desafio foi um robô exploratório preparado para percorrer regiões inóspitas ou inacessíveis enquanto fazia medições do meio ambiente e enviava esses dados para um estação fixa.

Depois de ter o robô a deslocar-se desviando-se de obstáculos, estava na altura de decidir o que medir.

A primeira ideia era medir a taxa de monóxido de carbono no ar, dado o nível de toxicidade deste gás, para além de medir a temperatura e a humidade atmosférica.

O grupo acabou por abrir mão do primeiro objetivo depois de testar o sensor MQ7.

Na verdade, o uso do sensor, ilustrado na figura acima, não revelou dificuldades do ponto de vista da eletrónica, bastando alimentá-lo e ligar a saída (output) a uma entrada analógica do arduino. O problema foi compreender qual a relação entre o valor de saída (compreendido entre 0-1023) e a taxa de monóxido de carbono. A pesquisa realizada em fóruns, apontou para a necessidade de uma calibração a partir de um atamosfera com uma taxa de monóxido de carbono conhecida, algo a que não tínhamos acesso. Para além disso, este sensor aquece bastante, gastando muita energia - os alunos optaram então por evitar a sua utilização.

Para medir a temperatura e a humidade, foi usado o sensor RHT03 (também conhecido por DHT-22), popular por ser um sensor de humidade e temperatura de baixo custo com um único pino que realiza o interface com o arduino. O sensor é calibrado e não necessita de componentes extra para funcionar adequadamente. Com este sensor é possível medir temperaturas entre os -40ºC e os +80ºC (± 0.5ºC). A humidade medida é a humidade relativa, entre 0 e 100% (±2%).

Eis uma imagem do sensor e a respetiva pinagem:

A ligação entre o sensor e o arduino foi realizada através da entrada analógica A0:


A livraria que usámos para recolher dados a partir deste sensor foi a dht.h.

Segue o programa usado para visualizar na porta série os valores obtidos, segundo a segundo, por este sensor:



terça-feira, 4 de julho de 2017

Robôs low cost#3 - detetando e contornando obstáculos

Para que o robô consiga ter um comportamento "inteligente", detetando e contornando obstáculos, há que dar-lhe a capacidade de "ver" o que o rodeia. São várias as formas de o conseguir - com detetores de infravermelhos, câmaras, sensores de toque...como o nosso kit low cost vinha equipado com um sensor de ultrassons SR04, foi esse o que o alunos usaram.

O SR04 é dos sensores de ultrassons mais comuns para pequenos projetos. Permite a medida de distâncias entre 2 cm e 4 m com um ângulo de sensibilidade de 15º.

Apresenta 4 pinos, dois para a alimentação (Vcc e GND), um para o trigger (o "disparo" de um sinal) e o restante para receber o som refletido (o eco):


As ligações realizadas foram as seguintes:


Assim, ao robô montado na sessão anterior, acrescentámos o sensor de ultrassons de acordo com o seguinte esquema:

Já aqui no blog tínhamos explorado o sensor de ultrassons no âmbito da programação gráfica. Os conceitos associados a este sensor encontram-se neste post, e por isso não nos alongaremos com mais considerações quanto ao princípio de funcionamento de um sensor deste tipo.

A programação deste sensor em C é facilitada com uma série de livrarias disponíveis que evitam a preocupação de enviar, detetar e analisar sinais, disponibilizando uma série de comandos que incluem todos esses passos. Usámos a Ultrasonic.h, e explorámo-la através dos exemplos dados.

De forma a testar o funcionamento do sensor, usámos o programa seguinte que escreve na porta série a distância (em cm) a que um obstáculo é detetado pelo sensor:

Com o sensor a funcionar, houve que adaptar a marcha do robô de acordo com a distância lida pelo sensor. O objetivo era manter o robô a andar em frente caso o obstáculo estivesse a mais de 20 cm e alterar a sua trajetória caso o obstáculo estivesse mais perto que essa distância.

Nesta fase, os primeiros testes revelaram que o controlo da velocidade através das saídas PWM não é suficiente para as baixas velocidades pretendidas. Na verdade, para valores mais baixos registados nas saídas PWM, os motores não tinham força para se moverem. A opção passou por criar períodos de ponto morto de forma a diminuir a velocidade do robô.


Como ilustração, deixamos o aspeto do robô nesta fase...


...e um vídeo com o robô em funcionamento (quando o vídeo foi feito, o robô ainda só parava na presença do obstáculo. Com o programa proposto, perante o obstáculo o robô anda para trás, gira e retoma a marcha):

quinta-feira, 21 de abril de 2016

Sensores de infravermelhos (PIR)

Os sensores de infravermelhos são úteis em projetos onde a deteção de um obstáculo é importante. Ao contrário dos sensores de ultrassons, que retornam um sinal analógico que permite calcular o valor da distância de um objeto ao sensor, os sensores de infravermelhos (ou PIR - Passive Infrared Sensor) retornam apenas um sinal digital ON / OFF que informa se há ou não um objeto a uma distância pré-definida.

Foram dois os sensores testados: um detetor de obstáculos - módulo para arduino e um HC-SR501. O primeiro, comprei-o por 0,86€ e o segundo por 0,71€ (aqui e aqui).

Relativamente ao princípio de funcionamento, este é idêntico aos dois sensores: cada um deles apresenta um LED emissor de infravermelhos e um receptor de infravermelhos. Os infravermelhos mais não são que radiação térmica, não detetável pelo olho humano. Quando o feixe de infravermelhos emitido pelo LED emissor bate num obstáculo, é refletido e detetado pelo sensor, que transmite essa informação alterando o estado da saída digital.

Os dois sensores testados têm caraterísticas diferentes e adequam-se a diferentes aplicações. Um quadro-resumo apresenta principais caraterísticas e aplicações possíveis:


Segue-se uma apresentação eletrónica com uma proposta de trabalho para explorar o funcionamento de cada um dos sensores referidos:


 

terça-feira, 9 de fevereiro de 2016

Construção de um termómetro

Há já algum tempo que tinha a ideia de construir um termómetro cujos valores medidos fossem indicados através de um servo motor.

Porque era o que cá tinha em casa, usei como sensor de temperatura um TMP36. Através da análise da respetiva datasheet, é possível obter a respetiva pinagem (o meu sensor é do tipo TO-92) e as curvas caraterísticas:


Da análise das figuras 5 e 6, apercebemo-nos que o TMP36 é linear entre os 0ºC e os 100ºC (aproximadamente). Eu decidi escolher como valores limites do meu termómetro os 0ºC e os 50ºC.

Liguei então o TMP36 à entrada analógica A0, o servo motor à saída D8 e os LED verde e vermelho às saídas D12 e D11, respetivamente. Sem que consiga explicar porquê, a minha experiência diz-me que, com servo motores ligados, a saída D13 deixa de funcionar devidamente e por isso evito usá-la em projetos com servo motores.

A primeira versão do projeto mostrou-se muito instável, com o sensor a saltar repentinamente para valores incoerentes. Tentei estabilizar o seu funcionamento, ligando dois condensadores na alimentação tanto do sensor como do motor, mas não obtive bons resultados. A estabilização deu-se quando tornei a alimentação do servo motor independente do arduino, ligando-a a uma entrada USB do computador. Estou certa que foi essa a solução que estabilizou o funcionamento do circuito; ainda assim, optei por deixar os condensadores.

Em termos de programação, comecei por transformar o valor da entrada analógica (0-1023) em valores de tensão (0 - 5V):


Depois, houve que, a partir do gráfico da figura 6 da datasheet do TMP36, transformar esse valor em temperatura (em ºC):


Sendo o valor 105,3 o declive da reta b) da figura 6:


A partir do valor da temperatura obtido, tive de definir o ângulo com que o servo motor devia rodar. Como entre os limites que escolhi existe um intervalo de 50ºC, achei que um ângulo de 100 graus seria adequado, com cada ºC a fazer o motor rodar 2 graus. Centrei a atuação do motor entre os 40 graus e os 140 graus. Assim, o ângulo definido pelo motor para cada valor da temperatura é dado por (em graus):


Para que o motor não andasse aos solavancos, o valor da temperatura indicado na equação anterior foi arredondada às unidades.

Caso o valor da temperatura desça abaixo dos 0ºC ou suba acima dos 50ºC, fiz ligar o LED vermelho e "congelei" a posição do motor nos 40 graus e 140 graus, respetivamente.

Deixo a minha proposta de trabalho para o circuito de eletrónica e o programa em Scratch...



...o circuito esquemático...



...e um pequeno vídeo com o termómetro em funcionamento: