Projeto: Protótipo de uma estação robótica móvel para captura de dados ambientais

Descrição geral:

A idéia deste projecto é o desenvolvimento de um protótipo totalmente funcional para uma estação móvel  usada na coleta de dados ambientais tais como: temperatura, umidade e luminosidade.  Este protótipo foi desenvolvido somente para fins didáticos e fez parte de meu projeto final no curso de especialização do Coursera em parceria com a University of California, Irvine:  “Uma Introdução à Programação da Internet of Things (IOT)“.

Considerações do projeto:
  • O Rover será controlado remotamente por um dispositivo Android com capacidade Bluetooth. Os dados serão continuamente capturados e transmitidos independentemente se o Rover está parado ou em movimento.
  • O usuário deve receber um feedback visual (streaming de vídeo ao vivo)
  • Os dados capturados serão analisados ​​através de um site público (neste caso: thingspeak.com)
  • Os dados estarão disponíveis para os usuários em um formato gráfico e tabela
  • Alarmes via Twitter serão gerados localmente pela estação ou pelo website
  • O Rover terá capacidade autónoma para evitar obstáculos a fim de proteger-se em caso de mau controle por parte do usuário.

Opções de projeto:

Com base nos requisitos, inicialmente 2 opções foram consideradas para este projeto.

  1. Um único processador responsável por todas as tarefas, que neste caso deveria ser um Raspberry Pi.
  2. Um processador dual , sendo as funções divididos entre eles ( Arduino e RPI ) :
    • Processor 1: RPi
      • Captura de dados
      • Comunicação com a Web
      • Transmissão de vídeo
      • Envío de mensagens via mídia social
    • Processor 2: Arduino
      • Controle dos motores (movimento e posicionamento da câmera)
      • Evasão de obstáculos
      • Comunicação com o controle remoto

Em termos de custos, utilizar 2 processadores é de fato menos custoso do que a opção de um único processador. Isso ocorre porque o Arduino é um item muito barato e portanto mais acessível que a opção de “Servo Hat”, necessária para o RPi controlar os servos de maneira adequada. Outra diferença é o módulo de BT. Para o Arduino, um módulo barato como o HC – 06 BT 3.0 é suficiente, sendo que o mesmo custa a metade do preço do “BT Dongle” a ser adicionado ao Rpi.  Assim,a opção escolhida foi o projeto com processador dual.

A Lista de materiais:

Instalação e testes da Camera (Pi-Cam) no RPi
  1. Instale PIP
    • sudo apt- get install python- pip
  2. Instalar a biblioteca picamera :
    • pip install picamera
  3. Instalar a biblioteca flask Python:
    • sudo pip install flask
  4. Baixar projeto de streaming de vídeo Flask:
  5. Na pasta do projeto editar o arquivo app.py , comente esta linha:
    • #from camera import Camera
  6.  Tirar o comentario da linha:
    • from camera_pi import Camera
  7. Salve o arquivo app.py
  8. Executar ifconfig para descobrir o endereço IP local do seu Raspberry Pi “yourLocalIPaddress ” .
  9. Inicie o servidor Flask executando este comando :
    • python app.py 
  10. Uma mensagem será impressa no monitor:
  11. Abra um navegador e acesse este endereço :
    • ” YourLocalIPaddress ” : 5000
Instalando o sensor de temperatura e humidade: HC-11

DH11-RPiDH11-RPi hw

  1. Em primeiro lugar, obter a Biblioteca do Github :
  2. Instalação da Biblioteca :
    • sudo apt-get update
    • sudo apt- get install build-essential python -dev python- openssl
    • cd / Home / Pi / Adafruit_Python_DHT
    • sudo python setup.py install
  3. Teste o sensor, executando o programa: AdafruitDHT.py no monitor. Entre os parâmetros como : 11 ( sensor DHT11 ) e 4 ( GPIO onde o sensor está ligado )
    • sudo Python AdafruitDHT.py 11 4
  4. O resultado deve ser a temperatura ea humidade lido pelo sensor

DH11-RPi monitor

Enviando dados para a internet

Para a configuração básica do sensor DH- 11 com a RPI e envio dos dados à internet , uma grande ajuda foi começar a partir deste tutorial:

Plotting DHT11 sensor data at ThingSpeak.com using Raspberry Pi

Passos:

  • A definição de um canal em ThingSpeak.com :

ThinkSpeak1

  • Execução do códigoPython para testes:
    • sudo Python temp_hum_test.py
    • NOTA: Todos os códigos fonte estão disponíveis ao final do post.

ThinkSpeak2

ThinkSpeak3

Adicionando o sensor de luz:

Um tutorial muito bom que serviu de base para esta parte do projeto, pode ser visto aqui:

Build Your First IOT with a Raspberry Pi, DHT11 sensor, and Thingsp...

Um LDR e um capacitor foram conectados a GPIO24 . Basicamante, dependendo da constante de tempo RC, pode-se determinar se há luz (GPIO24 ==> HIGH) ou não (GPIO24 ==> LOW).

  • O Código Python utilizado neste teste:
    • sudo Python iot_temp_hum_light.py

 

Adicionando um sensor para a intensidade de luz

RPi sensors3RPi sensors2

O passo seguinte foi obter ” dados de intensidade da luz ” e uma vez que eu não tinha um ADC ( conversor analógico-digital ) em mãos , uma boa aproximação foi obtida utilizando-se a técnica de carga/descarga de capacitores (também aqui,  o “truque” é a variação da constante de tempo RC) . O ” Raspberry Pi Cookbook ” nos dá a solução (note que, em vez do potenciômetro no exemplo do livro, se usou um LDR).

O Código Python utilizado neste teste:

  • sudo Python iot_temp_hum_light_pot.py

RPi sensors4RPi sensors5RPi sensors6

Enviando mensagens de alarm via Tweeter

Uma das características do IOT é interagir automaticamente com as pessoas. Para o envio de mensagens de alarme, um dos requerimentos do projeto, se pode tanto programar o RPI como um servidor web para enviar tweets diretamente ou usar o site ThingSpeak para isso. Claro que neste último caso, apenas serão enviadas mensagens “gatilhadas” por uma condição com base nos dados capturados) .

Abaixo um exemplo de código Python para o envío de tweets diretamente pelo RPi:

from twython import Twython
C_KEY = "xxxxxxxxxxxx"
C_SECRET = "yyyyyyyyy"
A_TOKEN = "zzzzzzzzzzzz"
A_SECRET = "wwwwwwwww"

api = Twython(C_KEY, C_SECRET, A_TOKEN, A_SECRET)

api.update_status(status="IoT Capstone Project - Tweet test")



tweet1

Observe que a sua conta do Tweeter deve permitir o envío de um tweet a partir da RPI . Além disso, são necessárias chaves especiais geradas pelo Twitter , a fim de que se possa usar a biblioteca TWYTHON disponível para RPI .

Outra solução simples como explicado anteriormente, é enviar um Twitter diretamente do site. Neste caso, pode ser usado o recurso “React” de ThingSpeak.com .

tweet2

tweet3

Conectando o RPi e ao Arduino via port Serial

O Arduino utilizado foi o NANO que é tão poderoso como a UNO, mas com um ” fator de forma” pequeno .

RPi-Ardu-Serial-test

Para fins de teste, um potenciômetro foi conectado aporta analógica A0 do Arduino e o valor lido, transmitido via Serial ao RPI. No teste, o RPI monitorará os comandos fornecidos por um teclado (conectado diretamente ao port USB ou através de VNC)  e dependendo do comando, ou o valor lido no port A0 será impresso no monitor, ou o LED da porta 13 do Arduino será apagado ou acendido (“toggle ON / OFF”).

RPi-Arduino3

  • Abaixo o código Arduino e Python utilizado nos testes :
    • sudo Python ardu_pi_serial.py

Enviando os dados do Arduino para a Web:

RPi-Arduino1

RPi-Arduino2

Uma vez que o Arduino está conectado com RPI , dados adicionais capturados por Arduino também pode ser enviada para a Web , em conjunto com outros dados captados pelo DH11 e LDR .

O código Python usado para enviar dados para o site foi mudado para também incluiu os dados capturados pelo Arduino (valor de potenciômetro) .

RPi-Arduino4

RPi-Arduino5

Abaixo o código Arduino e Python utilizado nos testes :

  • sudo iot_temp_hum_pot_ardu.py

 

Testando os motores do rover:

Arduino2

Neste ponto, o Rover vai começar a ser montado. Eu decidimos desmontar todos os sensores e começar do zero, a “Fase Arduino”. Uma vez que a Rover estiver funcionando corretamente, tanto o RPI e sensores serão remontados sobre o Rover na configuração definitiva.

Para motores, foram utilizados 2 servos contínuos (SM-S4303R). Esses servos girarão a uma velocidade, dependendo da largura de pulso recebido em sua entrada de dados. No caso deste servo, a largura de pulso pode variar de 1.0 ms a 2.0ms (outros servos podem trabalhar com larguras de pulso diferentes).

Arduino3

  • Um pulso de 1.5ms vai posicionar o servo na posição neutra, ou “parado”.
  • Um pulso de 1.0 ms vai faz com que o servo gire a maxima velocidade (cerca de 70 RPM) em uma direção e 2.0ms a toda velocidade na direção oposta.
  • Pulsos entre 1.0 e 1.5ms ou 1.5ms e 2.0ms, gerarão velocidades intermediárias proporcionais.

Arduino4A primeira coisa que deve ser feito, é enviar um pulso 1.5ms para verificar se os motores estão “parados”. Caso não estejam, os servos devem ser ajustados para isso (procure o parafuso amarelo, abaixo do servo). É claro que se o seu servo não possui esse ajuste, tente alterar o valor “1.5ms” até obter o ponto neutro.

Codigo para calibração dos servos:

#include <Servo.h>
Servo leftServo;
Servo rightServo;
Void setup()
{
    leftServo.attach(6);
    rightServo.attach(5);
    leftServo.writeMicroseconds(1500);
    rightServo.writeMicroseconds(1500);
}
void loop()
{
}



O código abaixo , pode ser usado para um teste de motor Rover completo (para frente , para trás, parada completa , virar à esquerda , virar à direita ). Se necessário, dependendo de seus motores você deve ajustar os “delays” para obter o ângulo de viragem desejado, (também, por vezes, os valores para a largura do pulso a direito devem ser um pouco diferentes que os da esquerda para compensar qualquer falta de equilíbrio dos motores ou desalinhamento da estrutura do Rover).

  • MotorCode.ino
Montagem da estrutura final do Rover e testes com o Controle Remoto/Bluetooth:

Primeiro de tudo, note que o robô ou ” Rover ” é um protótipo para fins educacionais e foi construído com elástico, madeira e clips de junção das peças originais. É muito simples, mas funciona bem para o que se pretende .

No Arduino , foi utilizado um módulo Bluetooth HC – 06 . Você precisa de mais informações sobre como usar este módulo, consulte o meu post:

Conectando “coisas” com o Bluetooth

O código Arduino completo ( o anterior + BT ) estão disponíveis no file abaixo (não se esqueça que são 3 arquivos que devem estar sempre dentro de uma mesma pasta) :

  • Iot_Capstone_Robot_10mar16.ino

 

A App Android

Para o controle remoto , um dispositivo Android foi o escolhido , pois é muito fácil de desenvolver um aplicativo usando o MIT AppInverntor2 . Para este projeto, desenvolvi o um aplicativo dedicado .

O aplicativo é muito simples. Ele possui:

  • 5 botões para controle de direção ( FW , BW , esquerda, direita , Stop). Quando um desses botões é pressionado, um caracter é enviado via Bluetooth para o HC- 06, sendo o respectivo comando executado pelo Arduino.
  • 1 Slider para o movimento da câmera. Um valor numérico é enviado de 0 a 100. Esse valor será ” mapeado ” no Arduino movendo a câmera proporcionalmente, dependendo da faixa de ângulo Servo (no meu caso algo de 20 a 160 graus )
  • Entrada do endereço IP da PiCam e um botão para armazená-lo.
  • Enviar / receber mensagens de texto para Arduino (o botão ” avião de papel ” é usado para enviar as mensagens)

O arquivo .aia disponível no final do post pode ser utilizado para gerar/modificar seu app caso você esteja familiarizado com o MIT AppInverntor2 e o arquivo .apk caso você deseje instalar e executar o aplicativo que desenvolvi diretamente em seu dispositivo Android.

rover iconApp Android

Os sensores para deteção de obstáculos:

Para evitar obstáculos, será usado um sensor de ultra-som (HC- SR04 ). O sensor será montado sobre um servo 180o, com o objetivo de aumentar a área a ser pesquisada. Note que o servo também será utilizado como uma base para a Pi – câmera. Um controle deslizante na aplicação Android irá controlar o ângulo da câmera.

O HC-SR04 funciona enviando um pulso sonoro no pino “trigger” ( 2us LOW ; 10us HIGH), medindo quantos microsegundos um pulso refletido leva para retornar ao pino “echo” (lembre-se que o som viaja a 340m/s). A função “int distMeter ()” é utilizado para este cálculo.

No caso de um obstáculo a frente ser encontrado a menos de 20 centímetros, o LED vermelho acenderá e o rover parará, retrocedendo alguns centímetros por segurança. O vídeo mostra os testes com o Rover.

Vídeo de teste de obstáculos

O código completo Arduino (o anterior + desvio de obstáculos e procure servo controle ) está disponível nos arquivos:

  • Iot_Capstone_Robot_BT_17mar16.ino
Integração e testes finais:

  1. Em primeiro lugar, execute o programa python para ativar a Pi- Cam que deverá estar no diretório flask (verifique o link ao final para detalhes de instalação da camera) e verifique se a camera está enviando o video em streaming:
    • sudo python app.py
  2. Uma vez que você pode ver o vídeo, execute um CTRL- C para libertar o monitor para introduzir o código Python principal:
    • sudo iot_temp_hum_pot_ardu.py
  3. Verificar os valores dos sensores ( aquecer o sensor , cobrir o sensor de luz , etc. ). Veja o resultado no monitor e no site :
    • sudo python iot_temp_hum_light_pot_ardu.py
  4. Execute o sketch final para o Arduino
    • Iot_Capstone_Robot_BT_19mar16.ino
  5. Mova o rover com o aplicativo Android e confira o vídeo e os valores do sensor
  6. Verifique se o rover para em um obstáculo.
  7. Monitorar o site: Site de dados da estação e veja se os dados ambiente continuamente sido exibidos.

O vídeo mostra o protótipo completo sendo controlado pelo aplicativo Android , capturando dados do sensor e mostrando na Internet.

https://youtu.be/QwMHXr8PvC8

Os códigos para o Arduino e para o RPi:

Codigos para o Arduino

Codigos em Python para o RPi

Conclusão:

No futuro pretendo incluir algumas características adicionais ao projeto:

  • Controlar o Rover pel
    a internet.
  • Adicionar um braço robótico, de modo que o Rover possa fazer algum trabalho mecânico como a remoção de obstáculos, coleta de amostras , etc.
  • Fonte de energia usando painéis solares.

Uma idéia é usar como estrutura o EasyRoverDS do Maurício aqui do Garagem:

http://mauriciodgsantos.wix.com/easyroverds

Para mais projetos e tutoriais, por favor, visite meu Blog.

Link para o projeto completo no Blog MJRoBot.org

Obrigado e espero que este projeto possa ajudar a outros garagistas aqui a aprender sobre o Raspberry Pi,  Internet das coisas (IoT), Arduino , robôs , etc.

Abração 

Exibições: 3987

Comentar

Você precisa ser um membro de Laboratorio de Garagem (arduino, eletrônica, robotica, hacking) para adicionar comentários!

Entrar em Laboratorio de Garagem (arduino, eletrônica, robotica, hacking)

Comentário de Marcelo Rovai em 23 março 2016 às 17:03
Valeu a força, Marcelo obrigado.
Comentário de Marcelo Rovai em 23 março 2016 às 13:33

Obrigado Murta! 

Foi legal fazer esse projeto. Ainda estou "verde" no RPi, mas aprendendo! ;-)

Chegou meu RPi3, mas ainda não tive tempo de testar para ver se vale a pena.

Abração

Comentário de Marcelo Rodrigues em 23 março 2016 às 13:33

Tá indo para a News. Parabéns!

Comentário de José Gustavo Abreu Murta em 23 março 2016 às 12:04

Excelente projeto ! Parabéns !

Bem detalhado.

© 2024   Criado por Marcelo Rodrigues.   Ativado por

Badges  |  Relatar um incidente  |  Termos de serviço