Índice:

Arduino GPS Logger: 3 etapas
Arduino GPS Logger: 3 etapas

Vídeo: Arduino GPS Logger: 3 etapas

Vídeo: Arduino GPS Logger: 3 etapas
Vídeo: NEO 6m GPS модуль подключение к Ардуино. Ардуино проекты. 2024, Julho
Anonim
Arduino GPS Logger
Arduino GPS Logger
Arduino GPS Logger
Arduino GPS Logger

Oi, pessoal, Estou ficando superexcitado com pequenos projetos que permitem que as pessoas realmente entendam muito mais da tecnologia que temos ao redor todos os dias.

Este projeto é sobre GPS breakout e registro SD. Aprendi muito apenas construindo essas coisas.

Há muitas noções que você vai ganhar seguindo este tutorial, e muito mais seguindo o link que forneço para se aprofundar nos tópicos.

Então, o que é isso? Simples: É um rastreador GPS que registra posições (com altitude também), velocidade e data / hora em um microSD.

O que você vai precisar:

- Arduino Nano (na verdade usei um UNO para construir o esboço, mas eles são iguais!) - Adafruit ultimate GPS breakout- MicroSD card breakout- Ferramentas de soldagem (tudo que você precisa para soldar) - Stripboard universal (eu usei a 5x7cm) - Fios

Todos esses componentes são muito baratos, exceto o módulo GPS. Isso custa cerca de 30-40 dólares e é a parte mais cara. Mesmo um novo conjunto de ferro de solda pode custar menos.

Existe também um escudo Adafruit com módulos de GPS e cartão SD juntos. Se você quiser usá-lo, lembre-se de que ele é feito para o Arduino UNO, portanto, você precisará de um UNO e não de um Nano. No entanto, não há diferença no esboço.

Vamos mais longe …

Etapa 1: conectando componentes

Componentes de conexão
Componentes de conexão
Componentes de conexão
Componentes de conexão
Componentes de conexão
Componentes de conexão
Componentes de conexão
Componentes de conexão

Bem, depois de obter os componentes, você precisará conectá-los. Aqui você pode encontrar os esquemas fritzing que são bastante claros. No entanto, aqui está a pinagem também:

Quebra MicroSD

5V -> 5VGND -> GnnCLK -> D13DO -> D12DI -> D11CS -> D4 (se você estiver usando a blindagem, ela é integrada ao D10)

Fuga de GPS

Vin -> 5VGnn -> GnnRx -> D2Tx -> D3

Pequenas notas sobre esses módulos: Esses dois meninos estão se comunicando por caminhos diferentes com o Arduino. O GPS usa um Serial TTL, do mesmo tipo que usamos quando nos comunicamos com o Arduino via Serial Monitor, por isso temos que declarar através de uma biblioteca um novo serial (Tx e Rx) porque o GPS quer usar o 9600 por padrão, e nós quer usá-lo também. O módulo GPS está sempre e constantemente transmitindo dados, se estiver conectado. Essa é a parte complicada de lidar, porque se lermos uma frase e depois imprimi-la, podemos perder a próxima, que também é necessária. Temos que ter isso em mente ao codificar!

O MicroSD se comunica via SPI (Serial Peripheral Interface), outra forma de se comunicar com a placa. Esse tipo de módulo sempre usa CLK no D13, DO no D12 e DI no D11. Às vezes, essas conexões têm nomes diferentes, como CLK = SCK ou SCLK (relógio serial), DO = DOUT, SIMO, SDO, SO, MTSR (todos aqueles indicam saída mestre) e DI = SOMI, SDI, MISO, MRST (entrada mestre). Finalmente temos o CS ou SS que indica o pino para onde enviamos o que queremos escrever no MicroSD. Se você quiser usar dois módulos SPI diferentes, basta diferenciar este pino para usar os dois. Por exemplo, tela LCD E um MicroSd como o que estamos usando. Deve funcionar também usando dois LCDs diferentes conectados a CSs diferentes.

Solde essas peças juntas na placa e você está pronto para carregar o esboço!

Como você pode ver no esboço, eu soldo alguns conectores fêmeas duvidosos em vez do componente direto, porque no futuro posso querer reutilizar o componente ou trocar um.

Também soldei o módulo GPS com os conectores na direção errada, foi minha culpa e não quis, mas funciona e não quero arriscar quebrá-lo tentando dessoldar aqueles desgraçados! Apenas solde da maneira certa e tudo ficará bem!

Aqui estão alguns vídeos úteis de solda: Guia de soldagem para iniciantes Um vídeo sobre desoldador

Canal Adafruit no Youtube, muita coisa interessante lá!

Ao soldar, tente usar apenas a quantidade de metal necessária, caso contrário, você vai fazer uma bagunça. Não tenha medo de fazer isso, talvez comece com algo não tão caro e depois continue soldando coisas diferentes. O material certo também faz a diferença!

Etapa 2: O esboço

Primeiro, é claro, importamos a biblioteca e construímos seus objetos para trabalhar com: SPI.h é para se comunicar com os módulos SPI, SD é a biblioteca MicroSD e Adafruit_GPS é a biblioteca do módulo GPS. SoftwareSerial.h serve para criar uma porta serial via software. A sintaxe é "mySerial (TxPin, RxPin);". O objeto GPS precisa ser apontado para um serial (entre colchetes). Aqui estão os links das bibliotecas para o breakout Adafruit GPS, o breakout MicroSD (para fazer um trabalho limpo, você também deve formatar o SD com este software da associação SD) e o Biblioteca serial do software (deve ser incluída no IDE).

NOTA: Eu enfrentei alguns problemas ao tentar anexar muitas informações em um arquivo ou usar mais de dois arquivos no esboço. Não formatei o SD com esse software, talvez isso resolva o problema. Além disso, tentei adicionar outro sensor no dispositivo, um BMP280 (módulo I2C), sem sucesso. Parece que usar o módulo I2C deixa o desenho louco! Já perguntei no fórum da Adafruit, mas ainda não obtive resposta.

#include "SPI.h" #include "SD.h" #include "Adafruit_GPS.h" #include "SoftwareSerial.h" SoftwareSerial mySerial (3, 2); Adafruit_GPS GPS (& mySerial);

Agora precisamos de todas as nossas variáveis: as duas strings são para ler as duas sentenças de que precisamos para calcular um monte de informações úteis do GPS. O char é para armazenar as sentenças antes de analisá-las, os floats são para calcular as coordenadas em graus (GPS send usa coordenadas em graus e minutos, precisamos delas em graus para permitir a leitura no google earth). O chipSelect é o pino onde conectamos o CS do cartão MicroSD. Neste caso é D4, mas se você estiver usando um escudo SD, você terá que colocar D10 aqui. A variável de arquivo é aquela que armazenará as informações do arquivo que estamos usando durante o esboço.

String NMEA1;

String NMEA2; char c; float deg; float degWhole; float degDec; int chipSelect = 4; Arquivo mySensorData;

Agora estamos declarando algumas funções para tornar o esboço um pouco mais elegante e menos confuso:

Eles estão fazendo basicamente o mesmo: lendo frases NMEA. clearGPS () está ignorando três sentenças e readGPS () está salvando duas delas nas variáveis.

Vamos ver como: Um loop while está controlando se há novas sentenças NMEA no módulo e lendo o fluxo de GPS até que haja uma. Quando uma nova frase está lá, estamos fora do loop while, onde a frase é realmente lida, analisada e armazenada nas primeiras variáveis NMEA. Estamos fazendo o mesmo imediatamente para o próximo, porque o GPS está constantemente transmitindo, não está esperando que estejamos prontos, não temos tempo para imprimi-lo imediatamente

Isto é muito importante! Não faça nada antes de estocar ambas as frases, caso contrário, a segunda poderia eventualmente ser corrompida ou simplesmente errada.

Depois de obtermos duas frases, nós as imprimimos na série para controlar se está tudo bem.

void readGPS () {

clearGPS (); enquanto (! GPS.newNMEAreceived ()) {c = GPS.read (); } GPS.parse (GPS.lastNMEA ()); NMEA1 = GPS.últimoNMEA (); enquanto (! GPS.newNMEAreceived ()) {c = GPS.read (); } GPS.parse (GPS.lastNMEA ()); NMEA2 = GPS.últimoNMEA (); Serial.println (NMEA1); Serial.println (NMEA2); } void clearGPS () {while (! GPS.newNMEAreceived ()) {c = GPS.read (); } GPS.parse (GPS.lastNMEA ()); enquanto (! GPS.newNMEAreceived ()) {c = GPS.read (); } GPS.parse (GPS.lastNMEA ()); enquanto (! GPS.newNMEAreceived ()) {c = GPS.read (); } GPS.parse (GPS.lastNMEA ()); }

Bem, agora que está tudo pronto, podemos passar pelo setup ():

Primeiro: abrimos a comunicação no Serial 115200 para Arduino PC e no 9600 para o módulo GPS Arduino. Segundo: enviamos três comandos para o módulo GPS: o primeiro é para desligar a atualização da antena, o segundo é para pedir apenas string RMC e GGA (vamos usar apenas aqueles, que têm todas as informações de que você precisa a GPS), o terceiro e último comando é definir a taxa de atualização para 1HZ, sugerida pela Adafruit.

Depois disso, definimos o pino D10 para OUTPUT, se, e somente se, o pino CS do seu modelo SD for diferente de D10. Imediatamente depois, configure o CS no módulo SD no pino chipSelect.

Executamos as funções readGPS () que incluem o cleanGPS ().

Agora é hora de escrever algo nos arquivos! Se o arquivo já estiver no cartão SD, anexe um carimbo de data / hora a eles. Desta forma, não temos que controlar as sessões ou apagar os arquivos todas as vezes. Com um carimbo de data / hora escrito na função de configuração, temos a certeza de adicionar uma separação nos arquivos apenas uma vez por sessão.

NOTA: A biblioteca SD leva muito a sério a abertura e o fechamento do arquivo todas as vezes! Lembre-se e feche-o sempre! Para saber mais sobre a biblioteca, siga este link.

Ok, estamos realmente prontos para obter o núcleo da parte de fluxo e registro do esboço.

void setup () {

Serial.begin (115200); GPS.begin (9600); // Envia comandos para o módulo GPS GPS.sendCommand ("$ PGCMD, 33, 0 * 6D"); GPS.sendCommand (PMTK_SET_NMEA_OUTPUT_RMCGGA); GPS.sendCommand (PMTK_SET_NMEA_UPDATE_1HZ); atraso (1000); // apenas se o pino CS do seu módulo SD não estiver no pino D10

pinMode (10, SAÍDA);

SD.begin (chipSelect); readGPS (); if (SD.exists ("NMEA.txt")) {mySensorData = SD.open ("NMEA.txt", FILE_WRITE); mySensorData.println (""); mySensorData.print ("***"); mySensorData.print (GPS.day); mySensorData.print ("."); mySensorData.print (GPS.month); mySensorData.print ("."); mySensorData.print (GPS.year); mySensorData.print ("-"); mySensorData.print (GPS.hour); mySensorData.print (":"); mySensorData.print (GPS.minute); mySensorData.print (":"); mySensorData.print (GPS.seconds); mySensorData.println ("***"); mySensorData.close (); } if (SD.exists ("GPSData.txt")) {mySensorData = SD.open ("GPSData.txt", FILE_WRITE); mySensorData.println (""); mySensorData.println (""); mySensorData.print ("***"); mySensorData.print (GPS.day); mySensorData.print ("."); mySensorData.print (GPS.month); mySensorData.print ("."); mySensorData.print (GPS.year); mySensorData.print ("-"); mySensorData.print (GPS.hour); mySensorData.print (":"); mySensorData.print (GPS.minute); mySensorData.print (":"); mySensorData.print (GPS.seconds); mySensorData.println ("***"); mySensorData.close (); }}

Agora estamos obtendo o núcleo do esboço.

É super simples, de fato.

Vamos ler o fluxo de GPS com a função readGPS (), então controlaremos se tivermos um ponto fixo igual a 1, o que significa que estamos conectados a um satélite. Se tivermos, vamos escrever nossas informações nos arquivos. No primeiro arquivo "NMEA.txt", escrevemos apenas as frases brutas. No segundo arquivo, "GPDData.txt", acrescentamos as coordenadas (convertidas com as funções que vimos antes) e a altitude. Essas informações são suficientes para compilar um arquivo.kml para criar um caminho no Google Earth. Observe que fechamos os arquivos toda vez que os abrimos para escrever algo!

void loop () {

readGPS (); // Condizione if che controlla se l'antenna ha segnale. Se si, procede con la scrittura dei dati. if (GPS.fix == 1) {// Salvar dados apenas se tivermos uma correção mySensorData = SD.open ("NMEA.txt", FILE_WRITE); // Apre il arquivo por le frasi NMEA grezze mySensorData.println (NMEA1); // Scrive prima NMEA sul file mySensorData.println (NMEA2); // Scrive seconda NMEA sul file mySensorData.close (); // Arquivo Chiude !!

mySensorData = SD.open ("GPSData.txt", FILE_WRITE);

// Converte e scrive la longitudine convLong (); mySensorData.print (deg, 4); // Scrive le coordinate in gradi sul file mySensorData.print (","); // Scrive una virgola per separare i dati Serial.print (deg); Serial.print (","); // Converte e scrive la latitudine convLati (); mySensorData.print (deg, 4); // Scrive le coordinate in gradi sul file mySensorData.print (","); // Scrive una virgola per separare i dati Serial.print (deg); Serial.print (","); // Scrive l'altitudine mySensorData.print (GPS.altitude); mySensorData.print (""); Serial.println (GPS.altitude); mySensorData.close (); }}

Agora que terminamos, você pode fazer o upload do esboço, construir o dispositivo e se divertir!

Observe que você precisa usá-lo com o borad do GPS voltado para o céu para obter uma correção = 1, ou você pode conectar uma antena externa nele.

Além disso, lembre-se de que, se houver uma correção, a luz vermelha piscará a cada 15 segundos; caso contrário, muito mais rápido (uma vez a cada 2-3 segundos).

Se você quiser aprender algo mais sobre as sentenças NMEA, basta seguir a próxima etapa deste guia.

Etapa 3: as frases NMEA e o arquivo.kml

O dispositivo e o esboço estão completos, estão funcionando bem. Lembre-se de que, para obter uma correção (para ter uma conexão com satélites), o rompimento deve estar voltado para o céu.

A pequena luz vermelha pisca a cada 15 segundos quando você consegue uma correção

Se quiser entender melhor as sentenças NMEA, você pode ler mais adiante.

No esboço, usamos apenas duas frases, o GGA e o RMC. Elas são apenas algumas das frases que o módulo GPS está transmitindo.

Vamos ver o que há nessa string:

$ GPRMC, 123519, A, 4807,038, N, 01131.000, E, 022,4, 084,4, 230394, 003,1, W * 6A

RMC = Frase mínima recomendada C 123519 = Correção tomada às 12:35:19 UTC A = Status A = ativo ou V = Vazio 4807.038, N = Latitude 48 graus 07.038 'N 01131.000, E = Longitude 11 graus 31.000' E 022.4 = Velocidade sobre o solo em nós 084,4 = Ângulo da trilha em graus Verdadeiro 230394 = Data - 23 de março de 1994 003,1, W = Variação magnética * 6A = Os dados de checksum, sempre começa com *

$ GPGGA, 123519, 4807.038, N, 01131.000, E, 1, 08, 0,9, 545,4, M, 46,9, M,, * 47

Dados de correção do sistema de posicionamento global GGA 123519 Correção feita às 12:35:19 UTC 4807.038, N Latitude 48 graus 07.038 'N 01131.000, E Longitude 11 graus 31.000' E 1 Qualidade da correção: 0 = inválido; 1 = ponto GPS (SPS); 2 = ponto DGPS; 3 = correção de PPS; 4 = Cinemático em tempo real; 5 = Float RTK; 6 = estimado (cálculo morto) (característica 2.3); 7 = Modo de entrada manual; 8 = Modo de simulação; 08 Número de satélites sendo rastreados 0,9 Diluição horizontal da posição 545,4, M Altitude, Metros, acima do nível médio do mar 46,9, M Altura do geóide (nível médio do mar) acima do elipsóide WGS84 (campo vazio) tempo em segundos desde a última atualização DGPS (campo vazio) Número de identificação da estação DGPS * 47 os dados de checksum, sempre começa com *

Como você pode ver, há muito mais informações do que você precisa lá. Usando a biblioteca do Adafruit, você pode chamar alguns deles, como GPS.latitude ou GPS.lat (latitude e hemisfério lat) ou GPS.day/month/year/hour/minute/seconds/milliseconds… Dê uma olhada no Adafruit site para saber algo mais. Não é tão claro, mas seguindo algumas dicas no guia dos módulos de GPS, você pode encontrar o que precisa.

O que podemos fazer com os arquivos que temos? Fácil: compile um arquivo kml para mostrar um caminho no Google Earth. Para fazer isso, basta copiar / colar o código que você encontrará seguindo este link (sob o parágrafo Caminho), colocar suas coordenadas do arquivo GPDData.txt entre as tags, salvar o arquivo com extensão.kml e carregá-lo em Google Earth.

NOTA: A linguagem de marcação.kml é simples, se você já sabe o que é uma linguagem de marcação, reserve um tempo para ler o link anterior e a documentação interna, é realmente interessante!

Usar o kml significa conhecer suas tags e argumentos. Encontrei apenas o guia do Google, aquele que vinculei antes e o essencial é definir o estilo entre as tags e chamá-lo com o sinal # na hora de escrever as coordenadas.

O arquivo que adicionei nesta seção é um.kml no qual você pode simplesmente colar suas coordenadas. lembre-se de colar com esta sintaxe: longitude, latitude, altitude

Recomendado: