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);
}

, 👍0

Обсуждение

Пожалуйста, предоставьте схемы и конфигурацию/настройку вашего скетча. Также включите ссылки на библиотеки, которые вы используете --- и я уверен, что скоро у вас будут руки помощи., @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


1 ответ


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