GPS Empfänger in OpenWrt

Marktauftritt einer Vielzahl von einsatzfähiger Hardware wie Router und Testboards sowie auch die Projektentwicklung von OpenWrt hat für jeden möglich gemacht einen Entwicklungsingenieur zu werden. Die Welt ist für den Entwicklungsingenieur zu einem Baukasten geworden, wo man nur die Lust und die Freizeit braucht um etwas Interessantes aus den vorhandenen Bauteilen zusammenzubauen.

Als unsere Baukastenteile nehmen wir wie üblich einen Router, einen GPS Empfänger, OpenWrt. Während meiner Freizeit (als ich diese letztes Mal hatte)) ) baue ich einen Roboter, welchen ich geplant habe mit dem GPS Intellekt zu versorgen. Und vor einiger Zeit klang die Wortverbindung "GPS Modul" für mich etwas fürchterlich. Es ist Zeit, diesen Mythos zu zerstreuen!

Auf der Konfigurationsstufe von OpenWrt sind folgende Module auszuwählen:
Kernel modules:
USB Support:
<M> kmod-usb-serial
<M> kmod-usb-serial-pl2303
Network:
<M> gpsd
Utilities:
<M> lcd4linux
<*> LCD2USB
<*> gps
Utilities:
<M> lcdproc

Nach dem Zusammenbau ist Folgendes zu erledigen. Gehen wir in das Verzeichnis von OpenWrt, wo die zusammengebaute Pakete sind, und kopieren wir das Paket gpsd-2.94 in den Abschnitt(MyData)des USB-Stickes, den zu /home montiert wird. Ich habe den folgenden Pfad bis zum Paket:
/OpenWrt/build_dir/target-mipsel_uClibc-0.9.31.

Downloaden und installieren wir die Pakete.

root@OpenWrt:/# opkg update
Downloading ftp://ftp:ftp@192.168.0.9/Packages.gz.
Inflating ftp://ftp:ftp@192.168.0.9/Packages.gz.
Updated list of available packages in /var/opkg-lists/localpackages.
root@OpenWrt:/# opkg list |grep lc
lcd4linux - r1116-2 - LCD4Linux is a small program that grabs information from the kernel and
lcdproc - 0.5.2-1 - LCDProc is a daemon and client for displaying system information on various displays.
root@OpenWrt:/# opkg list |grep gp
gpsd - 2.94-1 - An interface daemon for GPS receivers
root@OpenWrt:/# opkg list |grep serial
kmod-usb-serial - 2.6.36.2-1 - Kernel support for USB-to-Serial converters
kmod-usb-serial-pl2303 - 2.6.36.2-1 - Kernel support for Prolific PL2303 USB-to-Serial converters
root@OpenWrt:/# opkg install gpsd kmod-usb-serial-pl2303 lcdproc
lcd4linux
Installing gpsd (2.94-1) to root...
Downloading ftp://ftp:ftp@192.168.0.9/gpsd_2.94-1_brcm47xx.ipk.
Installing libpthread (0.9.31-64) to root...
Downloading ftp://ftp:ftp@192.168.0.9/libpthread_0.9.31-64_brcm47xx.ipk.
Installing librt (0.9.31-64) to root...
Downloading ftp://ftp:ftp@192.168.0.9/librt_0.9.31-64_brcm47xx.ipk.
Installing kmod-usb-serial-pl2303 (2.6.36.2-1) to root...
Downloading ftp://ftp:ftp@192.168.0.9/kmod-usb-serial-pl2303_2.6.36.2-1_brcm47xx.ipk.
Installing kmod-usb-serial (2.6.36.2-1) to root...
Downloading ftp://ftp:ftp@192.168.0.9/kmod-usb-serial_2.6.36.2-1_brcm47xx.ipk.
Installing lcdproc (0.5.2-1) to root...
Downloading ftp://ftp:ftp@192.168.0.9/lcdproc_0.5.2-1_brcm47xx.ipk.
Installing libncurses (5.7-3) to root...
Downloading ftp://ftp:ftp@192.168.0.9/libncurses_5.7-3_brcm47xx.ipk.
Installing lcd4linux (r1116-2) to root...
Downloading ftp://ftp:ftp@192.168.0.9/lcd4linux_r1116-2_brcm47xx.ipk.
Configuring librt.
Configuring libpthread.
Configuring kmod-usb-serial.
Configuring kmod-usb-serial-pl2303.
Configuring libncurses.
Configuring lcdproc.
Configuring gpsd.
Configuring lcd4linux.

Schließen wir den GPS Empfänger an und prüfen wir die Ausgabe von dmesg:

root@OpenWrt:/# dmesg
pl2303 1-1.2:1.0: pl2303 converter detected
usb 1-1.2: pl2303 converter now attached to ttyUSB0

Starten wir den Daemon, der die Daten vom GPS Empfänger bekommt.

root@OpenWrt:/# gpsd -N -D5 /dev/ttyUSB0
gpsd: launching (Version 2.94)
gpsd: opening IPv4 socket
gpsd: opening IPv6 socket
gpsd: can't create IPv6 socket
gpsd: listening on port 2947
gpsd: NTPD shmat(32769,0,0) succeeded, segment 0
gpsd: NTPD shmat(65538,0,0) succeeded, segment 1
gpsd: NTPD shmat(98307,0,0) succeeded, segment 2
gpsd: NTPD shmat(131076,0,0) succeeded, segment 3
gpsd: running with effective group ID 0
gpsd: running with effective user ID 0
gpsd: stashing device /dev/ttyUSB0 at slot 0

Wenn der GPS Daemon fehlerlos gestartet wurde, kann er im Hintergrundmodus neu gestartet werden:

root@OpenWrt:/# gpsd /dev/ttyUSB0

Um die Daten vom Gpsd-Daemon zu erhalte, können wir diverse Clients verwenden. Einige Beispiele gehören zum Paket gpsd-2.94, welches wir in das Verzeichnis /home kopiert haben.

Eines der Beispiele ist der Client für die cgps Konsole, der die Anzahl der verwendeten Satelliten, Koordinaten, Geschwindigkeit und noch eine Menge von Daten zeigt, welche für mich momentan wenig informativ sind.
Starten wir das Programm cgps.

root@OpenWrt:/# /home/gpsd-2.94/.libs/cgps

Auf dem Bildschirm ist die folgende Form mit den Istdaten zu zeigen:

Es ist interessant zu prüfen, ob diese Daten richtig sind... Machen wir die Google-Karte auf und geben wir diese Koordinaten ein. ))

Es wäre wünschenswert, dass diese Daten auf dem LCD-Bildschirm gezeigt werden. Es ist einfach das zu machen, indem wir den Gps-Client von Lcd4linux verwenden. Dafür ist die Datei lcd4linux.conf einbisschen zu korrigieren, indem wir die Datei zum Beispiel den folgenden Gps-Widget ergänzen:
Widget gps-test1 {
class 'Text'
expression gps::parse('0x0000111','0')
width 20
update tack
align 'C'
}

Man kann nachsehen, wie es bei mir ist lcd4linux.conf. Es ist auch gut beschrieben auf der Webseite von Lcd4linux https://www.bulix.org/projects/lcd4linux/wiki/plugin_gps.

Bevor wir Lcd4linux starten, ist die Variable GPS_PORT zu schaffen, wie es auf der Webseite dargestellt ist. Und der Gps Client von Lcd4linux braucht keinen Gpsd Daemon. Deswegen ist der Befehl killall gpsd auszuführen

killall gpsd

Starten wir den Lcd4linux:

root@OpenWrt:/# export GPS_PORT=/dev/ttyUSB0
root@OpenWrt:/# lcd4linux -vv -F
LCD4Linux 0.11.0-SVN-1092 starting
Dump of /etc/lcd4linux.conf:
Display 'LCD2USB'
Display:LCD2USB.Backlight 1
Display:LCD2USB.Driver 'LCD2USB'
Display:LCD2USB.Icons 1
Display:LCD2USB.Size '16x2'
Layout 'Default'
Layout:Default.Row1.Col1 'gps-test1'
Layout:Default.Row2.Col1 'gps-test2'
Variables.tack 100
Variables.tick 500
Widget:gps-test1.align 'L'
Widget:gps-test1.class 'Text'
Widget:gps-test1.expression gps::parse('0x10000110','0')
Widget:gps-test1.update tack
Widget:gps-test1.width 16
Widget:gps-test2.align 'L'
Widget:gps-test2.class 'Text'
Widget:gps-test2.expression gps::parse('0x10001001','0')
Widget:gps-test2.update tack
Widget:gps-test2.width 16
plugin_cfg.c: Variable tack = '100' (100)
plugin_cfg.c: Variable tick = '500' (500)
plugin_gps.c: v0.2
lcd4linux.c: initializing driver LCD2USB
LCD2USB: $Rev: 975 $
LCD2USB: scanning USB for LCD2USB interface ...
LCD2USB: found LCD2USB interface on bus 001 device 010
LCD2USB: echo test successful
LCD2USB: firmware version 1.09
LCD2USB: installed controllers: CTRL0
LCD2USB: reserving 1 of 8 user-defined characters for icons
initializing layout 'Default'
layout.c: Layout:Default: migrating 'row1.col1' to 'Layer:1.row1.col1'
layout.c: Layout:Default: migrating 'row2.col1' to 'Layer:1.row2.col1'
Creating new timer group (100 ms)
widget 'gps-test1': Class 'text', Parent '', Layer 1, Row 0, Col 0 (to 0,16)
widget 'gps-test2': Class 'text', Parent '', Layer 1, Row 1, Col 0 (to 1,16)
lcd4linux.c: starting main loop

Wenn Sie beim Starten folgende Melding bekommen haben:

LCD4Linux 0.11.0-SVN-1092 starting
security error: owner and/or group of '/etc/lcd4linux.conf' don't match
security error: group or other have access to '/etc/lcd4linux.conf'

sind die Eigenschaften der Datei lcd4linux.conf wie folgt zu ändern:

root@OpenWrt:/# chmod 600 /etc/lcd4linux.conf
root@OpenWrt:/# chown root:root /etc/lcd4linux.conf

Ich hatte alle Werte bei Null auf meinem Monitor, obwohl wir gerade beim Starten von cgps gesehen haben,dass alles funktionierte. Nun muss man zumindestens den Denkteil des Gehirns aktivieren ))). Machen wir die Quelldatei des Gps-Clients — plugin_gps.c auf und finden die filgende Zeile darin:
GPS_9600<------>serial port speed, default is 4800 baud, if you define this var speed will be 9600 (export GPS_9600=dummy)

Mein Gps-Empfänger funktioniert mit der Geschwindigkeit von 9600, wobei die Geschwindigkeit von 4800 als Default-Wert festgelegt ist. Ändern wir die Geschwindigkeit und starten wir lcd4linux neu:

root@OpenWrt:/# export GPS_9600=dummy

Jetzt blicken wir auf den Monitor. Es sollte etwa so aussehen:

Bevor wir noch einen graphischen Client prüfen, weichen wir bisschen vom Thema und prüfen wir das Dienstprogramm lcdproc, das auch wie Module lcd4linux die Systeminformation auf dem Monitor zeigt. Vor dem Start von lcdproc ist der Daemon LCDd, der ein Treiberteil von lcdproc ist, zu starten.

In der Konfigurationsdatei des Daemons LCDd sind die Informationen über unseren Monitor hinzuzufügen:
[hd44780]
ConnectionType=lcd2usb
Contrast=850
Brightness=800
OffBrightness=0
Keypad=yes
Backlight=yes
Size=20x2

Fügen wir den Pfag hinzu:
DriverPath=/usr/lib/lcdproc/

Ändern wir den Treibertyp:
Driver=hd44780

Man kann nachsehen, wie ich das gemacht habe LCDd.conf. Das ist auch gut beschrieben auf der Webseite von lcdproc http://lcdproc.sourceforge.net/docs/current-user.html#hd44780-lcd2usb

Starten wir den Daemon LCDd:

root@OpenWrt:/# LCDd

Auf dem Monitor können wir Folgendes sehen. Das Server wurde gestartet und wartet jetzt auf die Verbindung von Clients.

Weiter starten wir den Clienten lcdproc.

root@OpenWrt:/# lcdproc

Auf dem Monitor können wir Folgendes sehen:

Und jetzt kommen wir auf unseren Gps-Empfänger zurück. In den Beispielen zu gpsd gibt es auch einen Clienten für den LCD-Monitor, der Client heisst lcdgps. Für seine Funktionsfähigkeit ist gerade der Daemon LCDd notwendig. Prüfen wir, wie lcdgps funktioniert. Starten wir:

root@OpenWrt:/# gpsd /dev/ttyUSB0
root@OpenWrt:/# LCDd
root@OpenWrt:/# /home/gpsd-2.94/.libs/lcdgps

Auf dem Monitor können wir Folgendes sehene:

Einen Gps-Empfänger bei uns bestellen:

gps receiver