Несколько месяцев назад я купил GPS-модуль SKM53. Я очень старался заставить его работать, но ничего не мог из него получить. Я думал, что это неисправность устройства (на самом деле я думал, что сжег его, неправильно подав питание) . Поэтому я не стал долго раздумывать и заказал еще один ( здесь ).
Сегодня получил второй модуль (такой же, SKM53). Ну.. что-то не так, она ведет себя точно так же, как и предыдущая! Я не знаком с модулем, но подумал, что это что-то простое в использовании. Я тестировал с помощью примера скетча «simple_test», который поставляется с базовой библиотекой arduino, TinyGPS (см. ниже). При наблюдении за последовательным монитором все значения равны нулю. Кроме того, по-видимому, светодиод (как я предполагал) рядом с «1206» (см. Изображение) не горит.
Значит ли это, что модуль не работает? Надеюсь, что нет, что я могу сделать, чтобы заставить его работать? (Я тестировал на открытой местности, где ясно видно небо.)
Эскиз (простой_тест)
#include <SoftwareSerial.h>
#include <TinyGPS.h>
/* This sample code demonstrates the normal use of a TinyGPS object.
It requires the use of SoftwareSerial, and assumes that you have a
4800-baud serial GPS device hooked up on pins 10(rx) and 11(tx).
*/
TinyGPS gps;
SoftwareSerial ss(10, 11);
void setup()
{
Serial.begin(9600);
ss.begin(4800);
Serial.print("Simple TinyGPS library v. ");
Serial.println(TinyGPS::library_version());
Serial.println("by Mikal Hart");
Serial.println();
}
void loop()
{
bool newData = false;
unsigned long chars;
unsigned short sentences, failed;
// For one second we parse GPS data and report some key values
for (unsigned long start = millis(); millis() - start < 1000;)
{
while (ss.available())
{
char c = ss.read();
// Serial.write(c); // uncomment this line if you want to see the GPS data flowing
if (gps.encode(c)) // Did a new valid sentence come in?
newData = true;
}
}
if (newData)
{
float flat, flon;
unsigned long age;
gps.f_get_position(&flat, &flon, &age);
Serial.print("LAT=");
Serial.print(flat == TinyGPS::GPS_INVALID_F_ANGLE ? 0.0 : flat, 6);
Serial.print(" LON=");
Serial.print(flon == TinyGPS::GPS_INVALID_F_ANGLE ? 0.0 : flon, 6);
Serial.print(" SAT=");
Serial.print(gps.satellites() == TinyGPS::GPS_INVALID_SATELLITES ? 0 : gps.satellites());
Serial.print(" PREC=");
Serial.print(gps.hdop() == TinyGPS::GPS_INVALID_HDOP ? 0 : gps.hdop());
}
gps.stats(&chars, &sentences, &failed);
Serial.print(" CHARS=");
Serial.print(chars);
Serial.print(" SENTENCES=");
Serial.print(sentences);
Serial.print(" CSUM ERR=");
Serial.println(failed);
}
Наблюдаемый результат
Simple TinyGPS library v. 12
by Mikal Hart
CHARS=0 SENTENCES=0 CSUM ERR=0
CHARS=0 SENTENCES=0 CSUM ERR=0
CHARS=0 SENTENCES=0 CSUM ERR=0
CHARS=0 SENTENCES=0 CSUM ERR=0
CHARS=0 SENTENCES=0 CSUM ERR=0
CHARS=0 SENTENCES=0 CSUM ERR=0
CHARS=0 SENTENCES=0 CSUM ERR=0
CHARS=0 SENTENCES=0 CSUM ERR=0
CHARS=0 SENTENCES=0 CSUM ERR=0
РЕДАКТИРОВАТЬ
Это рабочий код, который я использовал, отредактировав пример, поставляемый с TinyGPS
lib. Использует аппаратный серийный номер USART1 вместо программного серийного номера.
#include <SoftwareSerial.h>
#include <TinyGPS.h>
/* This sample code demonstrates the normal use of a TinyGPS object.
It requires the use of SoftwareSerial, and assumes that you have a
4800-baud serial GPS device hooked up on pins 3(rx) and 4(tx).
*/
TinyGPS gps;
static void gpsdump(TinyGPS &gps);
static bool feedgps();
static void print_float(float val, float invalid, int len, int prec);
static void print_int(unsigned long val, unsigned long invalid, int len);
static void print_date(TinyGPS &gps);
static void print_str(const char *str, int len);
void setup()
{
Serial1.begin(9600); //GPS module is connected to USART1
Serial.begin(9600);
Serial.print("Testing TinyGPS library v. ");
Serial.println(TinyGPS::library_version());
Serial.println("by Mikal Hart");
Serial.println();
Serial.print("Sizeof(gpsobject) = ");
Serial.println(sizeof(TinyGPS));
Serial.println();
Serial.println("Sats HDOP Latitude Longitude Fix Date Time Date Alt Course Speed Card Distance Course Card Chars Sentences Checksum");
Serial.println(" (deg) (deg) Age Age (m) --- from GPS ---- ---- to London ---- RX RX Fail");
Serial.println("--------------------------------------------------------------------------------------------------------------------------------------");
}
void loop()
{
bool newdata = false;
unsigned long start = millis();
// Every second we print an update
while (millis() - start < 1000)
{
if (feedgps())
newdata = true;
}
gpsdump(gps);
}
static void gpsdump(TinyGPS &gps)
{
float flat, flon;
unsigned long age, date, time, chars = 0;
unsigned short sentences = 0, failed = 0;
static const float LONDON_LAT = 51.508131, LONDON_LON = -0.128002;
print_int(gps.satellites(), TinyGPS::GPS_INVALID_SATELLITES, 5);
print_int(gps.hdop(), TinyGPS::GPS_INVALID_HDOP, 5);
gps.f_get_position(&flat, &flon, &age);
print_float(flat, TinyGPS::GPS_INVALID_F_ANGLE, 9, 5);
print_float(flon, TinyGPS::GPS_INVALID_F_ANGLE, 10, 5);
print_int(age, TinyGPS::GPS_INVALID_AGE, 5);
print_date(gps);
print_float(gps.f_altitude(), TinyGPS::GPS_INVALID_F_ALTITUDE, 8, 2);
print_float(gps.f_course(), TinyGPS::GPS_INVALID_F_ANGLE, 7, 2);
print_float(gps.f_speed_kmph(), TinyGPS::GPS_INVALID_F_SPEED, 6, 2);
print_str(gps.f_course() == TinyGPS::GPS_INVALID_F_ANGLE ? "*** " : TinyGPS::cardinal(gps.f_course()), 6);
print_int(flat == TinyGPS::GPS_INVALID_F_ANGLE ? 0UL : (unsigned long)TinyGPS::distance_between(flat, flon, LONDON_LAT, LONDON_LON) / 1000, 0xFFFFFFFF, 9);
print_float(flat == TinyGPS::GPS_INVALID_F_ANGLE ? 0.0 : TinyGPS::course_to(flat, flon, 51.508131, -0.128002), TinyGPS::GPS_INVALID_F_ANGLE, 7, 2);
print_str(flat == TinyGPS::GPS_INVALID_F_ANGLE ? "*** " : TinyGPS::cardinal(TinyGPS::course_to(flat, flon, LONDON_LAT, LONDON_LON)), 6);
gps.stats(&chars, &sentences, &failed);
print_int(chars, 0xFFFFFFFF, 6);
print_int(sentences, 0xFFFFFFFF, 10);
print_int(failed, 0xFFFFFFFF, 9);
Serial.println();
}
static void print_int(unsigned long val, unsigned long invalid, int len)
{
char sz[32];
if (val == invalid)
strcpy(sz, "*******");
else
sprintf(sz, "%ld", val);
sz[len] = 0;
for (int i=strlen(sz); i<len; ++i)
sz[i] = ' ';
if (len > 0)
sz[len-1] = ' ';
Serial.print(sz);
feedgps();
}
static void print_float(float val, float invalid, int len, int prec)
{
char sz[32];
if (val == invalid)
{
strcpy(sz, "*******");
sz[len] = 0;
if (len > 0)
sz[len-1] = ' ';
for (int i=7; i<len; ++i)
sz[i] = ' ';
Serial.print(sz);
}
else
{
Serial.print(val, prec);
int vi = abs((int)val);
int flen = prec + (val < 0.0 ? 2 : 1);
flen += vi >= 1000 ? 4 : vi >= 100 ? 3 : vi >= 10 ? 2 : 1;
for (int i=flen; i<len; ++i)
Serial.print(" ");
}
feedgps();
}
static void print_date(TinyGPS &gps)
{
int year;
byte month, day, hour, minute, second, hundredths;
unsigned long age;
gps.crack_datetime(&year, &month, &day, &hour, &minute, &second, &hundredths, &age);
if (age == TinyGPS::GPS_INVALID_AGE)
Serial.print("******* ******* ");
else
{
char sz[32];
sprintf(sz, "%02d/%02d/%02d %02d:%02d:%02d ",month, day, year, hour, minute, second);
Serial.print(sz);
}
print_int(age, TinyGPS::GPS_INVALID_AGE, 5);
feedgps();
}
static void print_str(const char *str, int len)
{
int slen = strlen(str);
for (int i=0; i<len; ++i)
Serial.print(i<slen ? str[i] : ' ');
feedgps();
}
static bool feedgps()
{
while(Serial1.available()>0)
{
char c= Serial1.read();
if (gps.encode(c))
return true;
}
return false;
}
Сначала вам лучше обновить IDE до последней версии (если вы еще этого не сделали). В предыдущих IDE есть некоторые ошибки.
Поскольку вы используете Arduino mega, вы должны проверить SoftwareSerial
документы библиотеки и выяснить, какие выводы можно использовать в Mega. Как упоминалось в одном из комментариев, в библиотеке есть некоторые ограничения. (вы не сможете напрямую использовать примеры, поставляемые с IDE, поскольку они используют контакты D2, D3, которые не поддерживаются в Mega)
Однако в Mega много модулей USART. Почему бы не использовать аппаратный серийный номер вместо виртуальных?
У меня была такая же проблема с этим модулем. Это может быть полезно.
SoftwareSerial
библиотекой, как некоторые люди предположили выше, она не поддерживает некоторые контакты Arduino Mega. После замены Tx
пина на 10 все заработало. Спасибо за поддержку в любом случае!Попробуйте использовать скорость 9600 бод. У меня получилось, но с некоторыми ограничениями. Он случайным образом отбрасывает некоторые части предложений (возможно, из-за того, что я использую SoftwareSerial/NewSoftwareSerial. Увеличение размера буфера SoftwareSerial, похоже, не помогает).
Я нашел этот пост очень полезным, может быть, вы тоже. http://hotresistor.blogspot.com/2014/11/arduino-interfacing-with-gps-tutorial.html
Попробуйте подключить GPS с помощью внешнего регулятора напряжения, используя конфигурацию по следующей ссылке http://competefornothing.com/l7805-voltage-regulator-for-arduino-5v-1amp/
Джиппи
Джиппи
Кенни
Густаво Литовски
Анубис
Анубис
Густаво Литовски
Джиппи
Кенни
Анубис
Анубис
Кенни
Анубис
Кенни
пользователь 20700
Анубис