Descrição geral:
A ideia deste projecto é o desenvolvimento de um protótipo totalmente funcional para uma estação móvel usada na coleita de dados ambientais tais como: temperatura, humidade e luminosidade.
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
- Processor 1: RPi
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 :
- pip install picamera
- Instalar a biblioteca flask Python:
- sudo pip install flask
- 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 :
- python app.py
- Uma mensagem será impressa no monitor:
- “running on “http://0.0.0.0.:5000/ (press CTRL+C to quit)
- 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 Thingspeak.
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 Código Python utilizado neste teste:
-
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:
- sudo Python iot_temp_hum_light_pot.py
- A definição de um canal em ThingSpeak.com :
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 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 nos arquivos abaixo (não se esqueça que os 3 arquivos , devem estar dentro de uma pasta exclusiva) :
- Iot_Capstone_Robot_10mar16.ino
- motorFunctions.ino
- robotDefines.h
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.
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.
O código completo Arduino (o anterior + desvio de obstáculos e procure servo controle ) está disponível nos arquivos:
http://www.instructables.com/files/orig/FAS/FRME/ILV8FP0N/FASFRMEILV8FP0N.ino
Integração e testes finais:
Neste ponto, todas as partes individuais foram testados e funcionam. Agora, chegou a hora do Rpi e do Arduino serem integrados. As etapas a serem executadas nesta etapa são:
- Em primeiro lugar, execute o programa python para ativar a Pi- Cam que está no diretório flask e verifique se a camera está enviando o viseo em streaming:
- sudo python app.py
- Uma vez que você pode ver o vídeo, execute um CTRL- C para libertar o monitor para introduzir o código Python principal (O mesmo que o utilizado no passo 11).
- 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.
- 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 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.
Abaixo os códigos Finais :
Conclusão:
No futuro pretendo incluir algumas características adicionais ao projeto:
- Controlar o Rover pela 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 opção é usar como base o Rover em MDF projetado pelo Mauricio dos Santos)
Desta maneira poderia-se realmente simular um “Mars Rover”.
Logo da publicação deste projeto no site do Instructables.com, fui procurado pela revista inglesa oficial do Raspberry-Pi, a MagPi, para dar uma entrevista e contar de como foi o desenvolvimento do Mars Rover. Foi bem legal! Aqui, um pouco sobre a matéria:
Todos os produtos utilizados neste artigo podem ser encontrados na Loja de Eletrónica e Robótica – ElectroFun.
Gostaram deste artigo? Deixem o vosso comentário no formulário a baixo e partilhem com os vossos amigos.
Não se esqueçam de fazer like na nossa Página no Facebook.
Podem ainda colocar as vossas dúvidas no nosso Forum da Comunidade Arduino em Portugal ou no nosso Grupo no Facebook Arduino Portugal – Qual o teu projeto?