2015-11-04 85 views
0

我正在开展一个跟踪项目。我将TinyDuino Processor Bd与TinyGPS shield一起使用。为了测试GPS屏蔽,我使用库TinyGPS和TinyGPS ++来尝试所有可能的代码。他们都失败了,并给了我输出0或不可解释的输出。这里有一些代码,我尝试了输出。 代码1: 的#includeTinyGps没有数据

static const int GPS_ONOFFPin = A3; 
    static const int GPS_SYSONPin = A2; 
    static const int GPS_RXPin = A1; 
    static const int GPS_TXPin = A0; 
    static const int GPSBaud = 9600; 
    static const int chipSelect = 10; 

    // The GPS connection is attached with a software serial port 
    SoftwareSerial Gps_serial(GPS_RXPin, GPS_TXPin); 

    int led = 13; 

    void setup() 
    { 
    // Init the GPS Module to wake mode 
    pinMode(GPS_SYSONPin, INPUT); 
    pinMode(GPS_ONOFFPin, OUTPUT); 
    digitalWrite(GPS_ONOFFPin, LOW); 
    delay(5); 
    if(digitalRead(GPS_SYSONPin) == LOW) 
    { 
     // Need to wake the module 
     digitalWrite(GPS_ONOFFPin, HIGH); 
     delay(5); 
     digitalWrite(GPS_ONOFFPin, LOW);  
    } 

     // Open serial communications and wait for port to open: 
     Serial.begin(9600); 
     pinMode(led, OUTPUT);  
    Gps_serial.begin(9600); 
    } 

    void loop() 
    { 
     if (Gps_serial.available()) 
      Serial.write(Gps_serial.read()); 
    } 

Code 1 output:

第二代码: 的#include 的#include

/* 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 4(rx) and 3(tx). 
    */ 

    TinyGPS gps; 
    SoftwareSerial ss(4, 3); 

    static void smartdelay(unsigned long ms); 
    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() 
    { 
     Serial.begin(115200); 

     Serial.print("Testing TinyGPS library v. ");     

    Serial.println(TinyGPS::library_version()); 
     Serial.println("by Mikal Hart"); 
     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("-------------------------------------------------------- 
    -------------------------------------------------------------------------- 
    ---"); 

     ss.begin(4800); 
    } 

    void loop() 
    { 
     float flat, flon; 
     unsigned long age, date, time, chars = 0; 
     unsigned short sentences = 0, failed = 0; 
     static const double 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, 10, 6); 
     print_float(flon, TinyGPS::GPS_INVALID_F_ANGLE, 11, 6); 
     print_int(age, TinyGPS::GPS_INVALID_AGE, 5); 
     print_date(gps); 
     print_float(gps.f_altitude(), TinyGPS::GPS_INVALID_F_ALTITUDE, 7, 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 ? 0xFFFFFFFF : (unsigned long)TinyGPS::distance_between(flat, flon, LONDON_LAT, LONDON_LON)/1000, 0xFFFFFFFF, 9); 
     print_float(flat == TinyGPS::GPS_INVALID_F_ANGLE ? TinyGPS::GPS_INVALID_F_ANGLE   : TinyGPS::course_to(flat, flon, LONDON_LAT, LONDON_LON),   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(); 

       smartdelay(1000); 
      } 

    static void smartdelay(unsigned long ms) 
    { 
     unsigned long start = millis(); 
     do 
     { 
     while (ss.available()) 
      gps.encode(ss.read()); 
     } while (millis() - start < ms); 
    } 

    static void print_float(float val, float invalid, int len, int prec) 
    { 
     if (val == invalid) 
     { 
     while (len-- > 1) 
      Serial.print('*'); 
     Serial.print(' '); 
     } 
     else 
     { 
     Serial.print(val, prec); 
     int vi = abs((int)val); 
     int flen = prec + (val < 0.0 ? 2 : 1); // . and - 
     flen += vi >= 1000 ? 4 : vi >= 100 ? 3 : vi >= 10 ? 2 : 1; 
     for (int i=flen; i<len; ++i) 
      Serial.print(' '); 
       } 
       smartdelay(0); 
      } 

    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); 
     smartdelay(0); 
    } 

    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); 
     smartdelay(0); 
    } 

    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] : ' '); 
     smartdelay(0); 
    } 

Code 2 Output:

+0

可能会出现的一个问题:在外面打开以获取传感器的卫星信号。 –

回答

0

代码1确认该GPS设备正在A0/A1在9600波特。 /dev/cu.usbserial-DN00CT3C窗口显示良好的NMEA句子被回显。但它没有良好的卫星接收......所有的场都是零值或空的。

代码2显示TinyGPS示例没有收到任何字符。这是因为它试图引脚使用 3.更改它

SoftwareSerial ss(A1, A0); 

您还可能有兴趣在一个更有效的图书馆,NeoGPS。它可以配置为仅处理您使用的消息和字段。一切都被忽略了,节省了RAM和处理时间。

0

GPS TX引脚转到Arduino RX piN,同样,GPS RX引脚转到Arduino TX引脚。对于第二个代码,GPS波特率在说明中给出为4800。在serial.begin和ss.begin中尝试使用9600的波特率。

您可能必须在室外或至少靠近GPS设备从卫星接收的某些窗口附近。第一次修复可能需要15分钟。

#include <SoftwareSerial.h> 
#include <TinyGPS.h> 

TinyGPS gps; 
SoftwareSerial ss(3,4); 


static void smartdelay(unsigned long ms); 
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); 

void setup() 
{ 
    Serial.begin(9600); 
    ss.begin(9600); 
} 

void loop() 
{ 
    float flat, flon; 
    unsigned short sentences = 0, failed = 0; 

    gps.f_get_position(&flat, &flon); 

    Serial.print("LATITUDE: "); 
    print_float(flat, TinyGPS::GPS_INVALID_F_ANGLE, 10, 6); 
    Serial.println(" "); 

    Serial.print("LONGITUDE: "); 
    print_float(flon, TinyGPS::GPS_INVALID_F_ANGLE, 11, 6); 
    Serial.println(" "); 

    Serial.print("altitude: "); 
    print_float(gps.f_altitude(), TinyGPS::GPS_INVALID_F_ALTITUDE, 7, 2); 
    Serial.println(" "); 

    Serial.print("COURSE:"); 
    print_float(gps.f_course(), TinyGPS::GPS_INVALID_F_ANGLE, 7, 2); 
    Serial.println(""); 

    Serial.print("DIRECTION: "); 
    int d; 
    print_str(gps.f_course() == TinyGPS::GPS_INVALID_F_ANGLE ? "*** " : TinyGPS::cardinal(gps.f_course()), 6); 
    d=gps.f_course(); 
    Serial.println(); 
    Serial.println(); 
    smartdelay(1000); 

} 

static void smartdelay(unsigned long ms) 
{ 
    unsigned long start = millis(); 
    do 
    { 
    while (ss.available()) 
     int val = gps.encode(ss.read()); 
    } while (millis() - start < ms); 
} 

static void print_float(float val, float invalid, int len, int prec) 
{ 
    if (val == invalid) 
    { 
    while (len-- > 1) 
     Serial.print('*'); 
    Serial.print(' '); 
    } 
    smartdelay(0); 
} 

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] : ' '); 
    smartdelay(0); 
}