GPS Modul Ublox GY-NEO-6M mit C programmieren?

L I V E Stammtisch ab 20:30 Uhr im Chat
  • hallo,
    weiß jemand, wie man das GPS Modul Ublox GY-NEO-6M mit C programmieren kann (per UART am Raspi)?
    http://www.ebay.de/itm/311296066259

    Bisher habe ich für den Raspi nur was mit einem GPS-Daemon gefunden, wo ich aber nicht sehe wie ich es in meine Programme integrieren kann.

    Für die Arduino IDE gibt es libs wie tinyGPSplus, die man einfach #includen und dann die Daten mit den üblichen UART Funktionen auslesen kann.
    https://github.com/mikalhart/TinyGPSPlus
    http://arduiniana.org/libraries/tinygpsplus/


    Gibt es vergleichbare Raspberry-libs für C und die Geany IDE?


    Einmal editiert, zuletzt von HaWe (17. Oktober 2015 um 12:04)

  • Hallo HaWe,

    zunächst einmal musst Du Dich entscheiden, ob Du das GPS-Modul an einem Raspberry Pi über UART (Pin TX/RX der GPIO-Leiste, 3V3-tolerant) oder über USB-Port (5V-tolerant betreiben willst.

    An dem von Dir favorisierten GPS-Modul befinden sich zwei Lötkleckse, die entsprechend kurzuschließen sind. So schreibt zumindest die Bedienungsanleitung.

    Dies würde ich anders machen.
    1. Ein Kabel anlöten (für 3V3-Kompatibilität)
    2. Ein Kabel anlöten (für 5V-Kompatibilität)

    Alternativ funktioniert auch, die die 5V-Lötbrücke zu setzen und die Signale über einen Spannungsteiler / Levelshifter auf 3V3-tolerante Signale zu verringern.
    Wenn Du das GPS-Modul immer über USB-Port betreiben möchtest, dann empfielht es sich, gleich eine USB-A-Buchse anzulöten.


    Zur Abfrage der GPS-Signale bedarf es keiner Library. Die paar Zeilen kannst Du selber programmieren - dabei lernst Du auch mehr wie den Umgang mit Geany, das Compilieren und die Programmierung von Schnittstellen, um das sich ein Großteil Deiner bisherigen Fragen immer wieder dreht.

    Als erstes fragst Du ab, was überhaupt an Signalen ankommen:

    Code
    cat /dev/ttyACM0
    Code
    cat /dev/ttyAMA0


    je nach dem, über welchen Anschluss Du das GPS-Modul angeschlossen hast

    Dann wirst Du erkennen, dass da zunächst einige Zeilen zur Identifizierung des GPS-Moduls gesendet werden. Dann wiederholen sich im Sekundentakt die gleichen Informationen. Hierbei handelt es sich um GPS-Daten in verschiedenen Formaten.

    Jedes GPS-Modul beherrscht den GPRMC-Standard. Somit reicht es, nur diese eine Zeile zu selektieren. Die anderen Zeilen enthalten redundante Informationen in anderen Formaten, die teilweise nicht dokumentiert sind - und man nur anhand der Ähnlichkeit zu Daten der $GPRMC-Zeile erahnen kann, um welcher Art Daten es sich handelt.

    Die einzelnen Parameter sind im entsprechenden Protokoll NMEA 01823 erschöpfend beschrieben. Hierbei handelt es sich um eine CSV-Liste der zur Verfügung gestellten Daten.

    Diese mit [font="Courier New"]$GPRMC[/font] beginnende Zeile musst Du solange auslesen, bis der Status A auf V wechselt. V steht dabei für vollständig - nicht valide!. Solange der Status auf A steht, wird kein hinreichend vollständiger GPS-Datensatz erzeugt.

    Weiterhin solltest prüfen, ob die Checksumme übereinstimmt - denn nur dann sind die Werte nicht nur vollständig, sondern auch valide.

    Ein kleiner Parser-Algorithmus ist z.B. der hier

    Code
    z ? {while put(gps, tab(upto(','))) do tab(many(',')); write(tab(0)) # Jeder Wert zwischen Komma in Liste gps eintragen
    } # Icon-Tutorial Teil 9 Zeile 64


    und schon stehen die vorher durch Komma getrennten GPS-Parameter in einer Liste, die dann ausgwertet werden können, wie Du lustig bist.

    Beste Grüße

    Andreas

    Ich bin wirklich nicht darauf aus, Microsoft zu zerstören. Das wird nur ein völlig unbeabsichtigter Nebeneffekt sein.
    Linus Torvalds - "Vater" von Linux

    Linux is like a wigwam, no windows, no gates, but with an apache inside dancing samba, very hungry eating a yacc, a gnu and a bison.

    Einmal editiert, zuletzt von Andreas (17. Oktober 2015 um 12:37)

  • mit UART, hatte ich oben geschrieben:

    Zitat

    weiß jemand, wie man das GPS Modul Ublox GY-NEO-6M mit C programmieren kann (per UART am Raspi)?

    in C müssen nur die Daten per UART (in Sketch: Serial) abgefragt werden (siehe Beispiel-Sketch).
    Wie das in G++ auf dem Raspi geht, danach hatte ich gefragt.

    Zitat

    Für die Arduino IDE gibt es libs wie tinyGPSplus, die man einfach #includen und dann die Daten mit den üblichen UART Funktionen auslesen kann....

    Gibt es vergleichbare Raspberry-libs für C und die Geany IDE?

    Und Ich hatte nach C gefragt, nicht nach Icon.
    Im Übrigen hat das Teil einen Pin-Header, den man direkt in ein Breadboard stecken kann (war bei mir schon dran).

    ps, Ergänzung:
    Die lbs sind es ja gerade, die die Daten bereits so aufbereiten, dass man sie einfach abrufen kann.
    In der tinyGPSplus-lib hat man dafür folgende API-Funktionen, per Serial (resp. Serial1) auslesbar

    Code
    gps.encode(Serial1.read();
      //...
    
    
      if (gps.location.isValid())
      { 
        fLatt= (double)gps.location.lat();
        fLong= (double)gps.location.lng(); 
        //...
      }

    (und hier zB. werden sie einfach per Serial.print ausgegeben):

    so etwas, grob in dieser Art, suche ich.

    Einmal editiert, zuletzt von HaWe (17. Oktober 2015 um 12:53)

  • Hallo HaWe,

    mit dem von Dir geposteten Code schreibst Du Daten auf die serielle Schnittstelle.

    Du wolltest im Ursprungs-Post diese Daten noch auslesen.

    Das von Dir verlinkte Modell hatte noch keinen steckbaren PinHeader, zumal Dir dann immer noch der Rest der Verkabelung fehlt.

    Hast Du UART schon freigeschaltet und mit einem Monitor-Programm die Funktionalität geprüft?


    Beste Grüße

    Andreas

    Ich bin wirklich nicht darauf aus, Microsoft zu zerstören. Das wird nur ein völlig unbeabsichtigter Nebeneffekt sein.
    Linus Torvalds - "Vater" von Linux

    Linux is like a wigwam, no windows, no gates, but with an apache inside dancing samba, very hungry eating a yacc, a gnu and a bison.

  • du hast es nicht verstanden.
    Mit Serial1 lese ich die Daten
    Mit Serial schreibe ich sie auf die serielle Schnittstelle zur Bildschirmausgabe.

    Hatte ich geschrieben:

    Zitat


    Die lbs sind es ja gerade, die die Daten bereits so aufbereiten, dass man sie einfach abrufen kann.
    In der tinyGPSplus-lib hat man dafür z.B. folgende API-Funktionen, per Serial (resp. Serial1) auslesbar

    Code
    gps.encode(Serial1.read();
     //...
    
    
     if (gps.location.isValid())
     {
       fLatt= (double)gps.location.lat();
       fLong= (double)gps.location.lng();
       //...
     }


    (und hier zB. werden sie einfach per Serial.print ausgegeben):

    Code
    Serial.println(gps.location.lat(), 11); // Latitude in degrees (double)
    //...

    Serial nutzt die Pins Rx und Tx,
    Serial1 dagegen Rx1 und Tx1, das sind 2 verschiedene UART-Schnittstellen.
    Die eine fürs GPS, die andere fürs Terminal-Fenster
    Steht übrigens im Sourcecode genauso völlig klar dokumentiert!

    Für den Raspi interessiert mich natürlich nur der UART-Teil für den GPS-Sensor!


    Bitte hör doch auf, hier immer in Threads, die C betreffen, reinzuposten und Verwirrung zu stiften !!!
    icon_evil.gif

    Einmal editiert, zuletzt von HaWe (17. Oktober 2015 um 13:23)

  • Tschüß

    Ich bin wirklich nicht darauf aus, Microsoft zu zerstören. Das wird nur ein völlig unbeabsichtigter Nebeneffekt sein.
    Linus Torvalds - "Vater" von Linux

    Linux is like a wigwam, no windows, no gates, but with an apache inside dancing samba, very hungry eating a yacc, a gnu and a bison.

  • danke!

    aber wie liest man jetzt aus

    die entsprechenden einzelnen Lattitude und Longitude-Werte ein (double) und den ganzen Rest wie Satellitenzahl, Uhrzeit usw...?

  • Also ein bisschen draufgucken muss man schon - so wie du hier rumtroetest, wenn jemand deinen Code nicht sorgfaeltig liest, solltest du dich da selber etwas bemuehen.

    Der Code oben ist doch ziemlich klar. Wenn newdata da ist, dann kann man damit was machen (PROCESS(newdata) ist ein Beisplieplatzhalter). Und newdata ist vom konspirativ benannten typ "struct gps_data_t" - das wirfst du in deine Lieblingssuchmaschine und kommst zb hier raus: https://fossies.org/dox/gpsd-3.15/structgps__data__t.html.

    Darin findest du alles, zb Lat/Long befinden sich als doubles in der Unterstruktur fix - also etwa so: newdata->fix.latitude

  • OMG, sorry, ich verstehe kein Wort.
    Wie sieht die Abfrage denn bitte als C-code genau aus, beispielhaft für Latt und Long?
    vllt kann ich mir den Rest daraus ableiten.

    Einmal editiert, zuletzt von HaWe (17. Oktober 2015 um 17:36)

  • Na, schrieb ich doch: an der Stelle, wo PROCESS(newdata) steht, kannst du etwas mit newdata machen.

    Zb. latitude & longitude auslesen.

    Code
    printf("lat: %f long: %f\n", newdata->fix.latitude, newdata->fix.longitude);

    Einfach satt dem PROCESS(newdata) einfuegen, compilieren, gluecklich sein.

  • aaah...:
    DAS hatte ich nirgendwo herausgelesen, aber auch C++ verstehe ich komplett nicht :

    newdata->fix.latitude, newdata->fix.longitude)

    newdata ist klar, das hat was mit einer Instanz oder Klasse zu tun, die wird ja erzeugt.
    was bedeutet dabei das "fix." ?

    haben alle anderen Werte auch dies "fix." dazwischen?

    Einmal editiert, zuletzt von HaWe (17. Oktober 2015 um 18:26)

  • Nein, nicht alle. Hast du dir den obrigen Link mal angeschaut? Da ist das Dokumentiert. newdata ist ein Pointer auf eine Struktur. Darum greift man mit -> auf deren Felder zu. Diese Struktur hat viele Felder, einfach wie komplexe, andere Strukturen.

    Eine eben ist das Feld "fix", und vom Typ gps_fix_t. Doku https://fossies.org/dox/gpsd-3.15/structgps__fix__t.html. Und *darin* sind dann die Felder, die du suchst.

    Das sind allerdings absolute C/C++ Basics. Pointer, Strukturen (oder Klassen) sowie deren Nutzung wirst du dir aneignen muessen - sonst kommst du nirgendwo hin.

  • ach so, ok, hatte ich bisher auch noch nicht selber verwendet, ich dachte wegen dem "->".
    aber sonst kannte ich structs auch nur mit einem "." dazwischen.

    Aber zurück zum "fix": was hat es damit auf sich?

    (edit: hat sich überschnitten)

    Einmal editiert, zuletzt von HaWe (17. Oktober 2015 um 18:40)


  • Aber zurück zum "fix": was hat es damit auf sich?acxh so, ok, hatte ich bisher auch noch nicht selber verwendet, ich dachte wegen dem "->".

    Aber zurück zum "fix": was hat es damit auf sich?

    Ich habe auf beides in meiner Antwort bezug gegeben. Was bitte ist dir unklar?

  • (hatte sich überschnitten)

    pps,

    also das in diesem Link habe ich schon gesehen, aber verstehe davon absolut nichts.
    https://fossies.org/dox/gpsd-3.15/structgps__fix__t.html

    :: und -> ist mir ein Buch mit sieben Siegeln.

    da bräuchte ich wirklich mal einen absolut kompletten Beispielcode für die GPS-Daten in C.
    (sorry, in der Beziehung bin ich 100% noob)

    (auch den Arduino-tinyGPSplus-lib-code verstehe ich absolut nicht, aber er ist eben wunderbar einfach anzuwenden, damit klappt es sofort!)Update:
    da der Raspi ja nur 1 einzige UART Schnittstelle hat (und auch nur 1 einzige I2C !) :( , bin ich mir nicht sicher, ob es sich lohnt, die an einen einzelnen Sensor zu verschwenden.
    Vermutlich ist es besser, sie für ein Multiplexer-Board über UART zu verwenden, das mehrere Sensoren bedienen kann (z.B. Arduino Mega oder Due: beide haben ja sogar 4 UART plus 2 I2C plus beliebig viele SoftwareSerial Ports). Gerade für nicht-zeitkritische Daten wäre das vermutlich wirtschaftlicher. Hinzu kommt, dass ein weiterer Hintergrundprozess (GPS-Daemon) wieder das sowieso schon schlechte Linux-Timing-Verhalten für zeitkritischere (ich will noch gar nicht sagen: "Echtzeit"-) Prozesse verschlechtert.
    Ich denke daher, ich werde den GPS Sensor wohl nicht am Raspi direkt anschließen.
    Danke an alle für eure Antworten!

    //Zusammengefügt von trek_star: Bitte gewöhne dir das Doppelposting ab. Das macht alles nur unübersichtlich.

    Einmal editiert, zuletzt von Alex (21. Oktober 2015 um 10:54)

Jetzt mitmachen!

Du hast noch kein Benutzerkonto auf unserer Seite? Registriere dich kostenlos und nimm an unserer Community teil!