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
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 ' widget 'gps-test2': Class 'text', Parent ' 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
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: