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.
- Um único processador responsável por todas as tarefas, que neste caso deveria ser um Raspberry Pi.
- 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
- Instale PIP
- sudo apt- get install python- pip
- Instalar a biblioteca picamera :
- Instalar a biblioteca flask Python:
- Baixar projeto de streaming de vídeo Flask:
- Na pasta do projeto editar o arquivo app.py , comente esta linha:
- #from camera import Camera
- Tirar o comentario da linha:
- from camera_pi import Camera
- Salve o arquivo app.py
- Executar ifconfig para descobrir o endereço IP local do seu Raspberry Pi “yourLocalIPaddress ” .
- Inicie o servidor Flask executando este comando :
- Uma mensagem será impressa no monitor:
- Abra um navegador e acesse este endereço :
- ” YourLocalIPaddress ” : 5000
Instalando o sensor de temperatura e humidade: HC-11
- Em primeiro lugar, obter a Biblioteca do Github :
- 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
- 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
- O resultado deve ser a temperatura ea humidade lido pelo sensor
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 :
- 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.
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
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
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")
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 .
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 .
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”).
- Abaixo o código Arduino e Python utilizado nos testes :
- sudo Python ardu_pi_serial.py
Enviando os dados do Arduino para a Web:
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) .
Abaixo o código Arduino e Python utilizado nos testes :
- sudo iot_temp_hum_pot_ardu.py
Testando os motores do rover:
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).
- 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.
A 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).
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.
App 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:
- 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:
- 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
- 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
- Execute o sketch final para o Arduino
- Iot_Capstone_Robot_BT_19mar16.ino
- Mova o rover com o aplicativo Android e confira o vídeo e os valores do sensor
- Verifique se o rover para em um obstáculo.
- 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
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)