Embedded Linux mit Gnublin

Autor: Hubert Högl <Hubert.Hoegl@hs-augsburg.de>
Datum: 2012-02-07

Inhalt

In diesem Artikel stelle ich den aktuellen Stand des Gnublin LPC3131 Projektes vor. Im gleich folgenden Abschnitt zeige ich zunächst für Neugierige eine beispielhafte Sitzung mit Gnublin.

1   Eine kurze Sitzung

Um mit dem Gnublin Board zu arbeiten, muss man zusätzlich nur zwei Sachen haben:

  1. Eine Micro SD Karte mit vorinstalliertem GNU/Linux für Gnublin.
  2. Ein USB Kabel zwischen der USB Konsolenbuchse auf dem Gnublin Board und einem Entwicklungsrechner (PC) unter GNU/Linux.

Auf dem PC startet man kurze Zeit nach dem Anstecken des USB Kabel ein Terminal Emulationsprogramm, z.B. picocom:

sudo picocom -b 115200 /dev/ttyUSB0

Man beendet ``picocom`` mit der Tastenkombination ``Strg-A Strg-X``. Sollte picocom noch nicht installiert sein, findet man es als Paket mit gleichem Namen in jeder GNU/Linux Distribution.

Damit wird der PC zur "Konsole" des Gnublin Boards, das heisst, man sieht die Meldungen des Boards auf dem Bildschirm und Tastatureingaben am PC werden an das Board weitergeleitet.

Nachdem das Board über das Konsolen USB Kabel angesteckt wurde, lädt es von der SD Karte zunächst den Apex Bootloader und führt ihn aus. Der Bootloader ist so konfiguriert, dass er nach einer kurzen Wartepause den Linux Kern von der SD Karte in den Speicher kopiert und dann ausführt. Linux bootet nun und mountet am Schluss das Root Filesystem von der SD Karte. An der Konsole sollte man nun sehen (die drei Punkte stehen für viele Ausgaben, die uns jetzt nicht interessieren):

...
EDLK (Built by Poky 5.0) 5.0 armv5te ttyS0

armv5te login:

Jetzt kann man sich mit dem Namen root anmelden (ohne Passwort) und sieht dann diesen Shell Prompt:

root@armv5te:~#

Nun kann man mit Gnublin (fast) wie auf einem gewöhnlichen GNU/Linux Rechner arbeiten. Das Root Filesystem enthält mit über 600 MByte Grösse eine sehr grosse Auswahl an Programmen, allerdings auch Programme, z.B. das X Window System, das die Gnublin LPC3131 Hardware nicht unterstützt.

Nun gibt man auf dem Shell Prompt ein:

root@armv5te:~# echo 3 > /sys/class/gpio/export
root@armv5te:~# echo out > /sys/class/gpio/gpio3/direction
root@armv5te:~# echo 1 > /sys/class/gpio/gpio3/value

Die rote LED auf dem Board sollte nun leuchten, da der value (Wert) des GPIO Pins 1 geworden ist (das entspricht 3,3 Volt Spannung). Sie ist zwischen SD-Karte und Erweiterungstecker direkt neben der grünen Betriebs-LED angebracht. Die LED ist an den GPIO Pin Nummer 3 angeschlossen, deswegen taucht die Zahl 3 im vorherigen Beispiel auf. Durch die Ausgabe einer Null (logisch 0 bzw. 0 Volt) auf den Pin erlischt die LED wieder:

root@armv5te:~# echo 0 > /sys/class/gpio/gpio3/value

Danach kann man den GPIO Pin 3 wieder "aufräumen" mit:

root@armv5te:~# echo 3 > /sys/class/gpio/unexport

Am Schluss schalten wir das Board mit dem Kommando halt aus:

root@armv5te:~# halt

Nach ein paar Sekunden gibt der Rechner die Meldung System halted. aus, danach kann man das USB Kabel wieder abstecken.

Viel mehr Informationen zum Ansteuern der Peripherie findet man auf der Gnublin Homepage http://www.gnublin.org.

gnublin-home.png

Die Homepage des Gnublin Projektes www.gnublin.org.

Insbesondere für Einsteiger gibt es dort folgende Informationen:

Wer schon etwas mehr Erfahrung mit Gnublin hat, wird sich in den Gnublin Application Notes umsehen und dort Anregungen für neue Experimente finden:

http://www.gnublin.org/index.php?title=ApplicationNotes

2   Ursprung und Ziele

2.1   Ursprung

Das Gnublin Projekt [1] läuft nun schon eine ganze Weile (seit 2010) und hat in dieser Zeit etliche Haken geschlagen. Ganz am Anfang stand die Idee, ein Board selber zu bauen, das für Embedded Linux tauglich ist und das wir in der Ausbildung an der Hochschule Augsburg in der Technischen Informatik den Studenten zu einem günstigen Preis anbieten können. Als Erfahrungswert für die Obergrenze des Preises haben sich etwa 50 Euro herausgestellt. Wenn der Preis diesen Betrag nicht übersteigt, kaufen sich erfahrungsgemäss viele Leute das Board und denken sich eigene Experimente damit aus. Früher haben wir das "NGW100" zu einem ähnlichen Preis bekommen, leider hat Atmel den AVR32 Controller eingestellt.

Das Board sollte von Anfang an einen Controller mit ARM Kern haben, gerne einen ARM926, der sehr weit verbreitet ist. Ich kann mich noch an ein selbstgemachtes Blockschaltbild mit dem Atmel SAM9G45 erinnern, der allerdings wegen des relativ hohen Preises und der schlechten Verfügbarkeit gegen einen Freescale i.MX287 eingetauscht wurde. Das war dann der Startschuss für die erste Phase des Gnublin-Projektes [3], eine sehr fruchtbare Zeitspanne, in der viel geplant und entwickelt wurde, in der Neues gelernt wurde und die zum Schluss dann auch die Pläne für ein 7x7 cm grosses Board mit dem i.MX287 hervorgebracht hat. Auf der Embedded World 2011 haben wir uns zum Beispiel deswegen über Löt-Verfahren informiert. Hergestellt wurde dieses Board bis jetzt nicht, da die rohen Platinen mit 8 Lagen bei kleinen Stückzahlen sehr teuer sind.

Die nächste Wende kam mit dem "Gnublin LPC3131" Board, bei dem Benedikt Sauter in einer Blitzaktion die Pläne radikal vereinfacht hat und eine Platine mit nur 2 Lagen daraus gemacht hat. Auf dem Board war nun ein preiswerter NXP LPC3131, bei dem viele der BGA-Bälle wegen der geringen Routing-Möglichkeiten der 2 Lagen nicht angeschlossen wurden. Ansonsten ist noch ein 8 MByte SDRAM Baustein und eine Micro-SD Karte als Massenspeicher drauf. Das entstande Board hat aber trotz seines minimalistischen Ansatzes viele Einsatzmöglichkeiten, einige werde ich auch im Folgenden ansprechen. Da die rohen Platinen bei 2 Lagen nur einige Euro kosten kann man nun auch viel unverkrampfter eigene Lötversuche mit BGA Gehäusen unternehmen. Die Materialkosten liegen bei dem Board mit etwa 20 bis 25 Euro nur unwesentlich höher als bei einem Board mit 8-Bit Controller.

2.2   Ziele

  • Günstig im Preis (<= 50 Euro)

  • Geeignet für Anfänger
    • Einfache Verwendbarkeit über 1 x USB
    • Natives Arbeiten auf dem Board mit Interpretersprachen
    • gnublin-installer verwaltet Micro-SD Karte
    • Anleitungen auf www.gnublin.org
  • Hostrechner mit Linux oder Windows

  • Transparenz der Bestandteile Bootloader, Kernel, Root-Filesystem

  • Alle Teile (auch Hardware) unter freier Lizenz

Ein ganz wichtiger Punkt war neben dem geringen Preis auch immer die einfache Verwendbarkeit des Boards, so dass Anfänger nicht schon bei den Vorbereitungsarbeiten wie der Verkabelung und der Stromversorgung abgeschüttelt werden. Als ultimative Lösung erschien mir immer eine einzige Verbindung mit einem USB Kabel zum Hostrechner, über das die Stromversorgung und auch die serielle Schnittstelle für die Konsole bereitgestellt wird. Deswegen gibt es auf Gnublin eine USB-zu-UART Bridge.

Als mögliche Interessenten für Gnublin stelle ich mir auch Leute vor, die bisher gar keine Erfahrung mit Linux gesammelt haben. Für sie soll es möglich sein, mit dem Board nativ in einer interpretierten Sprache zu arbeiten, zum Beispiel in der Shell, in Lua oder in Python, so dass Programme direkt auf dem Board entwickelt und getestet werden können. Je nach den Vorkenntnissen des Anwenders können aber auch Programme in C direkt auf dem Board kompiliert werden.

Eine wichtige Zutat zum Board ist die Micro-SD Karte, die den Bootloader, den Linux Kernel und das Root-Filesystem enthält. Da es für Anfänger nicht so leicht ist, eine neue Karte mit den frei herunterladbaren Bestandteilen zu bauen, gibt es das grafische Werkzeug gnublin-installer. Es übernimmt die Partitionierung, die Formatierung, den Download und das Kopieren der Dateien auf die Karte. Das Programm wird weiter unten kurz vorgestellt.

Ich könnte mir die Verwendung von Gnublin in Zukunft so vorstellen: Nach dem man sich das Board besorgt hat, steckt man es an den Linux Hostrechner, installiert das in allen Distributionen verfügbare Paket gnublin und kann dann mit dem Board arbeiten, das heisst man kann auf der Konsole arbeiten, oder die Micro-SD Karte beschreiben, oder Dateien zum/vom Board übertragen. Um mehr Windows-Anwender zu gewinnen, sollte es dieses Programm auch für Windows geben. Wie gesagt, das ist noch Zukunftsmusik, aber gar nicht in so weiter Ferne. Mit gnublin-installer ist bereits ein erster Schritt gemacht.

Zusätzlich hat das Gnublin Board eine Homepage [1], mit deren Hilfe man als Anfänger die wichtigsten einfachen Anwendungsfälle nachvollziehen kann. Neben Material für Anfänger gibt es aber auch Bereiche für fortgeschrittene Anwender, die sich eher in die Bereiche vorwagen, die mit Systemprogrammierung, mit Echtzeit und mit dem Kernel (Konfigurieren, Kompilieren, Treiber) zu tun haben, um nur ein paar Beispiele zu nennen. Ganz gerne würden wir auf gnublin.org auch Projekte vorstellen, die mit Gnublin gemacht wurden.

Klar ist, dass die Quellen für die Bestandteile Bootloader, Kernel und Root Filesystem (auch Schaltplan und Platinenpläne) mit den für Gnublin notwendigen Änderungen einfach zugänglich sind, so dass sich auch Aussenstehende daran bei der Weiterentwicklung beteiligen können - das fordert ja schon die Lizenz GPL. Bei allen Bestandteilen besteht ausserdem eine (zumindest einseitige) Verbindung zu den jeweiligen Upstream Projekten, das heisst, Gnublin sollte an den Änderungen, die in Upstream im Laufe der Zeit gemacht werden, teilhaben können. Das betrifft vor allem den Kernel und das Root Filesystem. Dazu weiter unten mehr.

3   Die Gnublin Hardware

Die folgende Abbildung zeigt alle wichtigen Teile auf dem Board:

gnublin-board-explained.png

Der LPC3131 ist ein Controller mit ARM926 Kern, der mit maximal 180 MHz Taktfrequenz läuft. Die Peripherie kommt nicht im Überfluss daher, reicht aber ideal für das, wofür Gnublin konzipiert wurde. Es gibt alle üblichen Schnittstellen wie GPIO, I2C, SPI, PWM und ADC, allerdings nur einen UART (Konsole). Vor allem hat der Controller jedoch eine high-speed USB OTG Schnittstelle, die sich als ideale Erweiterungsschnittstelle für Gnublin erweist. Da der Controller kein Ethernet MAC Modul hat, bietet es sich an, USB-zu-Ethernet Adapter oder USB-zu-WLAN Adapter anschliessen, um Gnublin mit einem Netzwerk zu verbinden.

Die folgende Abbildung zeigt die wesentlichen Peripherieblöcke des LPC3131:

lpc3131.png

Das BGA-Gehäuse des LPC hat 180 Pins in einer 14 x 14 Matrix mit 0,8mm Pin Abstand, in der Mitte fehlen 4 x 4 Pins (TFBGA180). Da die Platine nur zwei Lagen hat, mussten viele Pins offen gelassen werden.

Die Spannungsversorgung und die Konsole werden über eine Mini-USB Buchse auf das Board gebracht. Die USB Verbindung wird über eine CP2102 (Silabs) USB-zu-UART Bridge mit dem einzigen UART des LPC verbunden.

Es sind 8 MByte Arbeitsspeicher auf dem Board. Das Mobile SDRAM ist als 4M * 16 organisiert. Diese Speichergrösse ist zwar nicht gerade üppig, reicht aber für viele Anwendungen aus. An die Grenzen des Speichers stösst man jedoch, wenn man zum Beispiel mit gcc nativ auf dem Board kompilieren möchte (kleinere Programme dauern schon etwa 30 Sekunden und benötigen eine Swap-Datei auf der SD-Karte) Man kann das Board aber auch mit einem 32 MByte SDRAM Baustein bestücken.

Auf dem Board ist ausserdem ein Board Controller mit einem AVR Tiny45, der sich um die Sequenzierung der drei Spannungsversorgungen kümmert.

Die Stromaufnahme liegt bei etwa 85 bis 100 mA, was einer Leistungsaufnahme von etwa einem halben Watt entspricht.

3.1   Bedeutung der Jumper und I/O Steckverbinder

Das Gnublin Board verzichtet aus Gründen der Einfachheit auf technischen Schnickschnack und setzt vielmehr auf explizit gesetzte Jumper.

Wenn man über die USB-OTG Schnittstelle Geräte als Host ansteuern möchte, muss man den USB OTG PWR Jumper nach links stecken. Zusätzlich sollte man den USB OTG ID Jumper setzen.

Wenn Gnublin über einen externen USB Host angesteuert wird, zum Beispiel einem PC, muss man den USB OTG PWR Jumper nach rechts stecken und der USB OTG ID Jumper darf nicht gesetzt sein.

gnublin-1.3-refcard.png

Die Jumper und I/O Steckverbinder des Gnublin Boards.

Je nachdem woher die Stromversorgung des Board kommt, muss der Power Supply Jumper entweder rechts (USB Console) oder links (extern) gesteckt sein.

Das Board bootet im Normalfall von der SD Karte, deshalb wähle die Einstellung SD/MMC.

4   Die Betriebssoftware

Alle Teile der Betriebssoftware können von http://www.gnublin.org/downloads heruntergeladen werden.

4.1   Der Apex Bootloader

Wir verwenden den Apex Bootloader. Der Bootloader gibt den Prompt apex> aus, danach kann Kommandos eingeben. Um den Kernel aus der zweiten Partition (ext2) in den Speicher an die Stelle 0x30008000 zu kopieren und anschliessend zu starten laufen die folgenden Kommandos bei jedem Bootvorgang automatisch ab:

apex> copy ext2://2/zImage 0x30008000
apex> boot

Mit dem Kommando apex> help bekommt man eine Liste aller verfügbaren Kommandos.

Eine Anleitung zum Kompilieren findet man auf

http://www.lpclinux.com/LPC313x/LPC313xGettingstartedELDK

Die Anpassungen für Gnublin findet man hier:

http://elk.informatik.fh-augsburg.de/pub/eplpc3131/work_eplpc3131/apex/

Es gibt ausserdem auch den U-Boot Bootloader, allerdings ist dieser noch nicht für das Gnublin Board angepasst worden.

Der Bootvorgang

Im LPC3131 gibt es ein Boot-Programm im ROM (first level bootloader), das nach dem Starten verschiedene Quellen nach ausführbaren Daten abtastet. Die Schnittstellen UART, USB, SPI und SD/MMC können als Boot-Quellen verwendet werden. Nachdem im Normalfall die SD/MMC Karte gefunden wurde, wird der Bootloader von der Karte geladen. Die ausführbare apex.bin Datei ist etwa 50 KByte gross. Sie wird in das 192 KByte grosse interne RAM des LPC3131 geladen und dort ausgeführt (second level bootloader). Apex kann dann entweder interaktiv auf der Konsole bedient werden oder es kann ein Boot-Skript automatisch ablaufen. Um auf den Apex Prompt zu gelangen, muss man sofort nach dem Drücken des Reset Tasters die Tastenkombination Strg-C im Terminal-Programm eingeben.

Die Kernel Kommandozeile wird vom Bootloader wie folgt gesetzt:

console=ttyS0,115200n8 root=/dev/mmcblk0p2 ro rootwait

Das Apex Projekt findet man hier:

https://gitorious.org/apex

Eine kurze Beschreibung ist hier:

http://elinux.org/APEX_Bootloader

4.2   Der Kernel

Mitarbeiter von NXP und freie Entwickler haben den Linux Kernel 2.6.33 für den LPC3131 angepasst. Man findet die Quellen in folgendem Git Repository:

git://git.lpclinux.com/linux-2.6.33-lpc313x

Die für das Gnublin Board angepasste Version findet man hier:

ssh://git@elk.informatik.fh-augsburg.de:2222/gnublin-linux-2.6.33.git

Das Web Interface ist http://elk.informatik.fh-augsburg.de/cgi-bin/gitweb.cgi

Die Gnublin Anpassungen umfassen Änderungen wegen leichter Unterschiede in der Hardware und zusätzliche Treiber für bisher nicht unterstützte Schnittstellen, zur Zeit sind das ADC und PWM. Die Treiber wurden von Michael Schwarz und Nils Stek geschrieben, schönen Dank dafür (siehe [3]). Auch wurde die sysfs Unterstützung für die GPIO Pins eingebaut (Patch von lpclinux.com), so dass man die GPIO Pins in der üblichen Weise durch Zugriffe auf /sys/class/gpio/ verwenden kann. Zusätzlich gibt es von Michael Schwarz das gpio-module ([3]), das den Zugriff auf die GPIO Pins auf pragmatische Weise erlaubt.

Die Kernel Konfiguration

Die aktuelle Kernel Konfiguration .config findet man im Gnublin Downloadbereich.

Die wichtigsten Treiber sind als Module vorhanden. Wichtige Treiber, um Gnublin über USB als gadget anzusprechen oder um andere USB Geräte von Gnublin aus anzusprechen sind:

drivers/lpc313x_io/adc/
      lpc313x_adc.ko
drivers/lpc313x_io/pwm/
      lpc313x_pwm.ko
drivers/usb/class/
      cdc-acm.ko
drivers/usb/gadget/
      g_cdc.ko    g_file_storage.ko  g_printer.ko  g_zero.ko
      g_ether.ko  g_mass_storage.ko  g_serial.ko   gadgetfs.ko
drivers/usb/serial/
      cp210x.ko  ftdi_sio.ko  usbserial.ko
drivers/net/usb/
      asix.ko       cdc_subset.ko  pegasus.ko  zaurus.ko
      cdc_ether.ko  net1080.ko     usbnet.ko

In den Kernel einkompiliert ist die Unterstützung für die seriellen Busse SPI und I2C und für den GPIO Zugriff mittels sysfs.

Eine Anleitung zum Kompilieren des Gnublin Linux findet man auf der Gnublin Homepage.

4.3   Root Filesystem

Das Root Filesystem stammt vom Embedded Linux Development Kit (ELDK) in der Version 5.0 [8]. Vom Aufbau her ist es mit einer "richtigen" Distribution für einen grossen Rechner vergleichbar, zum Beispiel ist auch die Unterstützung für grafische Oberflächen dabei und auch der GNU Compiler gcc kann verwendet werden. Dadurch ist das Root Filesystem auch ziemlich gross (550 MByte). Alle grafischen Programme können bei Gnublin nicht verwendet werden, da man kein Grafikdisplay (zumindest keines der üblichen TFT Displays) anschliessen kann. Alle anderen textuellen Programme können verwendet werden.

Seit dem ELDK 5.1 gibt es auch kleinere Varianten des Root Filesystems.

Das ELDK ab der Version 5 wird mit einem mächtigen Distributionsbaukasten erzeugt, der auf OpenEmbedded und Poky Linux baut. Zusammengefasst werden diese Werkzeuge im Yocto Project [9]. Auf der ELDK Homepage findet man die "Baudaten" für die jeweiligen ELDK Distributionen, aus denen man sich die konkreten Distributionen selber kompilieren kann. Man braucht dazu aber einen schnellen Rechner mit viel Plattenplatz.

Neben dem ELDK lassen sich auch andere Root Filesysteme für Gnublin verwenden. Fast alle grossen Distributionen wie Debian, Gentoo, Fedora und andere bieten für ARM angepasste Varianten an, die bereits über riesige Paket-Archive mit vorkompilierten Programmen verfügen. Es wäre zum Beispiel relativ einfach möglich ein Debian für ARM (Architektur armel) auf die Gnublin SD Karte zu schreiben. Damit könnte man dann im Betrieb wie bei einem "grossen" Rechner mit dpkg und verwandten Werkzeugen zusätzliche Pakete aus dem Netz installieren.

So ganz einfach darf man sich den Umstieg auf ein neues Root Filesystems allerdings auch nicht vorstellen. Wenn man nur das "rohe" Dateisystem auf die SD Karte kopiert, bootet der Rechner mit Sicherheit nicht. Es müssen vorher einige Konfigurationsdateien angepasst werden, vor allem im Bereich des init Systems. Auch die Konfiguration von udev ist eine sensible Sache. Da ich bei beiden Sachen keine grosse Erfahrung mitbringe, habe ich beim ELDK mehr oder weniger durch Weglassen von Diensten irgendwann die Bootfähigkeit geschafft. Beim aktuellen Root Filesystem mit dem ELDK 5 ist an dieser Stelle also noch viel Platz für Verbesserungen (udev ist zum Beispiel jetzt noch abgeschaltet).

Im Laufe der Zeit wurde das Root Filesystem ergänzt um wichtige Programme:

Editoren

  • jove, zile (einfache Emacs-Klone)
  • nano (für Anfänger bedienbar)

Drahtlose Netzwerke

  • iwconfig und andere iw* Utilities, wpa_supplicant

Web

  • lighthttpd
  • CGI
  • lynx

Tools

  • screen
  • tree
  • wget
  • curl
  • netcat
  • gnuplot
  • rrdtool
  • lrzsz
  • alsa-utils
  • vorbis-tools (u.a. ogg123)

Interpretersprachen

  • Python 2.7.2
  • Lua 5.1.4
  • Jim (Tcl)
  • Squirrel
  • Hedgehog Lisp
  • gforth

4.4   Gnublin Installer

Der gnublin-installer ist ein GUI Werkzeug zum Partitionieren und Beschreiben der Micro-SD Karte. Das Programm hat Michael Schwarz [3] geschrieben. Der folgende Screenshot zeigt das Hauptfenster:

gnublin-installer.png

Das Programm wird auf dem Hostrechner unter Linux gestartet. Die Micro-SD Karte muss über einen Kartenleser in den PC eingesteckt sein. Der Installer zeigt alle Karten kleiner einer bestimmten Speicherkapazität an (z.B. 16G), man wählt die Karte aus und kann diese dann durch Knopfdruck, ohne die technischen Details zu kennen, so aufbereiten, dass sie in Gnublin eingesteckt sofort funktioniert. Dazu werden folgende Aktionen ausgeführt:

  • Löschen von vorhandenen Partition, erneute Partitionierung und anlegen eines Filesystems mit libparted.
  • Download von Bootloader, Kernel und Root Filesystem vom Gnublin Downloadbereich.
  • Kopieren der Daten auf die Karte.

Das Programm ist in der Sprache C geschrieben und verwendet WxWidgets, libparted, licurl und libarchive.

5   Was läuft bisher alles?

Im Laufe der letzten Monate haben sich bei mir wie bei einem Baukasten viele Hardware Erweiterungen und Werkzeuge um das Gnublin Board angesammelt. Die meisten habe ich in der folgenden Abbildung zusammengestellt:

gnublin-teile.png

Hier ist eine kurze Beschreibung zu den Teilen:

  1. Gnublin LPC3131 Board
  2. Micro SD Karte (1G, 2G, 4G)
  3. Adapter von Mini USB auf USB-A Buchse zum Anschliessen von USB Geräten an den USB OTG Host.
  4. USB zu Ethernet Adapter (mit "Pegasus" Chip)
  5. USB WiFi Adapter Asus WL-167G
  6. USB Bluetooth Adapter D-Link DBT-120
  7. USB zu Seriell Adapter mit Ftdichip FT2232
  8. USB zu Seriell Adapter mit Silabs CP2102 von http://ic-board.de
  9. USB Flash Dongle
  10. USB Audio Adapter Speedlink VIGO
  11. USB Hub zur allgemeinen Verwendung
  12. USB Hub zur allgemeinen Verwendung
  13. Diverse integrierte Schaltungen mit I2C oder SPI Schnittstelle
  14. USB Kartenleser für MicroSD Speicherkarten
  15. LEDs zum Anschliessen an GPIO Pins
  16. Schraubenzieher
  17. DOG Display 2x16 Zeichen mit SPI Anschluss
  18. Batterie/Akku (Vorsicht: Die extern eingespeiste Spannung darf nicht grösser als 6V sein! Bei der gezeigten 9V Blockbatterie muss also noch ein 5V Regler dazwischengeschaltet werden.)
  19. USB Kabel USB-A auf Mini-B

Ausserdem kann man die Octopus Erweiterung verwenden (siehe [6]). Octopus besteht nur aus einem Atmel AVR AT90USB1287, der mit einer Firmware ausgestattet ist, die es erlaubt, fast alle Schnittstellen des AVR ferngesteuert über USB zu nutzen. Eingesteckt in die Gnublin USB Host Schnittstelle kann man mit der liboctopus auf die Schnittstellen des Octopus zugreifen.

octopus.jpg

Der Sourcecode liegt hier:

http://embeddedprojects.googlecode.com/svn/trunk/OPEN-SOURCE/octopus_at90/

Den Schaltplan und weitere Informationen dazu findet man auf http://shop.embedded-projects.net.

Im folgenden ist eine Zusammenstellung der Experimente, die ich bisher mit Gnublin gemacht habe, ein paar stammen auch von [3]:

UART

  • USB-zu-Seriell Adapter
    • Mit Silabs CP210x
    • Mit Ftdichip FT232/FT2232
  • Programmierung der seriellen Schnittstelle in C (librs232) und Python (pyserial).

Netzwerk
  • USB-zu-Ethernet Adapter
    • Noname Produkt mit pegasus Chip
    • D-Link DUB-E100 (asix)
  • USB-zu-WiFi Adapter
    • Asus WL-167G (rt2500)
    • Asus WL-167G V3 (RTL8192SU)
    • Patriot 802.11n USB Adapter (RTL8192SU)
    • D-Link WiFi Stick (rt73)
Webcam
  • gspca Treiber

GPIO

  • Rote LED ein-/ausschalten
  • Tasten lesen

SPI

  • DOG Display 2x16 Zeichen mit SPI Schnittstelle

I2C

  • PCA9555 I/O Expander
  • PCF8574 I/O Expander

PWM

  • PWM Signal mit bestimmten Puls/Pausen-Verhältnis ausgeben

ADC

  • Test des ADC Treibers.

Web/CGI

  • Einfaches CGI Skript in C, Perl und Python, das durch lighttpd aufgerufen wird.

Audio

  • Alsa und ogg-vorbis Tools installiert. Mit einem USB Audio Adapter ogg Dateien wiedergegeben.

Wie soll man Anwendungen schreiben?

Mein Vorschlag wäre, dass man möglichst alle Eigenschaften des Boards aus Skriptsprachen nutzen kann. Es gibt einige interpretierte Sprachen, die man auf Gnublin nutzen kann, z.B. Python, Perl, Lua oder Squirrel. Dann gibt es auch noch die bash Shell. Ganz exotisch dürften für die meisten GNU Forth (gforth) oder Hedgehog Lisp sein. Alle diese Sprachen kann man auf Gnublin verwenden.

Die aus meiner Sicht "beste" Sprache für eine komplette interpretierte Programmierumgebung ist Python [10]. Volker Thoms hat sich schon in [4] mit dem Thema auseinandergesetzt, ob man die gängigen Schnittstellen für die Mikrocontrollerprogrammierung wie GPIO, UART, SPI, I2C, CAN aus Python heraus verwenden kann. Es geht sogar sehr gut, wie sich herausstellte. Die dabei entstandenen Python Module kann man sehr einfach auf Gnublin übertragen. Die Programmierung in Python ist für den Anfänger wesentlich einfacher erlernbar als andere Sprachen, vor allem C und Shell Skripte.

Das Gnublin Home-Verzeichnis enthält viele Code-Schnipsel in unterschiedlichen Sprachen. Zur Zeit sieht es etwas unaufgeräumt aus:

TERATERM.INI  demo.py                hello.py            octopus
adc           dmesg.txt              i2c-device.sh       prozesse.txt
blink-two.sh  gnuplot                i2c-pca9555         pwm.c
blink.lua     gnuplot-nox-4.4.0.tgz  input.nut           spi
blink.sh      go                     input.sh            usb-eth.sh
blink2.lua    gpio-int-test          libusb-0.1.12-demo
cyclic.sh     gpio14.sh              lighttpd-init.sh
demo.pl       hello.fs               mount-usbfs.sh

In Zukunft findet man diese Schnipsel auch auf der Gnublin Homepage. Die Homepage enthält ausserdem Application Notes, wie man die aufgeführte Hardware an Gnublin in Betrieb nehmen kann.

6   Ausblick

Mit Gnublin ist es möglich, preiswerte, kleine und tragbare Geräte selber zu bauen, die eine oder mehrere der folgenden Anforderungen haben:

  • Einlesen von Sensoren für
    • Temperatur
    • Luftfeuchtigkeit
    • Luftdruck
    • Windgeschwindigkeit
    • Beschleunigung (ich teste gerade 3-Achsen Accelerometer an Gnublin)
    • viele andere ...
  • Ansteuern von
    • LEDs
    • Kleinen Displays
    • Tastern
    • Motoren
    • Servos
    • beliebige Erweiterungen über SPI und I2C
  • Funkkommunikation über low-power RF Module, z.B. Nordic nRF24L01 oder TI CC2420 oder ähnliche.

  • GSM/GPS Module

Ein paar beispielhafte Anwendungen, die man realisieren könnte:

  • Autonome Datenlogger die über längere Zeit Umgebungsdaten auf die SD Karte aufzeichnen, z.B. Temperaturen in einem Passivhaus.
  • GPS Logger
  • Fernwartung über GSM Mobilfunk
  • Solargespeiste Wetterstation mit Funkanbindung (WLAN, 802.15.4)
  • Heizungssteuerung
  • Vernetzte Sensorknoten (drahtlos mit IEEE 802.15.4)
  • Uhren bzw. Wecker
  • Steuerung der LED Beleuchtung für ein Puppenhaus (ist bald meine Aufgabe)
  • Jonglier-Keulen mit eingebauten Beschleunigungssensoren und Beleuchtung (interessanter Vorschlag eines ehemaligen Studenten, der in seiner Freizeit jongliert)

Bei allen diesen Beispielen steht die Anbindung an ein Netzwerk im regulären Betrieb nicht im Vordergrund, sondern eher die kompakte Bauweise und der stromsparende Betrieb aus Batterien oder Akkus.

7   Literatur

[1] Gnublin Homepage

www.gnublin.org

[2] Gnublin i.MX287

http://elk.informatik.fh-augsburg.de/hhwiki/Gnublin

[3] Gnublin auf mikrocontroller.net

http://www.mikrocontroller.net/topic/237277

[4] Volker Thoms, "Mikrocontrollerprogrammierung mit Python", 2010

http://elk.informatik.fh-augsburg.de/da/da-49/

[5] Community für den LPC3131 (Kernel, Root-Filesystem und anderes)

http://www.lpclinux.com

[6] Octopus an Gnublin

http://www.gnublin.org/index.php?title=AppNote-AP0002

[7] Embedded Projects Journal

http://journal.embedded-projects.net

[8] Embedded Linux Development Kit (ELDK)

http://www.denx.de/wiki/ELDK-5/WebHome

[9] Yocto Project

http://yoctoproject.org

[10] Die Sprache Python

http://www.python.org