1 Octopus

Autor:

Hubert Hoegl <Hubert.Hoegl@hs-augsburg.de>

Datum:

2008-04-07

Diese Notizen beschreiben meine Erfahrungen mit dem kleinen „Octopus“ Platinchen, das man über den USB Bus des PC von Linux oder Windows aus ansteuern kann. Als wesentliche Bauelemente sind ein USB Controller USBN9604 von National und ein frei programmierbarer Ein-/Ausgabeprozessor AVR Mega128 von Atmel drauf. Der USB Baustein erledigt nur die ganz elementaren Funktionsblöcke des USB Protokolls, der Hauptteil des Protokolls wird in Software („Firmware“) auf dem AVR erledigt. Die Platine eignet sich für die unterschiedlichsten Projekte, bei denen man mit der Aussenwelt frei programmierbar über externe Ports, Busse wie I2C, SPI und CAN, UARTs, Analogsignale, PWM Signale und Timer kommunizieren muss. Sogar die Sprache zur Ansteuerung des Octopus ist wählbar, zur Zeit gibt es Anbindungen an C, C++, Java, Python und Ruby. Letztendlich sind alle Sprachen möglich, die Swig (http://www.swig.org) unterstützt. Die komplette Software im und um den Octopus ist freie Software unter der GPL Lizenz, das heisst sie ist frei im Sinne der Free Software Foundation.

Den Octopus Bausatz kann man im Web-Shop des Autors Benedikt Sauter kaufen, siehe http://embedded-projects.net.

_images/octopus.jpg

1.1 Installation

Octopus (Version 3) ist ein vormontierter Bausatz, bei dem nur noch ganz wenige Bauteile eingelötet werden müssen. Es genügt, wenn man den 10-poligen Wannenstecker einlötet, damit man einen Programmieradapter für den Mega128 AVR anstecken kann.

1.1.1 Octopus Software herunterladen und kompilieren

Die aktuelle Version der Octopus Software kann man mit Hilfe des svn Werkzeugs aus einem zentralen „Repository“ herunterladen. Ich habe das wie folgt gemacht:

Zunächst exportiere ich das Verzeichnis „trunk“ in das aktuelle Verzeichnis:

svn export http://octopususb.googlecode.com/svn/trunk

Am Schluss des Exports wird die aktuelle Version ausgegeben, das war bei mir Version 118. Nun legen ich ein Verzeichnis ~/build/octopus-118 in meinem Heimatverzeichnis an, in das ich dann trunk mit mv trunk octopus-118 hinein bewege.

Nun muss die Software kompiliert werden. Als erstes wechsle ich in:

~/build/octopus-118/trunk/liboctopus/

und rufe sh ./bootstrap auf. Danach ruft man im gleichen Verzeichnis das Kommando ./configure``auf. Wenn nach einer Weile configure fertig ist, kann man ``make aufrufen. Das Resultat von make ist die „liboctopus“, die zunächst (vor der Installation) unter src/.libs (der Punkt ist wichtig!) liegt:

liboctopus.a   liboctopus.lai  liboctopus.so.0       octopus.o
liboctopus.la  liboctopus.so   liboctopus.so.0.10.0

Durch sudo make install werden diese Bibliotheken an den endgültigen Platz im Dateibaum installiert. In diesem Fall ist das /usr/local/lib/.

Neben der ganz wesentlichen liboctopus kann man auch noch einen oder mehrere „Wrapper“ für die Ansteuerung unter einer Skriptsprache installieren. Diese findet man unter:

~/build/octopus-118/trunk/libs/

Wählen wir Python aus, dann geht es in das Verzeichnis python/. Hier reicht die Eingabe von make aus, um den Wrapper zu erzeugen. Dieser besteht aus mehreren Dateien mit den Endungen .o, .pyc, .pyd und .so. Man kann nun noch den Wrapper mit make install installieren. Dieser letzte Schritt kopiert die Python Anbindung an die Stelle:

/usr/local/lib/python2.4/site-packages/

Nachdem man den Python Interpreter mit dem Kommando python gestartet hat, kann man nun das Modul octopus importieren:

>>> import octopus

Die darin enthaltenen Objekte werden mit dem Kommando:

>>> dir(octopus)

ausgegeben. Wichtig ist, dass man die Version 2.4 des Interpreters verwendet, da vorher für diese Version auch der Wrapper erstellt wurde. Falls der Aufruf von python zur falschen Version führt, dann kann man auch explizit python2.4 eingeben. Natürlich würde der Python Code auch mit einer neueren Version, z.B. 2.5, laufen. Dann müsste aber vorher auch wieder der Wrapper-Code für Python 2.5 erstellt werden.

1.1.2 Programmierung des Mega128

Ich habe zum Programmieren des Mega128 das avrdude Programm unter Linux verwendet. Dieses Programm kann sehr viele verschiedene Adapter für den ISP Programmier-Port ansteuern. Einer der einfachsten ist der „BSD“ Adapter (nach dessen Erfinder Brian S. Dean), den man direkt an den Drucker-Port des Rechners anschliesst. Die folgenden Signale werden beim „BSD Kabel“ direkt vom Parallelport mit dem 10-poligen ISP Stecker verbunden:

25-pin Parallelport     10-pin ISP (Pin in Klammern)
----------------------------------------------------
      7                 /RESET (3)
      8                 SCK (7)
      9                 MOSI (1)
     10                 MISO (9)
     18                 GROUND (4,6,8,10)

Damit avrdude auf den Drucker-Port (heisst auch „Parallel-Port“) kommt, muss das Gerät /dev/parport0 unter Linux existieren. Falls es nicht vorhanden ist, kann man es mit dem Kommando:

sudo mknod /dev/parport0 c 99 0

anlegen.

Ist nun das Programmierkabel angeschlossen, dann kann man avrdude wie folgt aufrufen:

sudo avrdude -p m128 -c bsd

Es sollte als Ausgabe in etwa erscheinen:

avrdude: AVR device initialized and ready to accept instructions
Reading | ################################################## | 100% 0.00s
avrdude: Device signature = 0x1e9702
avrdude: safemode: Fuses OK
avrdude done.  Thank you.

Falls dies funktioniert, kann man die Firmware in den Mega128 schreiben - man nennt das auch „flashen“. Die Firmware findet man im Quelltext unter:

~/build/octopus-118/trunk/firmware

Man muss diese zunächst mit dem Kommando make kompilieren. Daraus resultieren die beiden Dateien main.hex und octopus.hex. Beide Dateien sind im Intel Hex Format. Ausprobieren hat ergeben, dass nur main.hex zur gewünschten Funktion des Octopus führt, deshalb wird diese nun geflasht:

sudo avrdude -p m128 -c bsd -U flash:w:main.hex

Nun müssen noch die „Fuse-Bits“ im AVR auf bestimmte Werte gesetzt werden, damit der Controller z.B. mit der richtigen Frequenz läuft:

avrdude -p m128 -c bsd -U lfuse:w:0xe0:m
avrdude -p m128 -c bsd -U efuse:w:0xff:m
avrdude -p m128 -c bsd -U hfuse:w:0xdd:m

Alternative: USBprog

Statt des BSD Kabel kann man alternativ auch den „USBprog“ Adapter verwenden, der auch von Benedikt Sauter stammt. Dazu konfiguriert man USBprog als avrispv2 Gerät, das entspricht der gleichen Funktionalität wie es das originale Gerät AVRISP mkII von Atmel hat. Gegenüber dem BSD Kabel hat USBprog den Vorteil, dass es wegen des USB Anschlusses auch an jedem modernen PC oder Notebook funktioniert, die ja oft keinen Parallelport mehr haben. In den oben angegebenen avrdude Kommandozeilen ersetzt man einfach -c bsd durch -c avrispv2.

Diesen Adapter kann man ebenfalls von http://www.embedded-projects.net beziehen.

Tipp: Makefile in trunk/firmware/

Die zwei wesentlichen Operationen mit avrdude, erstens Download und zweitens Fuse Programmierung, sind auch als Targets im Makefile in trunk/firmware/ enthalten:

make download
make fuse

1.2 Demos

Der Demo-Sourcecode ist hier:

http://hhoegl.informatik.hs-augsburg.de/etc/octopus_demo/

Das Beispiel blink_hh.py schaltet die sieben LEDs in einer Reihe auf der Octopus Platine in kurzer Abfolge 100 mal ein und wieder aus. Die sieben LEDs sind beim Mega128 an den Port PC[0:6] angeschlossen.

1.3 Zu tun

  • Einige API Funktionen sind noch nicht implementiert, z.B. octopus_io_set_port().

  • Python Binding geht zur Zeit (Okt 2008) nur mit Python 2.4.

1.4 Weitere Tipps

Eine Projektgruppe sagte mir heute (2008-10-30), dass man bei Ubuntu 8.04 („Hardy“) noch folgende Pakete installieren muss, damit man liboctopus kompilieren kann: autoconf, automake, libtool und python-dev. Das macht man mit sudo apt-get install <paketname>. Danach geht es weiter wie oben beschrieben.

1.5 Referenzen