Nachdem ich die letzten Abende damit verbracht habe, den NiboBurger unter Linux und Arduino zum Laufen zu bringen, hier eine Zusammenfassung der Erfahrungen und Ergebnisse, auf dass sie anderen Suchenden helfen mögen. Insgesamt muss man sich die Informationshäppchen recht aufwändig zusammentragen, daher hier mal der Versuch einer zusammenhängenden Dokumentation für einen speziellen Fall:
== 1. Installieren von Arduino und avrdude ==
Bei mir unter Manjaro sind das vor allem die folgenden Pakete:
community/arduino-avr-core 1.6.20-1
community/avr-binutils 2.30-1
community/avr-gcc 7.3.0-1
community/avr-libc 2.0.0-1
community/avrdude 1:6.3-3
== 2. Aktuelle Version der NiboRoboLib herunterladen und compilieren ==
Da auschecken über svn (bei mir) nicht funktioniert, lädt man sich auf
sourceforge.net/p/nibo/code/HEAD/tree/ den Snapshot herunter und entpackt das Archiv in ein Verzeichnis. (Bei mir: Revision 324)
Im nibo_robo_lib Verzeichnis:
> make clean
> make
make führt zu einigen kleinen Problemen mit fehlenden const Feldern (vor allem in nibo2 und nibobee code), die sind aber leicht zu fixen, oder man deaktiviert die Sub-Targets im Makefile. (Einen Patch könnte ich eventuell auch anbieten...)
Nach einem erfolgreichen make findet man die NiboBurger spezifischen hex-Dateien unter "hex/niboburger-m16-15/"
== 3. Flashen des Roboters mit avrdude und eigene C-Programme ==
Das geht von der Kommandozeile mit avrdude. Zum Beispiel für das Test-Programm:
> avrdude -c usbasp -p m16 -U hex/niboburger-m16-15/first.hex
Das first.hex behebt bei mir übrigens auch den bekannten Fehler mit LED 3, der mehrfach im Forum beschrieben ist. Klappt aber nur mit der aktuellen svn Revision und nicht mit der Release-Library.
Wird nun ein "Permission Denied" Fehler angezeigt, dann hilft temporär "sudo".
Um USB-Mikrocontroller automatisch für User zugänglich zu machen legt man eine Regel in "/etc/udev/rules.d/" an. Bei mir ist es die folgende:
> cat /etc/udev/rules.d/99-avr.rules
# AVR controllers
SUBSYSTEMS=="usb", ATTRS{idVendor}=="16c0", ATTRS{idProduct}=="0479", GROUP="users", MODE="0660"
SUBSYSTEMS=="usb", ATTRS{idVendor}=="1781", ATTRS{idProduct}=="0c9f", GROUP="uucp", MODE="0660"
SUBSYSTEMS=="usb", ATTRS{idVendor}=="16c0", ATTRS{idProduct}=="05dc", GROUP="uucp", MODE="0660"
Die Regel, die usbasp.2011-05-28.tar.gz von
www.fischl.de enthält funktioniert zumindest bei mir nicht.
Einfache eigene C-Programme erstellt man z.B. in dem man in code/niboburger/test/ eines der Beispielprogrammverzeichnisse kopiert und anpasst. Entsprechend zu den Änderungen in Pfad und Dateinamen muss das Makefile im Verzeichnis und code/niboburger/Makefile ergänzt werden, wenn man das globale make verwenden möchte.
== 4. NIBOBBurger Library in aktueller Arduino-UI (1.8.5) / (Arduino 1.6.19) einbinden ==
Die Sourcen für Arduino befinden sich (u.a.) im Verzeichnis arduino16, müssen aber auch zum Teil noch dort hin kopiert werden. Das sollte eigentlich das dortige Makefile erledigen, aber das "all" Target ist kaputt. Daher müssen die entsprechenden Subtargets aufgerufen werden:
> cd arduino16/
> make update-burger
Danach wird der Inhalt der Verzeichnisse libraries und hardware in die passenden Verzeichnisse der Arduino-Installation kopiert. (Bei mir ~/Arduino):
cp -R libraries/NIBOburger/ ~/Arduino/libraries/
cp -R hardware/* ~/Arduino/hardware/
cp ~/Arduino/hardware/nicai/avr/platform_1619.txt ~/Arduino/hardware/nicai/avr/platform.txt
rm ~/Arduino/hardware/nicai/avr/platform_16*
Damit es wirklich mit der aktuellen Arduino-Version funktioniert muss allerdings noch die platform.txt angepasst werden. Dazu habe ich basierend auf arduino16/hardware/nicai/avr/platform_167.txt und der aktuellen Spezifikation von Arduino auf github (
github.com/arduino/Arduino/blob/master/hardware/arduino/avr/platform.txt) eine Datei platform_1619.txt erzeugt. (Ganz aktuell wäre wohl inzwischen 1.6.21). Die platform-Datei muss schließlich noch in platform.txt umbenannt werden.
Nun sollte Arduino verwendet werden können. Vorhandene Funktionen kann man recht bequem in der Header-Datei der Bibliothek finden. Aber Vorsicht, nicht alle Funktionen sind wirklich implementiert. (Z.B. SensorClass::activate).
void SensorClass::activate(unsigned char mode) {
switch(mode) {
case SENSOR_DISABLED: // digital bit disconnected
case SENSOR_PULSE: // toggle digital bit
case SENSOR_LOW: // digital bit output low (0 V)
case SENSOR_HIGH: // digital bit output high (5 V)
break;
}
}