Orange Pi wird zum Steuersystem

Orange Pi: Freches Früchtchen
Kommentare

Arduino und Co. sind so lange nett, wie man nicht auf GSM und/oder GPS bzw. Glonass zugreifen muss. In diesem Fall können auf Unix basierende Prozessrechner ihre Stärke ausspielen, wenn sie denn die passende Hardware mitbringen. Leider ist das nur in den wenigsten Fällen der Fall. Wir wollen in diesem Artikel einen anderen Weg gehen und Ihnen den Orange Pi vorstellen.

Das in der Vergangenheit für Medienaufmerksamkeit sorgende Prozessrechnerhaus Shenzhen Xunlong hat sich mittlerweile als solider Player etabliert. Der für rund zehn Dollar erhältliche Orange Pi Lite bietet mehr als brauchbare Spezifikationen (Tabelle 1). Leider bringt er weder GPS/Glonass noch 3-D-Funk mit: Ein Umstand, dem wir in diesem Artikel abhelfen wollen.

Spezifikation Wert
CPU Allwinner H3
Vierkerner, 1,2 GHz Maximaltakt
RAM 512 MB
Video HDMI-Out
Speicher Micro-SD
USB-Ports Zwei (Lite)/Eins (One)
WAN WiFi (Lite)/LAN (One)
GPIO 40 Pins, mit diversen Bussen in Hardware

Tabelle 1: Spezifikationen des Orange Pi Lite

Armbian auf Orange Pi

Die für den folgenden Artikel verwendeten Module sind in Abbildung 1 und Abbildung 2 gezeigt: Beide sind für rund je zehn Euro das Stück erhältlich. Die hier angegebenen Produkte sind – samt Bestellangaben – übrigens nur Beispielkandidaten.

Abb. 1: TUOZHAN bietet das Modul zum Zeitpunkt der Drucklegung an [1]

Abb. 1: TUOZHAN bietet das Modul zum Zeitpunkt der Drucklegung an

Abb. 2: Im hier gezeigten Gehäuse sind einige verschiedene Hardwarevarianten erhältlich – caveat emptor

Abb. 2: Im hier gezeigten Gehäuse sind einige verschiedene Hardwarevarianten erhältlich – caveat emptor

Wir wollen in den folgenden Schritten Armbian verwenden. Das Betriebssystem steht auf der Armbian-Homepage zur Verfügung, nutzen Sie die hinter der Version Jessie Desktop bereitstehende .raw-Datei. Beachten Sie, dass das wahllose Installieren von Updates mitunter zu einem nichtfunktionierenden System führt – es spricht allerdings nichts dagegen, davor ein Image der SD-Karte zu ziehen und sich so auf die sichere Seite zu begeben.

Der erste Start von Armbian nimmt systemimmanent etwas Zeit in Anspruch. In den ersten fünf bis zehn Sekunden bleibt der Bildschirm dabei schwarz – je nach Größe der SD-Karte sind bis zu zehn Minuten Wartezeit erforderlich.

Hektische Zeitgenossen versuchen sich schon nach dem ersten Auftauchen der Log-in-Shell anzumelden – im Rahmen der Konfiguration erfolgt ein Reboot, der alle bis dahin gestarteten Prozesse gnadenlos eliminiert. Der Prozessrechner ist dann zum Einloggen bereit, wenn die Log-in-Shell permanent am Bildschirm bleibt. Loggen Sie sich sodann mit root/1234 ein, und arbeiten Sie den Rest des Einstellungsassistenten ab.

Funk für den Orange Pi

Der hier verwendete Orange Pi One kann immer nur ein Funkmodul gleichzeitig ansprechen: Das Anschließen eines Routers oder das Nutzen des Micro-USB-Anschlusses sind hier nicht Thema. Für das Bring-up ist die Nutzung eines aktiven USB-Hubs empfehlenswert, da Tastatur, Maus und Funkmodul gleichzeitig Anschluss am Prozessrechner finden müssen. Beim Deployment der fertigen Applikation ist das natürlich nicht mehr notwendig. Nach diesen Vorbereitungshandlungen stecken Sie das GPS-Dongle in den Hub oder in den Prozessrechner. Benutzen Sie sodann das lsusb-Kommando, um eine Liste aller mit dem Prozessrechner verbundenen USB-Geräte zu erhalten. Die Ausgabe sollte eine nach folgendem Schema aufgebaute Zeile enthalten, die auf den Hersteller des GPS-Chips verweist:

root@orangepione:~# lsusb 
. . .
Bus 002 Device 005: ID 1546:01a7 U-Blox AG

Im nächsten Akt müssen einige Module heruntergeladen werden, die für den GPS-Support notwendig sind. gpsd-clients ist bei der Auslieferung nicht nötig und kann weggelassen werden. Wir binden das Paket trotzdem ein, weil es zum Debugging nützliche Werkzeuge wie cgps mitbringt:

root@orangepione:~# sudo apt-get install gpsd gpsd-clients libgps-dev

Im nächsten Schritt müssen wir feststellen, wo das USB-GPS-Dongle eingeloggt wurde. Dies bewerkstelligen wir durch eine Analyse des Systemlogs, die ein nach folgendem Schema aufgebautes Ergebnis zurückliefern wird:

root@orangepione:~#  dmesg | grep -i usb
[   97.540127] usb 2-1.6: new full-speed USB device number 6 using sunxi-ehci
[   97.673057] cdc_acm 2-1.6:1.0: ttyACM0: USB ACM device

An dieser Stelle eine Anmerkung: Die Autorin testete den zurückgegebenen String sowohl auf einer Ubuntu-14.04-Workstation als auch auf einem Prozessrechner der Marke Shenzhen Xunlong. Mehrere verschiedene Dongles wurden stets an der Position ttyACM0 eingedockt. Das muss allerdings nicht unbedingt überall der Fall sein – es ist auch möglich, dass Ihr Dongle an einer anderen Stelle auftaucht.

Position erkennen

An dieser Stelle möchte ich Sie auf ein kleines didaktisches Experiment einladen, das Ihnen vielleicht in Zukunft gute Dienste leisten wird. GPS-Module kommunizieren so gut wie immer über einen als NMEA bezeichneten Standard: Er beschreibt eine Art Stringsequenz, die über einen seriellen Link zu übertragen ist. Wir können diese Daten ansehen, indem wir das zugewiesene Gerät per cat öffnen. Auf meinem Prozessrechner sah die Ausgabe ungefähr so aus:

root@orangepione:~# sudo cat /dev/ttyACM0
$GPTXT,01,01,02,u-blox ag - www.u-blox.com*50

$GPTXT,01,01,02,HW  UBX-G70xx   00070000 *77

$GPTXT,01,01,02,ROM CORE 1.00 (59842) Jun 27 2012 17:43:52*59

$GPTXT,01,01,02,PROTVER 14.00*1E

Achten Sie darauf, dass Ihr GPS-Modul mit relativer Sicherheit etwas andere Zahlen ausgibt. Weitere Informationen über das NMEA-Protokoll finden Sie unter anderem im NMEA Referance Manual. Bitte beachten Sie, dass kein eigener NMEA-Parser implementiert wird! Das liegt daran, dass es unter Unix mit dem gpsd einen gut geprüften, gut beleumundeten und darauf spezialisierten Daemon gibt, der Ihnen diese Arbeit gern abnimmt. Zum Testen müssten wir im ersten Schritt folgende Kommandos eingeben:

root@orangepione:~# sudo killall gpsd
root@orangepione:~# gpsd -D 5 -N -n /dev/ttyXXX0

Achten Sie sodann darauf, das Fenster mit gpsd geöffnet zu lassen. Falls Sie sich über den Aufruf von killall wundern: GPSD startet zwar von Haus aus, wird aus dem Paket aber mit unerwünschten Einstellungen ausgeliefert. Aus diesem Grund killen wir im ersten Schritt die schon laufende GPSD-Version, um daraufhin eine neue Version von GPSD zu starten, die direkt mit unserem Gerät verbunden ist. Im nächsten Schritt müssen Sie ein weiteres Terminalfenster öffnen, indem Sie den Befehl cgps eingeben.

cgps ist ein kleines Kommandozeilenwerkzeug, das Kontakt zu einem GPS-Modul aufnimmt und die von ihm angelieferten Daten ausgibt. Dabei gibt es allerdings eine kleine Falle: Ein frisch ausgepacktes, einige Zeit ausgeschaltetes oder um mehr als einige Kilometer verschobenes GPS-Modul muss im ersten Schritt eine Initialpeilung durchführen.

Hinter diesem auf den ersten Blick einfach klingenden Prozess stecken rund dreißig Minuten Arbeit: Das GPS muss die von den Satelliten ausgeschickten Ephemeridendaten entgegennehmen, um damit genaue Informationen über den Aufenthalt und die Konstellation des GPS-Systems zu erhalten. Ein noch nicht gepeiltes GPS führt im GPSD zum kurzen Aufblinken des Dialogs „No Fix“, woraufhin das Programm eine Fehlermeldung über ein GPS-Timeout auswirft. Das lässt sich durch Eingabe von cgps -s beheben – das Programm wartet in diesem Fall, wenn noch kein Fix aufgenommen wurde. Wenn die rund dreißig Minuten abgelaufen sind, können Sie die von unserem GPS-Modul angelieferten Daten in cgps betrachten.

Übrigens: Da das Entwickeln von Software direkt am Prozessrechner lästig ist, spricht nichts dagegen, das GPS-Modul mit der Workstation zu installieren und auch dort GPSD und Konsorten zu installieren. Denn erfreulicherweise weisen Armbian und Ubuntu viel Gemeinsamkeit auf.

GPSD automatisch starten

Das manuelle Starten von GPSD wird im Laufe der Zeit ärgerlich: Es wäre wünschenswert, wenn das Tool wie ein normaler Daemon mit dem Prozessrechner angelassen werden kann. Dies lässt sich in einem zweistufigen Prozess bewerkstelligen. Im ersten Schritt wird die Datei /etc/default/gpsd angepasst, um das zu verwendende Device über den Wert GPSD_Options zuzuweisen:

# Default settings for the gpsd init script and the hotplug wrapper.
. . .
# Other options you want to pass to gpsd
GPSD_OPTIONS="/dev/ttyACM0"

GPSD konfiguriert sich selbst und übernimmt dabei die Inhalte der soeben bearbeiteten Datei in die eigentliche Konfiguration: Diese Vorgehensweise ist unter Unix weit verbreitet, weil das Betriebssystem den Daemon so ohne Verlust der Nutzereinstellungen aktualisieren kann. Aus diesem Grund ist als Nächstes die Abarbeitung des Befehls root@orangepione:~# sudo dpkg-reconfigure gpsd notwendig. Nach einem Neustart des Prozessrechners sollte GPSD automatisch starten und das Gerät dank der Anpassung ergreifen.

Qt an Rechner

GPSD bietet mehrere Interfacearten an: Das mit Abstand am meisten verwendete basiert auf Telnet. Auf catb.org gibt es eine vollständige Dokumentation des Telnet-APIs, die mitunter lesenswert ist. Ich werde in den folgenden Schritten – schon aus Gründen der Einfachheit – stattdessen auf die libGPS setzen, die ein einfaches C-API bereitstellt. Zu ihrer Nutzung ist (hier) die C++-Klassenbibliothek Qt erforderlich. Öffnen Sie nach der Erzeugung einer neuen Kommandozeilenapplikation die .pro-Datei und fügen Sie die beiden folgenden Zeilen ein:

LIBS += -lgps
LIBS += -lm

Sie sorgen dafür, dass die libGPS samt ihren Bedürfnissen in den Kompilationsprozess eingebunden wird. Die eigentliche Realisierung ist vergleichsweise einfach und erfolgt in einer von QThread abgeleiteten Klasse. Das GPSD-Team bittet explizit darum, den Code folgendermaßen gegen Änderungen in der Bibliothek abzusichern:

#include "gpsdworker.h"
#if  GPSD_API_MAJOR_VERSION != 5
#error "GPSD lib API unknown"
#endif

Die eigentliche Run Payload des GPSD Workers ist primitiv. Im ersten Schritt bauen wir eine Verbindung zum GPS-Gerät auf, und rufen sodann GPS_Stream auf. Diese Methode ist dafür zuständig, das GPS-Gerät zum Anliefern von Informationen zu animieren (Listing 1).

void GPSDWorker::run()
{
  struct gps_data_t gpsdata;
  if(gps_open("localhost", "2947" , &gpsdata)!=0)
  {//An error occured.
    qDebug() << "No link to GPSD";
  }
  gps_stream(&gpsdata, WATCH_ENABLE | WATCH_JSON, NULL);

Das eigentliche Entgegennehmen der Daten erfolgt in einer Endlosschleife, die die Daten durch Aufruf von gps_read in den gemeinsamen Speicherbereich schreibt. Die Auswertung der angelieferten Informationen ist aus technischer Sicht nicht dramatisch (Listing 2).

while(1)
{
  myMutex.lock();
  int bytesBack=gps_read (&gpsdata);
  if  (bytesBack == -1) {
    qDebug() << "Read Error";
  }
  else if (bytesBack>0)
  {
    qDebug() << "Got Data";
    //STATUS_NO_FIX is 0, else 1 or 2
    if(gpsdata.status!=0)
    {
      myLat=gpsdata.fix.latitude;
      myLon=gpsdata.fix.longitude;
      mySpd=gpsdata.fix.speed;
      myTime=gpsdata.fix.time;
    }
  }
  else
  {
    qDebug() << "Got nothing";
  }
  myMutex.unlock();
  msleep(100);
}

Achten Sie darauf, dass die Wiederholungsrate im Vergleich zur Aktualisierungsrate des GPS-Moduls hoch ist. Liefert das GPS-Modul mehrere Strings an, bevor ein neuer Aufruf von GPS_Read erfolgt, so drohen Probleme. Eine weitere Herausforderung ist die phasenweise Aktualisierung. Dazu gibt es in gpsdata ein Flag, das über die geänderten Attribute informiert – seine Nutzung ist hier allerdings nicht Thema.

Damit fehlt uns nur noch das Herunterfahren von Bibliothek und Stream:

(void) gps_stream(&gpsdata, WATCH_DISABLE, NULL);
(void) gps_close (&gpsdata);
}

Die Einbindung in main ist für Qt-Programmierer nicht sonderlich neu:

int main(int argc, char *argv[])
{
  QCoreApplication a(argc, argv);
  . . .
  GPSDWorker *myWorker=new GPSDWorker();
  myWorker->start();
  return a.exec();
}

Nach diesen Arbeiten ist GPS im Großen und Ganzen einsatzbereit: Sperren Sie auf Wunsch den Mutex und lesen Sie die Informationen aus.

3G-Modem einrichten

Als nächste Aufgabe wollen wir uns dem 3G-Modem zuwenden. Hier gibt es eine kleine Besonderheit zu beachten. Die meisten Modems kennen zwei oder sogar drei verschiedene Betriebsmodi. Normalerweise – Netzbetreiber wollen auf diese Art den Kundensupportaufwand reduzieren – meldet sich ein 3G-Dongle im ersten Schritt als CD-ROM-Laufwerk an, um im nächsten Schritt von einer am PC befindlichen Software in ein Funkmodem umgewandelt zu werden.

Eine weitere Besonderheit betrifft das Vorhandensein eines Card Readers: Der USB-Port lässt sich so mehrfach nutzen, das Modem dient auch als USB-Stick. Für uns ist das insofern unangenehm, als die betreffende Software nur unter Windows funktioniert. Nach dem Anstecken verhält sich das Modul normalerweise als Massenspeicher, was in lsusb folgendermaßen aussieht:

root@orangepione:~# lsusb
. . .
Bus 002 Device 005: ID 05c6:f000 Qualcomm, Inc.

Im System-Log finden sich ebenfalls nur Hinweise auf die Rolle als Massenspeichergerät:

root@orangepione:~# dmesg | grep -i usb
[    1.790133] usb 2-1.4: new high-speed USB device number 5 using sunxi-ehci
[    1.904844] scsi0 : usb-storage 2-1.4:1.0

Zur Behebung dieses Problems ist ein Modul namens usb_modeswitch erforderlich. Es lässt sich folgendermaßen installieren:

apt-get install ppp usb-modeswitch wvdial

Modeswitch bringt normalerweise für die meisten häufig verwendeten Geräte richtige Konfigurationsdateien mit. Nach der Installation von Modeswitch genügt ein Reboot, das Modem dürfte dann folgendermaßen erkannt werden:

root@orangepione:~# lsusb
. . .
Bus 002 Device 007: ID 05c6:6000 Qualcomm, Inc. Siemens SG75

Ist das auf Ihrem Prozessrechner nicht der Fall, so müssen Sie die Konfiguration anpassen – Informationen dazu finden sich in der Dokumentation zu Modeswitch. Ein weiteres interessantes Tutorial zur Thematik steht in den Ubuntuforen bereit.

Für die Interaktion zwischen Modem und Hostbetriebssystem steht eine Vielzahl von Skripten zur Verfügung. Wir wollen hier auf wvdial setzen: sakis3g ist ein nicht weniger populärer Vertreter dieses Genres. Nach der Installation des Pakets müssen Sie im ersten Schritt eine Basiskonfiguration anlegen. Dies erfolgt durch die Eingabe des folgenden Kommandos:

sudo wvdialconf /etc/wvdial.conf
Found a modem on /dev/ttyUSB0.
Modem configuration written to /etc/wvdial.conf.
ttyUSB0: Speed 9600; init "ATQ0 V1 E1 S0=0 +FCLASS=0"
ttyUSB1: Speed 9600; init "ATQ0 V1 E1 S0=0 +FCLASS=0"

wvdialconf kann nur dann ausgeführt werden, wenn das Modem schon mit dem Prozessrechner verbunden und ansprechbar ist. Während der Konfiguration sendet das Produkt an diverse Ports AT-Kommandos und notiert all jene, auf denen reagiert wird. Die daraufhin erstellte Datei etc/wvdial.conf ist anfangs für normale Modems konfiguriert – zur Nutzung mit 3G-Funksticks sind Informationen vom Netzbetreiber erforderlich. Die hier abgedruckten Daten gelten für Tesco Mobile in der Slowakei (Listing 3).

[Dialer Defaults]
Init1 = ATZ
Init2 = ATQ0 V1 E1 S0=0 +FCLASS=0
Init3 = AT+CGDCONT=1,"IP","o2internet"
Modem Type = Analog Modem
Baud = 9600
New PPPD = yes
Modem = /dev/ttyUSB0
ISDN = 0
Phone = *99#
Password = *
Username =  *

[Dialer sendpin]
Init1 = AT+CPIN=1304
Baud = 9600
Modem = /dev/ttyUSB0

Da mein Modem beim Eingeben der PIN mitunter merkwürdige Strings zurückgibt, muss ich den Verbindungsprozess in zwei Schritte aufteilen. Der sendpin-Block ist dabei für das Senden des Entsperrkommandos zuständig, während der Dial-Teil das eigentliche Verbinden erledigt.

Modems kommunizieren mit ihren Hosts über einen als AT bezeichneten Befehlssatz. Die AT*-Zeilen in der wvdial-Konfigurationsdatei beschreiben dabei die Kommandos, die nacheinander in Richtung des Funkmoduls gesendet werden. An dieser Stelle lohnt es sich, die SIM-Karte in ein beliebiges Smartphone zu stecken und eine Konfigurations-SMS vom Anbieter entgegenzunehmen.

Das eigentliche Verbinden per WV-Dial muss in zwei Schritten erfolgen: Im ersten Schritt wird das Kommando PIN abgearbeitet. Dies ist insofern notwendig, weil das Zurückgeben eines Fehlercodes WV-Dial zum Wiederabarbeiten des gesamten AT-Baums animiert. Da unser Qualcomm-Modem auf den PIN-Befehl meist mit einem Fehler reagiert, käme es so zu einer Endlosschleife (Listing 4).

root@orangepione:/dev# wvdial sendpin
--> WvDial: Internet dialer version 1.61
--> Initializing modem.
--> Sending: AT+CPIN=1304
+CME ERROR: operation not allowed
--> Bad init string.
--> Initializing modem.
--> Sending: AT+CPIN=1304
ERROR
--> Bad init string.
--> Initializing modem.
--> Sending: AT+CPIN=1304
ERROR
--> Bad init string.

Im zweiten Schritt kann die eigentliche Netzverbindung dann folgendermaßen aufgerufen werden. Achten Sie allerdings darauf, dass das Ethernetkabel zu diesem Zeitpunkt nicht verbunden sein darf – es kommt sonst zu Problemen bei der DNS-Konfiguration:

root@orangepione:/dev# wvdial

Nach dem erfolgreichen Abarbeiten des Kommandos – das Auswerfen von wenig vertrauenerweckenden Statusinformationen gehört zum Standardrepetoire des Programms – scheint die neue Verbindung in der Ausgabe von sudo ifconfig folgendermaßen auf:

ppp0    Link encap:Point-to-Point Protocol
        inet addr:100.123.150.167  P-t-P:10.64.64.64  Mask:255.255.255.255
        UP POINTOPOINT RUNNING NOARP MULTICAST  MTU:1500  Metric:1

Die „Schizophrenie“ meines Modems endet nicht bei der Initialisierung: Der Anschluss /dev/ttyUSB0 wird von WV-Dial belegt und kann nicht mehr zum Senden von Kommandos genutzt werden. Das ist allerdings kein großes Problem: Das Modem ist auch unter /dev/ttyUSB1 ansprechbar und lässt sich dort per socat um Statusinformationen erleichtern:

testuser@orangepilite:/dev$ echo "AT+CSQ" > /dev/ttyUSB1
testuser@orangepilite:/dev$ cat /dev/ttyUSB1
testuser@orangepilite:/dev$ echo "AT+CGMI" > /dev/ttyUSB1
testuser@orangepilite:/dev$ cat /dev/ttyUSB1
QUALCOMM INCORPORATED
OK

Achten Sie an dieser Stelle darauf, dass die verschiedenen Hersteller ihre eigenen AT-Kommandos implementieren. Im Zweifelsfall ist es ratsam, die Dokumentation des Funkmoduls zu konsultieren – führt dies nicht zum Ziel, können Sie auch einige Kommandos ausprobieren.

Fazit

Auch wenn es auf den ersten Blick unwahrscheinlich wirkt: Die Investition von rund 20 US-Dollar und etwas Arbeitszeit verwandeln den Orange Pi Lite in ein vollwertiges Steuersystem. Die hier vorgestellten Module lassen sich übrigens auch mit anderen Unix-artigen Prozessrechnern ausnutzen. Eben Upton gab uns USB – es wäre unfair, dieses Geschenk nicht anzunehmen!

Entwickler Magazin

Entwickler Magazin abonnierenDieser Artikel ist im Entwickler Magazin erschienen.

Natürlich können Sie das Entwickler Magazin über den entwickler.kiosk auch digital im Browser oder auf Ihren Android- und iOS-Devices lesen. In unserem Shop ist das Entwickler Magazin ferner im Abonnement oder als Einzelheft erhältlich.

Unsere Redaktion empfiehlt:

Relevante Beiträge

Meinungen zu diesem Beitrag

X
- Gib Deinen Standort ein -
- or -