Thursday, June 18, 2015

Considerações Finais

Em linhas gerais, o desenvolvimento do projeto relatado nesse blog foi de grande valia para o grupo. Foi possível resgatar conceitos de disciplinas anteriores, conhecer e experimentar novas ferramentas e dispositivos, além de praticar conceitos teóricos que vão além do escopo técnico do produto desenvolvido, como gerenciamento de projetos e trabalho e equipe.
Como forma de encerramento da disciplina, três itens merecem uma atenção especial: a organização interna do grupo durante o projeto, os resultados finais e próximos passos para desenvolvimento do projeto.

Organização interna do grupo

Dada que a disciplina Desenvolvimento de Produtos Mecatrônicos ocorre em um momento em que os alunos costumam estar estagiando, cada qual com sua rotina específica e em diferentes cidades, a organização interna das atividades foi um desafio que merece ser ressaltado. Como forma de lidar com essa dificuldade, as primeiras aulas do semestre foram utilizadas para que, juntos, fosse possível definir uma ideia básica do produto e um plano de metas a serem seguidas para se chegar ao objetivo final de um protótipo funcional do produto. De forma complementar, a cada área macro do projeto foi vinculado um membro do grupo como responsável, como mostra o diagrama a seguir:

É importante ressaltar que, apesar de haver um responsável por cada uma das áreas, a interligação entre elas era tão forte que foi possível e necessário que todos os membros estivessem cientes ou envolvidos de tudo o que foi feito ao longo do semestre. Tal contexto foi importante para que todos pudessem absorver o conteúdo desenvolvido na disciplina de forma similar e completa.

Resultado final

Como resumo das atividades do semestre e dos posts desse blog, foi desenvolvido o primeiro protótipo da AWS proposta pelo grupo e intitulada MK real-time device (MK-RTD).  Basicamente, o sistema é constituído de uma plataforma com microcontrolador em que estão acoplados sensores (de temperatura, luminosidade, pressão atmosférica e localização geoespacial), com uma interface de comunicação direta com o usuário e capaz de enviar os dados obtidos por comunicação bluetooth. Entre os principais atrativos do projeto estão o baixo consumo energético, a facilidade de acoplamento de novos sensores e a compatibilidade com diferentes sistemas de recepção de dados, como notebooks e aplicativos.
O vídeo a seguir exemplifica muito bem o modo de funcionamento do produto:


Próximos passos

Apesar de ir além do escopo proposto para a disciplina, podem ser apontados pontos para continuidade de desenvolvimento do produto apresentado:
- Adição de sensores para situações e necessidades mais específicas;
- Desenvolvimento de novos protótipos, com a possibilidade de confecção de um case específico para os componentes, e consequente realização de mais testes de campo para definição do arranjo do sistema.
- Acoplamento do sistema a uma base móvel, ampliando as suas possibilidades de uso. Como exemplo, temos o robô desenvolvido pela equipe SEMEAR-EESC-USP para desafios em ambiente aberto.
Robô da equipe SEMEAR



Em suma, fica evidente o aprendizado oriundo desse projeto. Apesar de alguns ajustes serem necessários e importantes para garantir que todos os grupos possam aprender e se engajar nela – como foi o caso desse grupo, os relatos desse blog deixam claro que a proposta da disciplina, ainda que em sua primeira execução no curso, tem bastante potencial no que envolve o aprendizado dos alunos.

Dados dos alunos envolvidos no projeto:
Nome
Nº USP
Contato
Adelmo Antonio da Silva Eloy
7171536
Gian Vieira Pinto
7171324
Luiz Amadeu Martins Tapparo
7171387
Mauricio Hegues Baiocco
7171283
Vitor Akihiro Hisano Higuti
7171411




Teste - interface com outros dispositivos

Conforme mencionado nos posts anteriores, a alta modularidade da estação meteorológica automática descrita neste blog permite que outros equipamentos ou softwares adicionais complementem o sistema, acrescentando novas funcionalidades e melhorando o desempenho do produto em si.

Como exemplo, foi possível configurar o acoplamento de um anemômetro ao dispositivo MK Real-time original, conforme mostra a figura a seguir:


Anemômetro acoplado ao dispositivo MK Real-time.


O anemômetro foi originalmente desenvolvido pelo grupo do Arthur Raposa, da Fernanda Colombo e do Jonatan Pereira. Esse aparato disponibilizaria informações referentes à direção e velocidade do vento aos dados originalmente propostos pelo dispositivo MK Real-Time. 


Foi possível também aprimorar a interface com o usuário através de um aplicativo de celular totalmente construído através do App Inventor pelo grupo do André Franco, Paulo Camargo, Victor Zuanazzi e Vinicius Bazan. A figura a seguir mostra esse aplicativo:


(Esq.) Aplicativo personalizado; (Dir.) Dispositivo MK Real-time.

Percebemos que a sinergia entre os grupos foi uma boa prática, uma vez que conciliou o trabalho realizado independentemente pelos três grupos e propiciou a construção de um produto final mais completo e robusto, com melhor design. A integração entre equipes permitiu também melhor aproveitamento do tempo e facilitou a superação de obstáculos, tanto financeiros (como a aquisição e montagem de mais sensores) quanto técnicos (como o aproveitamento do conhecimento de membros das outras equipes para sanar dúvidas quanto à comunicação entre os dispositivos, por exemplo).

A figura a seguir exibe o produto final, resultante da sinergia entre os três grupos:

Dispositivo MK Real-time completo, incluindo o anemômetro e o aplicativo personalizado.

Maiores informações sobre o desenvolvimento do anemômetro no blog:

DesenvolvimentoPMK

Maiores informações sobre o desenvolvimento do aplicativo personalizado no blog:

ProjetoMK



Wednesday, June 17, 2015

Vídeo - sistema completo

O vídeo a seguir demonstra o funcionamento do sistema final, com todos os sensores integrados e com a comunicação Bluetooth implementada com sucesso.



Tuesday, June 16, 2015

Teste - interface com celular

A definição de uma interface para ser utilizada pelo usuário consistia em um dos requisitos do nosso projeto.

Utilizamos o BTarduinoConnection, um aplicativo gratuito para dispositivos Android. Esse aplicativo é indicado para projetos em que uma plataforma Arduino precisa se conectar com um dispositivo Android através de um módulo Bluetooth.

Esse aplicativo foi construído utilizando-se o MIT App Inventor, uma ferramenta de programação baseada em blocos voltada para o desenvolvimento de aplicativos para dispositivos Android. 

A implementação da comunicação via Bluetooth seria fundamental para o correto funcionamento do nosso dispositivo. Afinal, o Bluetooth consome pouca energia, permite uma distância de até 10 metros entre os dispositivos conectados e utiliza a mesma frequência (2.4 GHz) que a do Wi-Fi.

Foram necessários dois softwares para estabelecer a comunicação em Bluetooth: um que atuava como servidor, implementado em Arduino acoplado com um módulo Bluetooth; e um software cliente, implementado através do App Inventor.


Aplicativo utilizado para os testes de comunicação via Bluetooth.


Software servidor

Os dois dispositivos deveriam estar pareados para a comunicação funcionar. O software servidor, no Arduino, devia rodar antes do software cliente se conectar ao servidor, através do aplicativo de celular. Somente assim os dados podiam ser transmitidos entre os dispositivos.

Aplicativo cliente

O recebimento de dados enviados via Bluetooth acontece no manipulador de evento Clock1.Timer. Assim, o clock define a frequência do evento Timer em uma vez a cada nove segundos, no nosso exemplo (poderia ser outro valor). Ou seja, a cada nove segundos o aplicativo verifica se algum dado foi recebido. O aplicativo cliente consiste de uma imagem espelho do servidor, mas refere-se ao componente BluetoothClient1 em vez do BluetoothServer1.


Programação em blocos no App Inventor do aplicativo cliente.


A propriedade BytesAvailableToReceive informa a quantidade de dados disponível. Se o valor for maior que zero, o aplicativo será capaz de ler a data transmitida pelo servidor e atualizar o estado e as mensagens exibidas.

Interface com outros Aplicativos

Destaca-se a facilidade de se realizar a interface com outros aplicativos, utilizando-se o mesmo servidor. Basta que um aplicativo cliente esteja pareado com o servidor que a comunicação será possível de ser realizada.

O grupo estima a realização de um teste de interface com um aplicativo desenvolvido por algum outro grupo, futuramente. Aguardem a descrição desses testes em posts futuros.

Teste - integração dos dispositivos

Após testar cada módulo ou sensor separadamente, o desafio para finalização do projeto consistiu na conexão de todos os dispositivos ao microcontrolador sugerido no projeto (ATmega2560 da placa Arduino) ao mesmo tempo e seu funcionamento no que se refere ao envio dos dados medidos.
Em outras palavras, os testes apresentados até aqui foram enfim feitos de uma só vez, acoplando todos os dispositivos testados até o momento, resultando no primeiro protótipo de nossa AWS (automatic weather station), como pode ser visto na figura a seguir.
Sistema completo: placa Arduino com Shield de terminais laterais e LCD&Keypad Shield (A); protoboard com sensores do sistema (B); placa de comunicação bluetooth (C); bateria de alimentação do sistema (D) 

Nota-se a ausência de um dos sensores testados ao longo do semestre, o DHT11 (sensor de umidade); infelizmente, o sensor foi danificado e não foi possível repô-lo durante o teste descrito. Nota-se, por outro lado, a adição de um LCD&Keypad Shield - por meio dele, é possível verificar os valores de sensoriamento captados no próprio dispositivo.

Com as conexões seguindo o que foi feito nos testes individuais, restou a implementação de um código capaz de registrar todos os dados recebidos, além de enviá-los via comunicação bluetooth para um receptor.  Quando é necessário integrar vários componentes e realizar múltiplas operações usando o Arduino, é muito provável que o sketch fique longo, o que dificulta a leitura do código. Então, propôs-se a divisão do sketch principal em vários arquivos como mostrado aqui.

Após a criação de um sketch (_2015_ProdMK), basta clicar na seta embaixo do ícone de Lupa (Serial Monitor) no canto superior direito e escolher New Tab para criar novos arquivos.

Sistemas de arquivos múltiplos sendo implementado no Arduino
As abas são concatenadas na hora de compilação. Portanto, o código final comeca com o sketch principal e continua em ordem ASCII (A,B,...,Z,a,b...,z)
1. #include de biblioteca apenas no sketch principal
2. Sugestão de colocar os protótipos das funções no sketch principal
3. Sugestão de colocar os #define e variáveis globais em uma aba DefGlob(em maiúscula)
4. Também é possível colocar o void setup() e void loop() em abas separadas. Como sugestão, nomeá-las como Z_loop e Z_setup. Portanto, elas são as primeiras abas após DefGlob
5. Resto das abas em letra minúscula

Após alguns ajustes no código, o resultado final foi o envio dos dados do sistema via Bluetooth para um receptor (no caso, um notebook), como mostra a imagem abaixo:

Teste de comunicação bluetooth utilizando o TeraTerm (valores lidos pelos sensores podem ser visualizados na tela do monitor).


A próxima etapa do projeto consiste em realizar testes para recebimento dos dados por um dispositivo móvel (celular), por meio de um aplicativo.

Friday, June 12, 2015

Teste - módulo GPS

Como mais um sensor a ser adicionado no projeto, temos um módulo GPS. Um GPS (Global Positioning System) é um dispositivo que permite identificar a sua posição em qualquer lugar do globo, por meio do envio de ondas de rádio a satélites que orbitam a Terra. No caso, o módulo a ser utilizado é o u-blox NEO-6M.


A utilização com Arduino é bastante simples, bastando realizar as conexões a seguir:
Módulo GPS
Arduino
VCC
3.3V
GND
GND
TXD
alguma porta RX



O módulo GPS não precisa receber nenhum comando; ele somente transmite dados (mensagens padrão NMEA e proprietários da ublox). Portanto, não é preciso conectar o RXD do módulo ao Arduino. Tal conexão é necessária quando é preciso configurar o módulo (por exemplo, mudar o baudrate e as mensagens fornecidas).


Como foi dito, o módulo envia mensagens padrão NMEA pela comunicação serial. O programa abaixo foi criado apenas para ler Serial1 do Arduino Mega e imprimir as mensagens recebidas (GPGGA,GPRMC,GPVTG,GPGSA,GPGSV,GPGLL):


#define GPGGA "$GPGGA"
#define GPRMC "$GPRMC"
#define GPVTG "$GPVTG"
#define GPGSA "$GPGSA"
#define GPGSV "$GPGSV"
#define GPGLL "$GPGLL"

/*
  It requires the use of SoftwareSerial, and assumes that you have a
  9600-baud serial GPS device hooked up on pins 19(RX).
  Connect GPS Vcc to +3.3V, GPS Gnd to Gnd, and GPS TX to Arduino RX
 
  Communication using SoftwareSerial is not stable
  
  There's no need to connect GPS RX to Arduino TX
*/
static const uint32_t GPSBaud = 9600;

// The serial connection to the GPS device
boolean bPrint;
char c;
String buf="";

void setup()
{
 Serial.begin(115200);
 Serial1.begin(GPSBaud);
}
void loop()
{
 if (Serial1.available() > 0)
 {
   c = Serial1.read();
   if(c==13){
     bPrint = true;
   }
   else if(c=='$'){
     buf="";
   }
   if(c!=10 && c!=13){
     buf+=(char)c;
   }
   if(buf.substring(0,6)==GPGGA && bPrint){Serial.print(buf);Serial.print("\r\n");}
   else if(buf.substring(0,6)==GPRMC && bPrint){Serial.print(buf);Serial.print("\r\n");}
   else if(buf.substring(0,6)==GPVTG && bPrint){Serial.print(buf);Serial.print("\r\n");}
   else if(buf.substring(0,6)==GPGSA && bPrint){Serial.print(buf);Serial.print("\r\n");}
   else if(buf.substring(0,6)==GPGSV && bPrint){Serial.print(buf);Serial.print("\r\n");}
   else if(buf.substring(0,6)==GPGLL && bPrint){Serial.print(buf);Serial.print("\r\n");}
   bPrint = false;
 }
}


Os dados recebidos foram os seguintes:


Felizmente, a biblioteca TinyGPS++ está disponível para interpretar as mensagens e facilitar o acesso pelo usuário a informações como latitude, longitude entre outros.  

Obs.: para incluir no ambiente do Arduino, basta realizar o download e colocar a pasta extraída em sketchbook/libraries.
O programa abaixo possui pequenas alterações em relação ao exemplo DeviceExample disponível com a biblioteca


#include <TinyGPS++.h>
/*
  This sample sketch demonstrates the normal use of a TinyGPS++ (TinyGPSPlus) object.
  It requires the use of SoftwareSerial, and assumes that you have a
  9600-baud serial GPS device hooked up on pin 19 (RX).
*/

static const uint32_t GPSBaud = 9600;

// The TinyGPS++ object
TinyGPSPlus gps;

void setup()
{
 Serial.begin(115200);
 Serial1.begin(GPSBaud);

 Serial.println(F("DeviceExample.ino"));
 Serial.println(F("A simple demonstration of TinyGPS++ with an attached GPS module"));
 Serial.print(F("Testing TinyGPS++ library v. ")); Serial.println(TinyGPSPlus::libraryVersion());
 Serial.println(F("by Mikal Hart"));
 Serial.println();
}

void loop()
{
 // This sketch displays information every time a new sentence is correctly encoded.
 while (Serial1.available() > 0)
   if (gps.encode(Serial1.read()))
     displayInfo();

 if (millis() > 5000 && gps.charsProcessed() < 10)
 {
   Serial.println(F("No GPS detected: check wiring."));
   while(true);
 }
}

void displayInfo()
{
 Serial.print(F("Location: "));
 if (gps.location.isValid())
 {
   Serial.print(gps.location.lat(), 6);
   Serial.print(F(","));
   Serial.print(gps.location.lng(), 6);
 }
 else
 {
   Serial.print(F("INVALID"));
 }

 Serial.print(F("  Date/Time: "));
 if (gps.date.isValid())
 {
   Serial.print(gps.date.month());
   Serial.print(F("/"));
   Serial.print(gps.date.day());
   Serial.print(F("/"));
   Serial.print(gps.date.year());
 }
 else
 {
   Serial.print(F("INVALID"));
 }

 Serial.print(F(" "));
 if (gps.time.isValid())
 {
   if (gps.time.hour() < 10) Serial.print(F("0"));
   Serial.print(gps.time.hour());
   Serial.print(F(":"));
   if (gps.time.minute() < 10) Serial.print(F("0"));
   Serial.print(gps.time.minute());
   Serial.print(F(":"));
   if (gps.time.second() < 10) Serial.print(F("0"));
   Serial.print(gps.time.second());
   Serial.print(F("."));
   if (gps.time.centisecond() < 10) Serial.print(F("0"));
   Serial.print(gps.time.centisecond());
 }
 else
 {
   Serial.print(F("INVALID"));
 }

 Serial.println();
}

Por fim, os dados fornecidos pelo módulo podem ser visualizados a seguir (onde o horário fornecido está no fuso horário UTC±00:00.