Rastreie-ME
Componentes e suprimentos
| × | 1 | ||||
| × | 1 | ||||
| × | 1 | ||||
| × | 1 | ||||
| × | 1 | ||||
| × | 1 | ||||
| × | 1 | ||||
| × | 1 | ||||
| × | 1 | ||||
| × | 1 |
Sobre este projeto
Há algum tempo, decidi construir um rastreador de carro / pessoal.
Este foi meu primeiro protótipo nesta direção.
O próprio sistema é muito simples. Apenas um Arduino Mega, um GPS, um GPRS Shield e um cartão SD. Este é opcional mas incluí porque pensei em lançar um desafio aos meus amigos do Facebook, eles ligam para o sistema e recebem um SMS com a minha posição ou a minha última posição conhecida.
O sistema está sempre procurando a posição real. Se alguém ligar para o número do cartão SIM, o sistema enviará um SMS com a posição real e com um link para o google maps. Por exemplo:
A localização do Hugo agora é:Lat:54.315010, Log:10.130997. http://maps.google.com/maps?q=54.315010,+10.130997
Se o GPS não estiver recebendo nenhuma posição, o sistema enviará a última posição conhecida. Por exemplo:
Não consigo encontrar Hugo. A última vez que o vi foi em:Lat:54.315010, Log:10.130997. http://maps.google.com/maps?q=54.315010,+10.130997
A data, hora, posição e status do SMS são armazenados no cartão SD.
Componentes
Eu usei:
1x Arduino MEGA
1x Escudo GPRS (também é possível usar outros escudos GSM disponíveis no mercado)
1x GPS (usei o NEO 6, muito popular no ebay)
1x escudo do cartão SD
1 bateria de 9V
1x caixa de plástico
Alguns fios
Conecte os componentes
Uma vez que o Arduino Mega usa uma pinagem diferente, algumas religações são necessárias.
Primeiro, o SD Card Shield, que foi projetado para Arduino Uno, usa os pinos 10 a 13 para SPI, então para que funcione no Mega, eles precisam ser "passados" para os pinos SPI no MEGA.
Pinos Arduino UNO SPI - pinos Arduino MEGA SPI
MOSI - 11 a 51
MISO - 12 a 50
SCK - 13 a 52
SS - 10 a 53
No GPRS Shield primeiro é necessário configurar os pinos de comunicação para Software Serial no jumper J7 do shield.
Em seguida, usando alguns fios, conectei os pinos 7 e 8 na blindagem GPRS à porta Serial 1 (pinos 18 e 19 no Arduino Mega).
Para obter mais detalhes sobre como conectar o cartão SIM no GPRS Shield, consulte meu outro projeto no Hackster.
O GPS é conectado à porta Serial 2 (pinos 16 e 17) no Arduino Mega.
Além disso, a energia necessária para o GPS é retirada do pino 5V do cartão SD e do pino GND.
A bateria de 9 V pode ser conectada ao pino Vin ou ao plugue de alimentação.
Preparando para fechar a caixa e teste de campo.
Código
Deixo aqui algumas notas rápidas sobre o código.
Usei essa biblioteca para o GPRS Shield.
É necessário fazer algumas alterações para usar o Arduino Mega:
1) Abra GSM.h e comente as linhas apropriadas como abaixo, por exemplo para Arduino Mega:
// # define UNO
#define MEGA
2) Em HWSerial.h descomente a linha para definição de Mega, por ex. para Arduino Mega:
#define MEGA
Para GPS, estou usando esta biblioteca.
O programa em si é executado de maneira muito simples. Após todas as rotinas de inicialização (inicialização GPRS, GPS e cartão SD), o GPS tentará determinar a quantidade de satélites que tem disponíveis e um ponto de coordenadas GPS válido.
Se a chamada for feita durante este período, a chamada será automaticamente rejeitada e nada acontecerá.
Quando o GPS tem uma localização válida e está detectando mais de 3 satélites (presumo onde o GPS tem boa recepção), se uma chamada for feita, o sistema enviará um SMS para o número de chamada com a minha posição. Todos esses dados serão armazenados no cartão SD.
Se o GPS tiver menos de 3 satélites, nenhuma posição válida pode ser recuperada, então se uma chamada for feita, o número da chamada receberá um SMS com minha última posição conhecida. Novamente, todos os dados são armazenados no cartão SD.
Prós e contras
Por ser um protótipo, muitas coisas não funcionaram bem. Mas o objetivo é sempre melhorar.
Primeiro a bateria dura apenas uma hora !! Não implementei nenhuma mecânica de economia de energia no software. Portanto, para melhorias futuras, o "Modo de suspensão" é obrigatório.
O tamanho também foi revisado e eu projetei uma nova placa completa. A primeira olhada é esta:
Por favor, escreva-me se você encontrou algum erro ou se você tiver alguma sugestão / melhoria ou perguntas.
Obrigado pela leitura.
Hugo gomes
Código
- Código
Código Arduino
#include "SIM900.h" #include#include "sms.h" #include "call.h" #include // Para alterar os pinos para Software / Hardware Serial, use 27, 28 linhas em GSM.cpp.//Para usar Arduino Mega, defina MEGA na linha 5 em GSM.h. # include #include // Mega CS pinconst int chipSelect =53; // Temos que criar as classes para SMSs e chamadas.CallGSM call; SMSGSM sms; char number [20]; byte stat =0; int value =0; char value_str [5]; // GPS Variable // O TinyGPS ++ objectTinyGPSPlus gps; const char * googlePrefix ="http://maps.google.com/maps?q=";double Lat; double Long; int dia, mês, ano; int hora, minuto, segundo; int num_sat; booleano one_point_true =false; void setup () {// Conexão serial. Serial.begin (9600); // Conexão GPRS Serial.print (F ("Iniciando GSM ...")); // Inicie a configuração do escudo com baudrate. if (gsm.begin (9600)) Serial.println (F ("PRONTO")); senão Serial.println (F ("IDLE")); // Conexão GPS Serial.println (F ("Iniciando GPS")); // Porta de comunicação GPS Serial2.begin (9600); // SD Card start Serial.print (F ("Inicializando cartão SD ...")); // certifique-se de que o pino de seleção de chip padrão está configurado para // saída, mesmo se você não o usar:pinMode (53, OUTPUT); // veja se o cartão está presente e pode ser inicializado:if (! SD.begin (chipSelect)) {Serial.println (F ("O cartão falhou ou não está presente")); // não faça mais nada:return; } Serial.println (F ("cartão inicializado."));} // ******************************** *********************************************** // Loopvoid principal loop () {Get_GPS (); // Obtenha a posição Check_call (); // Veja se alguém está ligando}; /////////////////////////////////////////// ///////////////////////////////////////////// ********* *************************************************** ******************* // Obter a posição do GPSvoid Get_GPS () {while (Serial2.available ()> 0) if (gps.encode (Serial2.read ())) num_sat =gps.satellites.value (); //Serial.println(num_sat); if (gps.location.isValid () ==1) {Lat =gps.location.lat (); Long =gps.location.lng (); if (Lat! =0 &&Long! =0) one_point_true =true; } if (gps.date.isValid ()) {day =gps.date.day (); mês =gps.date.month (); ano =gps.data.ano (); } if (gps.time.isValid ()) {hour =gps.time.hour (); minuto =gps.time.minute (); segundo =gps.time.second (); } smartDelay (500); if (millis ()> 5000 &&gps.charsProcessed () <10) {Serial.println (F ("Nenhum GPS detectado:verifique a fiação.")); enquanto (verdadeiro); }} // ********************************************* ********************************* // Esta versão personalizada de delay () garante que o objeto GPS // está sendo "alimentado" .static void smartDelay (unsigned long ms) {unsigned long start =millis (); fazer {while (Serial2.available ()) gps.encode (Serial2.read ()); } while (millis () - start =3 &&one_point_true ==true) {char sms_OK [160]; sprintf (sms_OK, "a localização do Hugo é agora:Lat:% s, Log:% s.% s% s, +% s \ n", lat_print, Long_print, googlePrefix, lat_print, Long_print); Serial.println (sms_OK); erro =sms.SendSMS (número, sms_OK); atraso (500); if (erro ==0) // Verificar status {Serial.println (F ("SMS ERROR")); } else {Serial.println (F ("SMS OK")); }} else if (num_sat <3 &&one_point_true ==true) {char sms_NOK [150]; sprintf (sms_NOK, "Não consigo encontrar o Hugo. A última vez que o vi, foi em:Lat:% s, Log:% s.% s% s, +% s \ n", lat_print, Long_print , googlePrefix, lat_print, Long_print); Serial.println (sms_NOK); erro interno =sms.SendSMS (número, sms_NOK); if (erro ==0) // Verificar status {Serial.println (F ("SMS ERROR")); } else {Serial.println (F ("SMS OK")); }} else if (one_point_true ==false) {Serial.println (F ("Nenhum ponto GPS válido")); } // Salvar tudo no arquivo do cartão SD dataFile =SD.open ("datalog.txt", FILE_WRITE); // se o arquivo estiver disponível, escreva nele:if (dataFile) {dataFile.print (Date); dataFile.print (""); dataFile.print (time1); dataFile.print (""); dataFile.print (número); dataFile.print (""); dataFile.print (lat_print); dataFile.print (","); dataFile.print (Long_print); dataFile.print (""); dataFile.print (erro); dataFile.println (); dataFile.close (); } // se o arquivo não estiver aberto, aparecerá um erro:else {Serial.println (F ("erro ao abrir datalog.txt")); }} //////////////////////////////////////////////////// ////////////////////////////////////
Esquemas
Processo de manufatura