Banana Pi M3 mit Android 5.1.1, GPS nachrüsten?

  • 8 Antworten
  • Letztes Antwortdatum
avoid200

avoid200

Neues Mitglied
4
Hallo allerseits,

ich kämpfe gerade damit meinem "Android 5.1.1" auf dem "Banana Pi M3", GPS nach zu rüsten.
Der Hersteller ist leider keine Hilfe und die Foren zum Banana Pi sind ebenfalls servicewüste.

Nun versuche ich es mal hier, da die Hardware soweit angeschlossen ist und Android nur noch dazu bewegt werden muss den UART zu verwenden an dem das GPS hängt.

Welche Infos braucht Ihr um mir helfen zu können?

Hier schon mal folgendes:
Sourcecode: BPI-SINOVOIP/BPI-M3-bsp
Image: BananaPi Bpi-M3 New Image (New EMMC) Android 5.1 Release 2018-6-5
Wiki: Banana Pi BPI-M3 - Banana Pi Wiki

Gruß
 
Hallo ,

UART kann jetzt Vieles sein , ich gehe mal davon aus , dass du eine USB GPSMaus meinst.

In dem Falle musst du erst einmal wissen , welchen Treiber - Chip die Maus besitzt (z.b. PL2303),
dann benötigst du die Baudrate ( i.d.R. 9600,8,1,N) und dann benötigst du noch eine App (besser Service),
die das NMEA Protokoll parst und in Mocklocationdata umsetzt.

Anmerkung : Der Banana , wie auch der Rasp ist dafür eigentlich falsch. Du hättest dich besser auf den Odroid eingeschossen.
 
Zuletzt bearbeitet:
  • Danke
Reaktionen: nik
Nein es ist kein USB GPS-Modul.
Ich verwende dieses Modul. Es ist über eine serielle Schnittstelle (den UART2) angebunden. Die Baudrate und sonstige Daten sind wie du schon vermutet hast 9600,8,N,1. Diese kann ich allerdings im Modul ändern wenn Android damit ein Problem haben sollte. Auf dieser Webseite hat jemand das GPS-Modul an einen Raspberry-Pi angebunden, ähnlich ist es bei mir. Nur das ich eben Android verwende.

Ich möchte das GPS-Modul übrigens nicht als Mocklocation betreiben. Sonst hätte ich das Problem das einige Apps nicht damit arbeiten wollen. Es soll schon so integriert sein als hätte es der Hersteller eingebaut. Evtl. kann ich mich mit eurer Hilfe, Stück für Stück an das Endergebnis herantasten.

Da mein UART2 eine Hardwareschnittstelle ist, ist diese schon mit einem Treiber versehen, hoffe ich.
Kann ich das irgendwie prüfen und evtl. die Schnittstelle im Android öffnen um zu sehen was das Modul sendet?

Auf dieser Webseite hat jemand wohl das Android Image entpackt eine Datei namens "sys_config.fex" angepasst und dann das Image neu erstellt, um erst mal den UART2 zu aktivieren und richtig ein zu stellen. Ich verstehe nicht wirklich was und wie er da tut, weswegen ich es auch nicht nachbilden kann. Dabei könnte ich eine Verständnishilfe brauchen.

Für jemanden aus der Windows Welt ist Linux und besonders Android noch ein Mysterium, aber das wird sich hoffentlich mit der zeit geben. Ich beschäftige mich ab morgen mit der App-Entwicklung, dann mit den Kernel Modulen und danach mit der Linux Treiber Entwicklung. Ein e-book nach dem anderen, bis mir der Kopf raucht. ;)

p. s.
NMEA Daten, einen Parser? Kann Android nicht von haus aus GPS-Daten verarbeiten? NMEA definiert ja nur die Schnittstelle, der Inhalt der über die Schnittstelle kommt (die 80 Zeichen langen Strings) sind ja trotzdem das was die Android-GPS Klassen brauchen (GPRMC, ...) oder nicht? Ich versuche es nur zu verstehen wozu ich einen extra Parser brauche. Die gibt es ja zu genüge bei git, wie ich gerade gesehen habe. Oder war das evtl. nur auf die USB-GPSMaus bezogen nötig?

ja, der Odroid würde dann auch zumindest mit der USB-GPSMaus funktionieren, die ich ja auch hier rum fliegen habe aber die zum laufen zu bekommen hab ich schon aufgegeben. ;)
 
.

Vorweg : JEDER GPS-Sensor liefert NMEA- Datensätze


Ich möchte das GPS-Modul übrigens nicht als Mocklocation betreiben.

Da hast du einen Denkfehler, denn Mocklocation steht nur für die externe Einspeisung in die
Google API. Jede App, die GPS benötigt, greift mittlerweile auf die Google-API zu.

Dies ist der Standardvorgang , wenn kein interner Hersteller-spezifischer Chip verwendet wird.
Nur bis Android 4x wurde mal auf den Sensor direkt zugegriffen - Das ist Schnee von gestern.



NMEA Daten, einen Parser? Kann Android nicht von haus aus GPS-Daten verarbeiten?

Auch der interne GPSChip-Treiber bei einem Smartphone ist im Grunde genommen ein NMEA Parser und speist die Daten in den Kernel ein.

In Deinem Falle hast du allerdings einen externen, NICHT vom Hersteller verbauten Sensor und da musst du dich selbst um das Parsen und einspeisen kümmern.
Dein Modul von oben liefert dir lediglich nur ASCII-Datensätze per RS232.
Damit kann weder der Kernel , noch Android etwas mit anfangen.

NMEA : Die Strings sind nicht immer 80 Bytes lang, sie sind längencodiert.
Aus den verschiedenen Datentypen musst du dir dann mit ein paar Umrechnungen einen "Location"-Datensatz für die Google API
zusammenbasteln und den dann an das Android System schicken. (Vektorumrechnung, Velocity, Bearing , Satelliten - Fixes etc)
Bei Android darf das allerdings maximal im 1000- 2000ms Takt passieren. NMEA schickt alle ~100ms.

Location | Android Developers


So und nicht Anders mache ich ich es auch bei meinem Projekten .


ja, der Odroid würde dann auch zumindest mit der USB-GPSMaus funktionieren, die ich ja auch hier rum fliegen habe aber die zum laufen zu bekommen hab ich schon aufgegeben.

Das habe ich oben bereits schon erklärt :

Ermittle den Chip (z.b. PL2303) installiere die Treiber dazu und dann musst du dich nur noch um NMEA kümmern.
(Funktioniert auch dann mit der Banane)

Für den Odroid gibt es bereits einen GPS Sensor mit passendem Treiber zu kaufen.
Dieser hat einen Prolific-Treiber direkt integriert und macht auch ein NMEA -Parsing
(Das ist ein C/C++ Kernel Modul auf ttyS0) Irgendwo liegt auch der Source dazu rum .


Fazit :

Grundsätzlich musst du der Google-API einen Location-Datensatz dem Android-System zur Verfügung stellen - kein NMEA !


Entweder schreibst du dir ein C/C++ binary mit passendem Treiber auf ttySX, machst ein NMEA parsing und übergibst es an das Kernel-Modul.

oder

du schreibst dir einen Android Service (ttyUSBX), verwendest den Treiber , parst NMEA, bildest
einen Locationdatensatz und übergibst ihn via Mocklocation an die Google API.
 
Zuletzt bearbeitet:
  • Danke
Reaktionen: avoid200
a ok, ich verstehe.
also Location-Daten über Treiber im Kernel oder mittels Parser aufbereiten und in die Google-API übergeben. Dann klappt's auch mit dem Navigieren. Danke für die Aufklärung.

Die Daten aus dem NMEA String zu filtern und aufbereitet weiter zu geben machen ich jetzt schon mit diversen Mikrocontrollern, da bekomm ich schon was gebastelt. Ich schaue mir wohl bei git einige Parser an, evtl. kann ich mir da was abkucken oder einen verwenden.

Danke für den Link zur Location Klasse, sehe ihn mir morgen als erstes an.
Danach sehe ich zu das ich den UART2 aktiviert bekomme, muss nur erst mal verstehen wie.
 
Ich schaue mir wohl bei git einige Parser an, evtl. kann ich mir da was abkucken oder einen verwenden.

Dabei ein wenig darauf achten , dass du die neuen Formate unterstützt und kombinierst.

Nicht alle Parser berücksichtigen/separieren Beidou, GPS, Glonass und Galllieo Header und du hast
fehlerhafte Daten, die keinen Sinn machen.


Am besten selbst schreiben und auseinanderfieseln.
 
  • Danke
Reaktionen: avoid200
Ich hab mir gestern doch noch den link zur Location Referenz durchgelesen. Ich hab mir auch noch angelesen wozu die API-Level da sind und bin dadurch auf "droidwiki.org" gestoßen. ;)
Da ich Android 5.1.1 auf meiner Hardware habe, kann ich vermutlich mit diesen Guide zum UART in Android nicht wirklich was anfangen. Eher schon mit diesem Treiber bei dem ich außer dem UART Pfad nicht viel umstellen muss wie es den Anschein hat.

Ich versuche nun erst mal einen weg zu finden um in Android "/dev/ttyS2" ab zu fragen und zu sehen ob Daten vom GPS-Modul rein kommen. Danach befasse ich mich mit dem Treiber.

Kommen aber keine Daten rein weil der UART2 noch aus ist, muss ich erst mal sehen das ich die oben genannte .fex Datei abändere und den UART2 aktiviere. Dazu muss ich aber erst mal raus finden wie ich das machen kann. Auf dem Android kann ich ja schlecht das Image entpacken und über sich selbst drüber bügeln. Dazu muss ich mir wohl echt unter Windows Linux in einer VM installieren. Evtl. finde ich ja einen Guide zum abändern von Android Images.
 
Ich habe mein Android Image mit "imgRePacker_206" entpackt und jede menge .fex Dateien sowie eine ISO Datei erhalten. Ich habe dann in der “sys_config.fex” den [uart2] "used = 1" gesetzt, den typ auf 2 gesetzt und die beiden überflüssigen Parameter für RTS und CTS entfernt. In der Datei habe ich noch einen Punkt [gps_para] gefunden. Weil man dort den UART angeben kann habe ich dort 2 eingetragen und dort auch "used = 1" gesetzt. Damit müsste doch schon alles ohne zusätzlichen Parser, Mapper oder HAL Treiber funktionieren. Offensichtlich ist das ja schon alles da. fehlt nur noch raus zu finden welcher GPIO Pin für Standby (PC17) und Reset (PC18) ist, damit ich diese extra verdrahten kann.

Zum glück habe ich zu den .fex Dateien diese Beschreibung gefunden. Die Dateien sind nur dürftig kommentiert teilweise sogar auf Chinesisch.
Wenn ich den dump mit dem selben Tool wieder zum Image mache und auf SD packe, startet es nicht bzw. zeigt endlos das Ende der Startanimation. In den eMMC eingespielt habe ich es auch versucht das flashen schließt PhonenixSuite auch ab ohne Fehler, wenn ich dann aber starte ist noch immer die vorherige Version drauf und nicht meine angepaßte.
 

Anhänge

  • sys_config.zip
    15,7 KB · Aufrufe: 102
Update:
Das mit dem nicht starten lag am falschen Image. ;)
Hatte versehentlich eins für das 7" Display und nicht das für HDMI verwendet.

Ich hab mich nun drei tage daran versucht die Schnittstelle über die .fex Datei zu aktivieren. Hab es mit UART2 und UART3 versucht, weil UART0 für OTG-Debug und UART1 für Bluetooth vor konfiguriert ist. Auch das enable von [gps_para] hatte nichts verändert. Vermutlich hilft es nichts das Image nur zu entpacken, die .fex ab zu ändern und alles wieder zum Image zu machen. Vermutlich muss mit der geänderten .fex Datei doch der Source Code neu kompiliert werden. Aber das bekomme ich nicht hin, zumindest nicht nach den schon oben verlinkten Anleitungen.

Ich habe außerdem noch immer das Problem das ich keinen weg finde um die Rohdaten der Schnittstelle angezeigt zu bekommen. Die Apps die ich ausprobiert habe können nur USB-Schnittstellen und im Terminal funktionieren nicht alle befehle und die par die dem Android bekannt sind haben keine Berechtigung auf die /dev/tty Schnittstellen zu zugreifen.

Bei der vielen Rumprobiererei und der fülle an USB Apps habe ich dann nebenbei nochmal die USB-GPS-Maus für den ODROID angeschlossen und sogar zum laufen gebracht. Wer diese verwenden will kann die App "GNSS Commander - GPS Status" installieren. Diese App kann die Daten vom USB-GPS einlesen (z. b. per Adapterkabel am OTG-Port angeschlossen) und bei aktiviertem „Pseudostandorte zulassen“ in den Entwickleroptionen, kann man diese Daten dann in allen Apps nutzen.
Haken an der Sache: Einige Apps wie beispielsweise „Pokémon Go“ lassen sich nicht Starten solange „Pseudostandorte zulassen“ aktiv ist, weil man darüber betrügen könnte. Und die App „GNSS Commander – GPS Status“ Startet nicht mit Android sondern muss vor dem nutzen von GPS von Hand gestartet werden.

Heute habe ich dann noch diverse wiki-Seiten, Forenbeiträge und How-To's gelesen wobei mir aufgefallen ist das meinem Android offensichtlich einige grundlegende Dateien fehlen. Ich habe einige erstellt und aus anderen Android Versionen importiert aber auch das hat nix gebracht. mein grundlegendes Problem ist wohl noch immer die Schnittstelle. Ich hab übrigens auch mehrere Bautraten im Modul eingestellt (4800,9600,115200,230400), damit es nicht daran liegt. Unter Windows mit dem u-Center funktioniert mein GPS-Modul einwandfrei.

Nebenbei habe ich noch mit diesem Treiber rum probiert aber nichts erreicht. Ich werde nun noch versuchen damit die USB-GPS-Maus ein zu binden ohne „Pseudostandorte zulassen“ verwenden zu müssen. Die GPS-Software selbst, scheint vollständig im Android da zu sein, sonst würden die Pseudostandorte nicht funktionieren. Es hängt nur daran die Daten über eine der freien UART Schnittstellen rein zu bekommen.

Ich hoffe jemand hat einen Tipp wie ich auslesen kann ob etwas über /dev/ttyS2 oder /dev/tty3 rein kommt. Das würde mir sehr helfen.
Und eine unter Windows funktionierende Anleitung, wie ich nach ändern der .fex ein neues Image erstelle in dem die Änderungen dann auch greifen würde mich besonders freuen.
 
Zuletzt bearbeitet:

Ähnliche Themen

Slinthorax
  • Slinthorax
Antworten
5
Aufrufe
2.038
Kosake77
Kosake77
O
Antworten
10
Aufrufe
3.131
BOotnoOB
BOotnoOB
I
Antworten
1
Aufrufe
1.760
matzewendroid
M
Zurück
Oben Unten