• Witaj na Forum Arduino Polska! Zapraszamy do rejestracji!
  • Znajdziesz tutaj wiele informacji na temat hardware / software.
Witaj! Logowanie Rejestracja


Ocena wątku:
  • 0 głosów - średnia: 0
  • 1
  • 2
  • 3
  • 4
  • 5
Zegar GPS
#1
Witam.
Próbuję uruchomić zegar ustawiany za pomocą danych z GPS. Mój GPS to ublox NEO-6M-0-001.
Znalazłem takie coś https://www.electronicsblog.net/arduino-...-protocol/
kod po zmianach:
Kod:
//For more info please visit http://www.electronicsblog.net
// Arduino GPS clock
#include <SoftwareSerial.h>
//#include <LiquidCrystal.h>
#include <Wire.h>
#include <LiquidCrystal_I2C.h>

unsigned char incomingByte = 0;
unsigned char dot_count = 0;

unsigned int c=0;

boolean show=false;

unsigned int hour;
unsigned int minute;
unsigned int second;

unsigned int day;
unsigned int month;
unsigned int year;

unsigned int GPS_position_fix_indicator=0;
unsigned int GPS_sat_used;


unsigned char GGA_id[7]={
 '$','G','P','G','G','A',','};
 
unsigned char ZDA_id[7]={
 '$','G','P','Z','D','A',','};
 
unsigned char buffer[100];  

#define BACKLIGHT_PIN 3
LiquidCrystal_I2C  lcd(0x27,2,1,0,4,5,6,7);

// LiquidCrystal lcd(12, 11, 5, 4, 3, 2);

void show_time_date(void) {

hour = (((int)buffer[0]&0x0F)*10)+((int)buffer[1]&0x0F);
 minute = (((int)buffer[2]&0x0F)*10)+((int)buffer[3]&0x0F);
  second  = (((int)buffer[4]&0x0F)*10)+((int)buffer[5]&0x0F);
 
   day = (((int)buffer[10]&0x0F)*10)+((int)buffer[11]&0x0F);
 month = (((int)buffer[13]&0x0F)*10)+((int)buffer[14]&0x0F);
  year  = (((int)buffer[16]&0x0F)*1000)+(((int)buffer[17]&0x0F)*100)+(((int)buffer[18]&0x0F)*10)+(((int)buffer[17]&0x0F));
 
 
   lcd.setCursor(0, 0);
 
  lcd.print("UCT time ");
 
 if (show||GPS_position_fix_indicator) { //blinking display
  if (hour<10) lcd.print(' ');
  lcd.print(hour);
  lcd.print(":");
   if (minute<10) lcd.print('0');
  lcd.print(minute);
  lcd.print(":");
   if (second<10) lcd.print('0');
  lcd.print(second); }
    else lcd.print("        ");
 
 
 
   lcd.setCursor(0, 1);
 
  lcd.print("Date     ");
  if (show||GPS_position_fix_indicator) { //blinking display
   
  lcd.print(year);
  lcd.print("-");
   if (month<10) lcd.print('0');
  lcd.print(month);
  lcd.print("-");
   if (day<10) lcd.print('0');
  lcd.print(day);
  }
    else lcd.print("          ");


show=!show; //blinking display
}

void show_status (void) {

     
GPS_position_fix_indicator = (int)(buffer[36]&0x0F);
GPS_sat_used = (((int)buffer[38]&0x0F)*10)+((int)buffer[39]&0x0F);
         
     
   
    lcd.setCursor(0, 2);
    lcd.print("                    ");
    lcd.setCursor(0, 2);    
    switch (GPS_position_fix_indicator) {
    case 0:  lcd.print("Wait for GPS fix");
             for (int i=0;i<dot_count;i++) {
             lcd.print(".");
             }      
             lcd.setCursor(0,3);
             lcd.print("Sat. used: ");
             lcd.print(GPS_sat_used);
             dot_count++;
             if (dot_count >3) dot_count=0;
             break;
               
    case 1:  lcd.print("GPS fix OK");
             lcd.setCursor(0, 3);
           lcd.print("Sat. used: ");
             lcd.print(GPS_sat_used);
             break;
     
    case 2:  lcd.print("DGPS fix OK");
             lcd.setCursor(0, 3);
          lcd.print("Sat. used: ");
             lcd.print(GPS_sat_used);
             break;          
     
  }
 
}

void fill_buffer (void) {

 while (Serial.available()) {
   
       buffer[c++] =Serial.read();
       if (buffer [c]==0x0D) {Serial.flush();}
       

  }
}

void setup()  {

 lcd.begin(20, 4);
 lcd.setCursor(0,0);
 lcd.print("Initialising...");
 
 
// Serial.begin(4800);
 Serial.begin(38400);
 //disable automatics messages
 
 delay(10);
 Serial.print("$PSRF103,00,00,00,01*24"); //GGA
 Serial.print(0x0D);
 Serial.print(0x0A);
 delay(10);
 Serial.print("$PSRF103,01,00,00,01*25"); //GLL
 Serial.print(0x0D);
 Serial.print(0x0A);
 delay(10);
 Serial.print("$PSRF103,02,00,00,01*26"); //GSA
 Serial.print(0x0D);
 Serial.print(0x0A);
 delay(10);
 Serial.print("$PSRF103,03,00,00,01*27"); //GSV
 Serial.print(0x0D);
 Serial.print(0x0A);
 delay(10);
 Serial.print("$PSRF103,04,00,00,01*20"); //RMC
 Serial.print(0x0D);
 Serial.print(0x0A);
 delay(10);
 Serial.print("$PSRF103,05,00,00,01*21"); //VTG
 Serial.print(0x0D);
 Serial.print(0x0A);
 delay(10);
 Serial.print("$PSRF103,06,00,00,01*22"); //MSS
 Serial.print(0x0D);
 Serial.print(0x0A);
 delay(10);
 Serial.print("$PSRF103,07,00,00,01*23"); ///////ZDA
 Serial.print(0x0D);
 Serial.print(0x0A);
   delay(10);

/////////////////////////////////////////ZDA

Serial.print("$PSRF103,07,00,01,01*22");
 Serial.print(0x0D);
 Serial.print(0x0A);
   delay(10);

////////////////////////////////////// GGA


Serial.print("$PSRF103,00,00,01,01*25");
 Serial.print(0x0D);
 Serial.print(0x0A);
   delay(10);
   
 lcd.setCursor(0,1);
 lcd.print("Wait for GPS...");  

}


void loop () {
 
c=0;

int valid_ZDA=7;
int valid_GGA=7;
boolean valid_msg=false;
 
 if (Serial.available() > 20) {



   for (int i=0;i<7;i++) {    
     incomingByte =Serial.read();

   

     if (incomingByte==ZDA_id[i]) {
       valid_ZDA--;
       valid_msg=true;          
         
     }
     
     if (incomingByte==GGA_id[i]) {
       valid_GGA--;
       valid_msg=true;      
     }      
     
   
     
     if(!valid_msg) {i=7;} // break from "if" loop
   }    
 
   if (valid_ZDA==0) {
         
    while (Serial.available()<25) {delay(10);}  
         
     
     fill_buffer();    
           
     show_time_date();  
 

 
 }  ///  (valid_ZDA==0) {
   
     if (valid_GGA==0) {
   
     while (Serial.available()<40) {delay(10);}
     fill_buffer();
 //    show_status();              
     
    }
     
   
 
 }
 
}

Serial begin mam 38400, z taką prędkością łączę się z gpsem za pomocą u-center
Gps łapie fixa
jednak na wyświetlaczu mam tylko initialising... i Wait for GPS ...
Oryginalny program miał problem przy kompilacji z wszystkimi liniami serial print np
Serial.print(0x0D,BYTE)
próbowałem 
serial.write(0x0D)
i
serial.print(0x0D)
Proszę o pomoc w rozwiązaniu problemu
 
Odpowiedź
#2
I się nie dogada ponieważ ublox ma swój specyficzny protokół , więc albo zmienisz w programie sposób komunikacji ze standardowego NMEA na ublox albo wymienisz moduł GPS na "normalny" np. GPS-GMS-G9 pracujący standardowym protokole NMEA .
Ważne aby robić co się lubi albo lubić co się robi .
Arduino UNO, TINY, PRO MINI
Pomoc nagradzamy punktami reputacji Wink
 
Odpowiedź
#3
Pomóżcie z tym tematem.
Próbowałem już wielu rozwiązań i nie mogę nic wyciągnąć z tego modułu
Ostatnio znalazłem bibliotekę  TinyGPS która powinna gadać z ublox ale niestety nie chce mi to działać
Program wygląda tak:
Kod:
#include <TinyGPS++.h>
#include <SoftwareSerial.h>
/*
  This sample sketch demonstrates the normal use of a TinyGPS++ (TinyGPSPlus) 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).
*/
static const int RXPin = 4, TXPin = 3;
static const uint32_t GPSBaud = 38400;

// The TinyGPS++ object
TinyGPSPlus gps;

// The serial connection to the GPS device
SoftwareSerial ss(RXPin, TXPin);

void setup()
{
 Serial.begin(115200);
 ss.begin(GPSBaud);

 Serial.println(F("DeviceExample.ino"));
 Serial.println(F("A simple demonstration of TinyGPS++ with an attached GPS module"));
 Serial.print(F("Testing TinyGPS++ library v. ")); Serial.println(TinyGPSPlus::libraryVersion());
 Serial.println(F("by Mikal Hart"));
 Serial.println();
}

void loop()
{
 // This sketch displays information every time a new sentence is correctly encoded.
 while (ss.available() > 0)
   if (gps.encode(ss.read()))
     displayInfo();

 if (millis() > 5000 && gps.charsProcessed() < 10)
 {
   Serial.println(F("No GPS detected: check wiring."));
   while(true);
 }
}

void displayInfo()
{
 Serial.print(F("Location: "));
 if (gps.location.isValid())
 {
   Serial.print(gps.location.lat(), 6);
   Serial.print(F(","));
   Serial.print(gps.location.lng(), 6);
 }
 else
 {
   Serial.print(F("INVALID"));
 }

 Serial.print(F("  Date/Time: "));
 if (gps.date.isValid())
 {
   Serial.print(gps.date.month());
   Serial.print(F("/"));
   Serial.print(gps.date.day());
   Serial.print(F("/"));
   Serial.print(gps.date.year());
 }
 else
 {
   Serial.print(F("INVALID"));
 }

 Serial.print(F(" "));
 if (gps.time.isValid())
 {
   if (gps.time.hour() < 10) Serial.print(F("0"));
   Serial.print(gps.time.hour());
   Serial.print(F(":"));
   if (gps.time.minute() < 10) Serial.print(F("0"));
   Serial.print(gps.time.minute());
   Serial.print(F(":"));
   if (gps.time.second() < 10) Serial.print(F("0"));
   Serial.print(gps.time.second());
   Serial.print(F("."));
   if (gps.time.centisecond() < 10) Serial.print(F("0"));
   Serial.print(gps.time.centisecond());
 }
 else
 {
   Serial.print(F("INVALID"));
 }

 Serial.println();
}
 
Odpowiedź
#4
Zobaczę czy znajomy ma ubloxa to coś ruszy ale nie obiecuję bo wyprzedawał i nie wiem czy jeszcze ma . Tak czy siak jeżeli ma to tylko być do ustawiania zegarka to bardziej polecam http://elty.pl/pl/p/Odbiornik-DCF77-z-uk...AS6180/154
Ważne aby robić co się lubi albo lubić co się robi .
Arduino UNO, TINY, PRO MINI
Pomoc nagradzamy punktami reputacji Wink
 
Odpowiedź
#5
DCF-77 niestety jest bardzo podatny na zakłócenia, dlatego kombinuję z GPS. Poza tym mam moduł i szkoda żeby się marnował.
 
Odpowiedź
#6
No panie zbyszku a dataszita to pan z ubloxa nie poczytał , podpowiem tylko że ustawienie stanu wysokiego na piny CFG_COM0 i CFG_COM1 spowoduje przejście ubloxa z trybu UBX na NMEA GSV, RMC, GSA, GGA, GLL, VTG, TXT czyli normalny standard z prędkością 9600 . Poniżej załączam materiały do poczytania przed snem .

https://www.u-blox.com/sites/default/fil...005%29.pdf
Ważne aby robić co się lubi albo lubić co się robi .
Arduino UNO, TINY, PRO MINI
Pomoc nagradzamy punktami reputacji Wink
 
Odpowiedź
#7
Wg tabeli z punktu 1.15.1 chyba mam ustawioną opcję z wiersza drugiego.

CFG_COM1 CFG_COM0 Protocol Messages UARTBaud rate USB power
1 1 NMEA GSV, RMC, GSA, GGA, GLL, VTG, TXT 9600 BUS Powered
1 0 NMEA GSV, RMC, GSA, GGA, GLL, VTG, TXT 38400 Self Powered
0 1 NMEA GSV14, RMC, GSA, GGA, VTG, TXT 4800 BUS Powered
0 0 UBX NAV-SOL, NAV-STATUS, NAV-SVINFO,
NAV-CLOCK,INF, MON-EXCEPT, AID-ALPSERV 57600 BUS Powered

Standard NMEA wychodzi że jest ten sam różnica jest tylko w prędkości UART.
Mój działa na prędkości 38400 tak się łączy z u-center i tym się wcześniej sugerowałem że standard jest OK
 
Odpowiedź
#8
Software serial poprawnie działa chyba do 19200 później ma problemy z tego co pamiętam. Spròbuj między 2 arduino do jakiej prędkości będzie poprawnie działał.
Ważne aby robić co się lubi albo lubić co się robi .
Arduino UNO, TINY, PRO MINI
Pomoc nagradzamy punktami reputacji Wink
 
Odpowiedź
#9
Jeszcze jedno pytanie. Jakiego polecenia użyć aby zmienić parametr CFG_COM0 i CFG_COM1 ?
 
Odpowiedź
#10
Fizyczna zwora na te piny do zasilania 3,3V chyba
Ważne aby robić co się lubi albo lubić co się robi .
Arduino UNO, TINY, PRO MINI
Pomoc nagradzamy punktami reputacji Wink
 
Odpowiedź
  


Skocz do:


Przeglądający: 1 gości