2015-11-04 84 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); 
}