GPS Передает ложные данные с помощью SD-карты in; Истинные данные с помощью SD-карты out
Я запрограммировал свой Arduino Ethernet на прием данных от GPS-приемника Skytraq Venus и разделил их с помощью TinyGPS, а затем сохранил на SD-карте. Когда SD-карта вставлена, все остальное, кроме времени, совершенно неверно. Как только я вынимаю SD-карту и сбрасываю ее, долгота и широта все еще неверны, но все остальное правильно. Я пробовал подавать больше энергии, заменял приемник, антенну, сам arduino, даже переключал последовательные порты, которые использую, но, похоже, не могу найти решения.
Вот ссылка на библиотеку TinyGPS и ссылка на библиотеку NewSoftSerial. А что касается схем, то я их еще не нарисовал, но использую SD-порт Arduino Ethernet в качестве SD-щита. RX - вывод моего GPS-приемника Skytraq подключен к контакту 2 в arduino ethernet, а TX - вывод подключен к контакту 3 в ethernet. (Ethernet TX/RX был установлен на вывод 3 и 2 соответственно.)
Я использую Sparkfun Venus GPS с разъемом SMA от компании sparkfun.com. Я бы разместил эту ссылку, но там написано, что мне нужно как минимум 10 репутаций, чтобы разместить более двух ссылок. Последовательные сигналы на 3,3 В и GPS - модуль-это модуль 3,3 В. Я использую один и тот же скетч с SD-картой и без нее. SD.begin вызывается только один раз, а Serial.begin также вызывается один раз.
Вот мой код:
#include <SoftwareSerial.h> //Библиотека NewSoftwareSerial
#include <TinyGPS.h> //Библиотека TinyGPS
#include <SPI.h> //Эта библиотека используется библиотекой SD.
//Должен быть определен перед библиотекой SD, чтобы предотвратить ошибки.
#include <SD.h> //Библиотека SD-карт
//NB: Чтобы избежать ошибок SD - карты, используйте SD-карту размером не более 2 ГБ
//и используйте формат FAT16. Arduino имеет проблемы с FAT32 и картами>2 ГБ.
#define RXPIN 2
#define TXPIN 3
const int chipSelect = 4; //Это выбирает порт SD-карты для чтения/записи
#define GPSBAUD 9600
File logs; //Used to write to SD card later
TinyGPS gps;
//Инициализация последовательного программного обеспечения для распознавания
//наши UART-контакты (Чтение(RX) и запись(TX))
SoftwareSerial read_gps(RXPIN, TXPIN);
void getdata(TinyGPS &gps);
void setup() {
// put your setup code here, to run once:
Serial.begin(9600); //Запуск последовательного порта
read_gps.begin(GPSBAUD); //Начать чтение с GPS
pinMode(chipSelect, OUTPUT); //Сделать вывод 4 выходным выводом
pinMode(10, OUTPUT); //Pin 10 всегда должен быть установлен в output, чтобы избежать ошибок
digitalWrite(10, HIGH); //Вывод 10 всегда должен быть высоким, чтобы предотвратить ошибки.
Serial.println("");
Serial.println("Awaiting Lock");
Serial.println("");
//Инициализация SD-карты
SD.begin();
Serial.println("нициализация SD-карты. пожалуйста подождите.");
if(!SD.begin(4)){//Если карта недоступна или карта не распознана
Serial.println("Сбой.");
return;
}
Serial.println("Карта инициализирована");
}
//функция цикла используется для считывания данных с GPS,
//проверки правильности данных, а затем разделения данных на основе наших спецификаций.
void loop() {
// put your main code here, to run repeatedly:
while(read_gps.available()){//по мере получения данных от gps
int c = read_gps.read();
if(gps.encode(c)){//проверка, доступны ли новые действительные данные
getgps(gps); /считывает действительные GPS-данные и обрабатывает их
}
}
}
void getgps(TinyGPS &gps)
{
float latitude, longitude;
gps.f_get_position(&latitude, &longitude); //Feature of tinygps.
//Gets the latitude and longitude
Serial.print("Latitude: "); Serial.print(latitude);
Serial.print("\nLongitude: "); Serial.print(longitude);
int yr;
byte mnth, dy, hr, minu, sec, hundredths;
gps.crack_datetime(&yr, &mnth, &dy, &hr, &minu, &sec, &hundredths); //Gets the date and time and separates them
//into individual components.
Serial.print("\nDate: "); Serial.print(mnth, DEC); Serial.print("/");
Serial.print(dy, DEC); Serial.print("/"); Serial.print(yr);
Serial.print(" \nTime: "); Serial.print(hr, DEC); Serial.print(":");
Serial.print(minu, DEC); Serial.print(":"); Serial.print(sec, DEC);
Serial.print("."); Serial.println(hundredths, DEC);
Serial.print("Altitude(metres): "); Serial.println(gps.f_altitude());
Serial.print("Speed(kmph): "); Serial.println(gps.f_speed_kmph());
Serial.println();
logs = SD.open("datalogs.csv", FILE_WRITE); //откройте файл datalog на SD-карте. Если его нет на карте, создайте его.
if(logs){//Start writing data to SD Card
Serial.print("Writing to datalogs...");
logs.println("\nLatitude: "); logs.print(latitude);
logs.print("\nLongitude: "); logs.print(longitude);
logs.print("\nDate: "); logs.print(mnth, DEC); logs.print("/");
logs.print(dy, DEC); logs.print("/"); logs.print(yr);
logs.print(" \nTime: "); logs.print(hr, DEC); logs.print(":");
logs.print(minu, DEC); logs.print(":"); logs.print(sec, DEC);
logs.print("."); logs.println(hundredths, DEC);
logs.print("Altitude(metres): "); logs.println(gps.f_altitude());
logs.print("Speed(kmph): "); logs.println(gps.f_speed_kmph());
logs.print("\n");
logs.println();
logs.close(); //close the file
Serial.println("done.");
Serial.println("\n");
}
else{
Serial.println("Error opening file.");
}
unsigned long chars;
unsigned short sentences, failed_checksum;
gps.stats(&chars, &sentences, &failed_checksum);
}
@M.ar, 👍0
Обсуждение1 ответ
Вы пытаетесь сделать слишком много (операции с SD и последовательной печатью) в неподходящее время (прием символов GPS).
Большинство GPS - устройств отправляют несколько "предложений" в секунду в пакетном режиме. TinyGPS.encode
возвращает значение true
после каждого предложения, поэтому ваш код будет пытаться записывать несколько предложений в секунду на SD-карту. Но для открытия/записи/закрытия SD-карты (и печати на последовательный) требуется так много
времени, что входной буфер заполняется и переполняется. Вот подробное описание того, что происходит.
Вы должны подождать, пока не начнется "тихое время" GPS. Даже в этом случае у вас могут возникнуть проблемы, в зависимости от того, сколько данных вам нужно сохранить и распечатать.
Возможно, удастся заставить его работать с TinyGPS, но в конце концов я разочаровался и написал библиотеку NeoGPS, чтобы помочь решить эти проблемы. Он может быть настроен для сохранения только необходимых вам данных (с помощью файлов конфигурации), и его можно использовать для определения начала тихого времени (см. NMEAorder.ino и NMEAfused.ino). Он использует гораздо меньше оперативной памяти и занимает гораздо меньше времени для анализа символов GPS. Это будет важно, если вы попытаетесь добавить библиотеки Ethernet в скетч.
Если у вас все еще возникают проблемы с получением всей информации, записанной в спокойное время, вы можете использовать сопутствующую библиотеку (например, NeoSWSerial) для обработки символов GPS во время прерывания RX.
Независимо от этого, я бы предложил заменить SoftwareSerial
на NeoSWSerial
. Это тоже намного эффективнее, чем программное обеспечение-убийца процессора
. Это не решит основную проблему, но она окупится позже.
Было бы все еще слишком много, если бы я просто вынул записи на последовательный монитор и просто оставил записи sd там?, @M.ar
@M.ar, да, все еще слишком много. Ссылки (синий текст) в моем ответе описывают, что происходит и как заставить это работать., @slash-dev
Я попытался запустить пример NMEA, используя SoftwareSerial для определения порта gps, и там написано "Исключение java.io.IOException: Доступ запрещен..", @M.ar
Неважно. Понял, что я сделал не так. Я постараюсь писать в спокойное время. Я дам тебе знать, как это будет., @M.ar
Быстрый вопрос. На что мне установить трассировку, если я не хочу, чтобы она была серийной? В этом случае я хочу, чтобы вывод шел на SD-карту., @M.ar
@M.ar, ссылка "трассировка" на самом деле просто взята из примеров программ. Действительно ли примеры печатают его в нужном вам формате? За исключением "trace_header", вы можете перенаправить пример печати следующим образом: sdFile << исправить;
или sdFile << gps.fix();
Это предусмотрено Streamers.CPP. Вы также можете вырезать и вставлять *из* стримеров в свой собственный скетч, что позволит вам изменять порядок, добавлять свои собственные переменные или что-то еще., @slash-dev
Кроме того, могу я спросить, почему библиотека NEOGPS объединяет дату и время? Я спрашиваю на всякий случай, если я действительно смогу разделить их для использования в будущем., @M.ar
Я попробовал SDF-файл << gps.fix() и я понял, что если SD-файл в формате .csv, сохраненные данные не будут включать дату и часовую часть даты и времени; только минуту и секунду. Если данные хранятся в формате .txt, в них есть все., @M.ar
@M.ar, Да, структура NeoGPS::Time содержит информацию как о дате, так и о времени. Вы можете получить доступ к частям по отдельности. Посмотрим Время.h строка 79 и/или Время.Строка CPP 25., @slash-dev
@M.ar, имя файла SD (.CSV или .TXT) не влияет на то, что будет записано. Возможно, вам следует отредактировать свой вопрос и вставить раздел ОБНОВЛЕНИЯ в конце с вашим новым кодом. Как и прежде, выберите код и нажмите ^K. И если у вас есть какие-то данные с SD-карты, вставьте их в другой раздел кода выше (отредактируйте свое местоположение)., @slash-dev
- GPS-модуль uBlox Neo 6M не отвечает
- Как отправить данные из Arduino Uno с SIM900 GPRS в Firebase
- Ошибка инициализации GPS DFRobot [Arduino Uno, SIM808]
- GPS не определяется на модуле SIM808!
- TinyGPS не дает долготу, широту и другие данные
- последовательная передача данных на GPS-экране duinopeak
- GSM и GPS-модуль не работают вместе
- как заставить щит GPRS/GSM SIM900 работать с модулем gps neo-6M с помощью платы Arduino UNO
Пожалуйста, предоставьте схемы и конфигурацию/настройку вашего скетча. Также включите ссылки на библиотеки, которые вы используете --- и я уверен, что скоро у вас будут руки помощи., @Mikael Patel
[ссылка](https://github.com/mikalhart/TinyGPS) для библиотеки TinyGPS [ссылка](http://arduiniana.org/libraries/newsoftserial/) для библиотеки NewSoftSerial. И для схем, я еще не нарисовал ни одного, но я использую SD-порт Arduino Ethernet в качестве моего SD-экрана. RX-контакт моего GPS-приемника Skytraq подключен к контакту 2 на arduino ethernet, а TX-к контакту 3 на Ethernet. (Ethernet TX/RX был установлен на вывод 3 и 2 соответственно.), @M.ar
Пожалуйста, обновите этот вопрос вместо этого. И не забудьте добавить хотя бы код настройки/конфигурации., @Mikael Patel
Прости, я ошибся. Я обновил вопрос и включил свой код., @M.ar
Пожалуйста, используйте формат кода. Отредактируйте и используйте кнопку code {}., @Mikael Patel
Я использовал формат кода. Может ли кто-нибудь помочь сейчас? Я все еще пытаюсь решить эту проблему, но у меня ничего не получается., @M.ar
Почему вы дважды вызываете " SD.begin ()"? Предоставьте образец результатов, которые вы получите, с SD-картой и без нее. Кроме того, вы используете этот же скетч, когда карта не вставлена?, @SoreDakeNoKoto
Добавьте ссылку на GPS-модуль. Это 3,3 В? И являются ли последовательные сигналы логикой 3,3 В? Никаких подробностей, никакой помощи., @Mikael Patel
К сожалению, я не могу опубликовать эту ссылку, потому что у меня не более 10 репутаций, но я упомянул GPS-модуль в обновленном вопросе. Кроме того, я звоню в СД.начни только один раз. Другой оператор begin является Serial.begin., @M.ar