AVR – Arbotix and arduino development environment setup

Dieser Artikel beschreibt die Einrichtung einer Entwicklungsumgebung in Linux und Windows für die Programmierung eines Arbotix-RoboControllers. Leider ist der Arbotix-RoboController nur in Amerika verfügbar und muss importiert werden. Vertrieben wird er von der Firma Vanadiumlabs. Voraussetzung ist ein Arbotix-Controller von Vanadiumlabs und ein AVR-ISP-Programmer (DIAMEX ALL-AVR in diesem Beispiel). Eine FTDI- oder eine XBEE-Wireless-Verbindung ist Voraussetzung für die spätere serielle Bus-Kommunikation. Der Arbotix-Controller ist ausgelegt für die Steuerung von Dynamixel Motoren – in diesem Fall AX-12A mit 15kg/cm Haltekraft. Ein Bioloid Roboter hat AX-12A Motoren verbaut und bietet 18 Freiheitsgrade (DOF – Degrees Of Freedom). Am Ende dieses Artikels wir der Bioloid-Premium-Roboter von seinem Robotis-Controllerboard CM-530 befreit und mit einem Arbotix-RoboController bestückt. Der Vorteil des Arbotix gegenüber dem CM-530 ist, dass man später ROS verwenden kann.

Quellennachweis:
Arbotix – http://vanadiumlabs.com/arbotix.html
Arduino – http://http://www.arduino.cc/

Arduino-Installation
http://www.arduino.cc/playground/Learning/Linux
Arbotix-Installationhttps://code.google.com/p/arbotix/wiki/GettingSetup

AVR - Arbotix - Bioloid Premium Assembled

Virtuelle Maschine mit Ubuntu 64 Bit

Hinweis: Mit VMWare ist es NICHT möglich, über die serielle Schnittstelle den Arbotix-Controller mit einer Firmware zu bespielen. Die Übertragung der Firmware auf den Arbotix hat schließlich über den direkten Anschluss auf dem Host geklappt. Alles andere (PyPose, NUKE usw.) funktioniert auch aus der virtuellen Maschine heraus.

Arduino IDE

Die Arduino-Entwicklungsumgebung ab Version 1.0 enthält gcc, avr-gcc, Java VM, und nötige Bibliotheken für die Arbeit mit AVR-Mikrocontrollern. Seit der Version Arduino 1.0 wurden viele syntaktische Änderungen vorgenommen, so dass Sketchbook-Dateien (*.pde) von ehemaligen Arduino-IDEs nicht zwangsläufig unter der neuen Version laufen. In diesem Artikel wird aus Kompatibilitätsgründen Arduino 0023 geladen und eingerichtet.

Voraussetzung: root-Rechte oder sudo-Eintrag in /etc/sudoers

Download/Installation Arduino IDE

http://www.arduino.cc/playground/Learning/Linux

1. Apt-Repositorien aktualisieren.

apt-get update

2. Download Arduino 0023.

wget http://files.arduino.cc/downloads/arduino-0023-64.tgz

3. Arduino 0023 auspacken.

tar xvfz arduino-0023-64.tgz

4. Java ,AVR-Programme und Bibliotheken installieren

apt-get install openjdk-7-jre gcc-avr avr-libc

5. Arduino starten; erstellt einen Ordner „sketchbook“ in /home/Benutzername.

./arduino-0023/arduino

Download/Installation Arbotix

1. Download Arbotix Firmware, PyPose & Nuke.

wget https://arbotix.googlecode.com/files/arbotix-0014.zip

2. Arbotix Firmware, PyPose & Nuke nach Ordner arbotix-0014 auspacken und in den Ordner wechseln.

mkdir arbotix-0014
unzip arbotix-0014.zip -d arbotix-0014
cd arbotix-0014

Die nächsten Schritte sind auch auf den Wiki-Seiten von Arbotix Robocontroller beschrieben.

3. Arbotix-Unterordner nach /home/Benutzername/sketchbook kopieren. Der Ordner „arbotix“ muss in einen Ordner „hardware“ innerhalb sketchbook.

mkdir ~/sketchbook/hardware
cp -r /Pfadangabe/zu/arbotix-0014/arbo* ~/sketchbook/hardware
cp -r /Pfadangabe/zu/arbotix-0014/* ~/sketchbook

4. Wenn keine Fehler mehr erscheinen, kann man wie im Windows-Abschnitt verfahren.

Test & Fehlerbehebung

1. Mögliche Fehler während dem Ausführen von Arduino und compilieren einer *.pde-Datei

1.1 error: expected identifier or ‘(’ before ‘double’ …

Dieser Fehler ist hier beschrieben, allerdings bezieht sich die Fehlerbeschreibung auf Arduino-Boards.
Zeile 79 auskommentieren in Hardware->Arbotix.

vi /Pfadangabe/zu/arduino-0023/hardware/arbotix/cores/arbotix/wiring.h

79: #define round(x)     ((x)>=0?(long)((x)+0.5):(long)((x)-0.5))

1.2 avrdude: ser_open(): can’t open device „COM1“: No such file or directory

In Programmer.txt ist das Kommunikationsprotokoll auf „serial“ gesetzt. Es muss bei einem USB-Gerät auf „usb“ gesetzt sein.

avrispmkii.communication=usb

1.3 Geräte-Berechtigungen fehlen für Benutzer ohne root-Rechte.
avrdude: usb_open(): cannot read serial number „error sending control message: Operation not permitted“
avrdude: usb_open(): cannot read product name „error sending control message: Operation not permitted“
avrdude: usbdev_open(): error setting configuration 1: could not set config 1: Operation not permitted

Die Geräteberechtigungen für den Benutzer reichen nicht aus und müssen erweitert werden. Das Gerät muss angeschlossen sein. Die Geräte-ID und Vendor-ID erfährt man mit „lsusb“.

a) Eine neue „rules“-Datei für den udev-Dämon anlegen.

vim /etc/udev/rules.d/10-local.rules

b) Gerät beim Einhängen in das System mit erweiterten Benutzerrechten hinzufügen. Die Werte für idVendor und idProduct erhält man mit „lsusb“.

# USB DIAMEX programmer
ATTRS{idVendor}=="03eb", ATTRS{idProduct}=="2104", GROUP="dialout", MODE="0660"

c) udev neu starten oder Gerät entfernen und erneut hinzufügen.

service udev restart

d) Gerät entfernen und erneut hinzufügen. Neue Geräte werden in /dev/bus/usb/00bus/00id eingehängt. Wobei bus der USB-Bus ist und id die Geräte-ID.

ls -l /dev/bus/usb/002/008
Ausgabe der Konsole: crw-rw-r-- 1 root dialout 189, 131 Aug 30 19:53 /dev/bus/usb/002/008

1.4 Media Transfer Protocol (MTP – libmtp) verhindert das Einbinden des DIAMEX-USB-Programmers

Fehlerhaftes Einbinden laut /var/log/messages:
Aug 30 19:40:16 beep kernel: [ 7048.356290] usb 2-1: new full-speed USB device number 3 using uhci_hcd
Aug 30 19:40:16 beep mtp-probe: checking bus 2, device 3: „/sys/devices/pci0000:00/0000:00:11.0/0000:02:00.0/usb2/2-1“
Aug 30 19:40:21 beep mtp-probe: bus: 2, device: 3 was not an MTP device

Fehlerfreies Einbinden laut /var/log/messages (ohne libmtp):
Aug 30 19:50:36 beep kernel: [ 7668.809185] usb 2-1: USB disconnect, device number 3
Aug 30 19:50:41 beep kernel: [ 7674.048140] usb 2-1: new full-speed USB device number 4 using uhci_hcd
Aug 30 19:50:58 beep kernel: [ 7690.309097] usb 2-1: reset full-speed USB device number 4 using uhci_hcd
Aug 30 19:53:38 beep kernel: [ 7850.944286] usb 2-1: reset full-speed USB device number 4 using uhci_hcd

a) libmtp in udev deaktivieren in Datei 69-libmtp.rules oder 39-libmtp.rules bei älteren Systemen. Zeile 884 (oder 735 bei älteren Systemen) folgende Zeile kommentieren:

ENV{ID_MTP_DEVICE}!="1", ENV{MTP_NO_PROBE}!="1", ENV{COLOR_MEASUREMENT_DEVICE}!="1", ENV{libsane_matched}!="yes", ATTR{bDeviceClass}=="00|02|06|ef|ff", PROGRAM="m    tp-probe /sys$env{DEVPATH} $attr{busnum} $attr{devnum}", RESULT=="1", SYMLINK+="libmtp-%k", MODE="660", GROUP="audio", ENV{ID_MTP_DEVICE}="1", ENV{ID_MEDIA_PLAYER}    ="1"
vi /lib/udev/rules.d/69-libmtp.rules

1.5 AVR-ISP reagiert nicht

Betriebstest des AVR-ISP-Programmer mit Avrdude. Wenn das nicht hilft, dann könnte es an der Kabelverbindung liegen oder die Verbindung auf dem Board ist falsch herum eingesteckt. Die meisten Geräte quittieren, wenn sie es denn tun, eine korrekte Verkabelung mit einem grünen Licht.

./avrdude -pm644p -cavrispmkii -Pusb -C avrdude.conf
./avrdude -pm644p -cavrispmkii -C avrdude.conf -Pusb: xxx -v

Virtuelle Maschine mit Win7 64 Bit

Hinweis: Mit VMWare ist es NICHT möglich, über die serielle Schnittstelle den Arbotix-Controller mit einer Firmware zu bespielen. Die Übertragung der Firmware auf den Arbotix hat schließlich über den direkten Anschluss auf dem Host geklappt. Alles andere (PyPose, NUKE usw.) funktioniert auch aus der virtuellen Maschine heraus.

Arduino IDE

Die Windows-Arduino-Entwicklungsumgebung enthält gcc, avr-gcc, Java VM, und nötige Bibliotheken für die Arbeit mit AVR-Mikrocontrollern. Version Arduino 1.0 und höher verwendet *.ino als Dateiendung und enthält viele syntaktische Änderungen. Aus Kompatibilitätsgründen wird Arduino 0023 geladen und eingerichtet. Arduino erstellt auf einem Windows-System keinen Ordner „sketchbook“, aber einen Ordner „Arduino“ in %USERPROFILE%Documents.

Um den DIAMEX ALL AVR ISP-Programmer verwenden zu können, habe ich zuerst AVR-Studio4 als Treiber installiert. Danach mit einer libusb-win32 inf-wizard.exe die nötigen USB-Treiber nachinstalliert. Das Problem war, dass ein AVR-ISP-Gerät am USB-Anschluss präsent sein muss, um mit inf-wizard.exe die libusb-Treiber erstellen und installieren zu können. Sind die libusb-Treiber installiert, kann der von AVR-Studio installierte jungo->AVR-ISP Treiber deinstalliert werden. Danach hängt sich der AVR-ISP unter libUSB-Win32 Devices ein. Will man dennoch mit AVR-Studio arbeiten, bleibt nichts anderes übrig, als den umgekehrten Weg zu gehen (AVR-ISP Treiber unter libUSB-Win32 Devices deinstallieren).

Voraussetzung: Administrator-Rechte

Download/Installation Arduino IDE

1. Arduino 0023 herunterladen und auspacken.

http://files.arduino.cc/downloads/arduino-0023.zip

2. libusb herunterladen, auspacken und inf-wizard.exe ausführen, um nach Abschluss Treiber zu installieren.

http://sourceforge.net/projects/libusb-win32/files/latest/download?source=files

Download/Installation Arbotix

Anleitung: Arbotix Robocontroller.

1. Download Arbotix Firmware, PyPose & Nuke.

https://arbotix.googlecode.com/files/arbotix-0014.zip

2. Arbotix-0014 auspacken.

3. Ordner „arbotix-0014/arbotix“ kopieren nach arduino-0023/hardware.

4. Unterordner von „arbotix-0014/libraries/*“ kopieren nach arduino-0023/libraries/ (ggf. doppelte Ordnernamen umbenennen).

5. Die Datei „arduino-0023/hardware/arbotix/programmers.txt“ anpassen, so dass USB zur Kommunikation verwendet wird.

diamexisp.name=Diamex ISP
diamexisp.communication=usb
diamexisp.protocol=stk500v2

6. Die Datei „arduino-0023/hardware/arbotix/boards.txt“ anpassen, so dass der Klassenname („diamexisp“) des Programmers verwendet wird.

arbotix.upload.using=diamexisp

7. Arduino-0023 starten und konfigurieren

Tools --> Board --> Arbotix

 

Test & Fehlerbehebung

1. Seit Version 1.0.2 erscheint ein Fehler bezüglich fehlender Header-Dateien.
In manchen Fällen, kann es passieren, dass *.h-Dateien nicht gefunden werden. Die Header-Dateien für Arbotix befinden sich in „coresarbotix“. Abhilfe verschaffte in diesem Fall eine Kopie aller .h-Dateien aus dem Quellordner in den Zielordner:

Quelle:
arbotix-0015arbotixhardwarearbotixcoresarbotix

Ziel:
arduino-1.0.2hardwarearbotixcoresarbotix

AVR - Arbotix - Arduino - Tools - Board

7. Arduino-0023 I2C Testprogramm LED-Blink bei I2C-Datenverkehr.
In den Library-Ordnern (arduino-0023libraries…) von Arduino gibt es meist einen Ordner „examples“ mit Beispielen. Dieses Beispiel wurde mit Hilfe aus den sketchbook-Dateien „slave_receiver“ und „slave_sender“ erstellt.

//***********************************************
// Arbotix-Bibliothek laden:
// arduino-0023librariesWire
// ACHTUNG: Arduino hat auch eine "Wire"-Library
// Es wird die Arbotix-"Wire"-Library benötigt!
//***********************************************
#include <Wire.h>

//***********************
// Konstanten
//***********************
const int LED = 0; // LED-Adresse
const int ADR = 2; // Arbotix-Controller-Adresse (frei wählbar max. 127)

//***********************
// Setup
//***********************
void setup()
{
  pinMode(LED, OUTPUT);      
  Wire.begin(ADR);             // Arbotix Adresse festlegen 0x02
  Wire.onReceive(rxEvent);     // Empfangsereignis-Handler
  Wire.onRequest(rqEvent);     // Abfrageereignis-Handler
  Serial.begin(9600);          // Arduino -> Tools -> Serial Port, benötigt FTDI-Breakout-Verbindung
  digitalWrite(LED, LOW);      // LED bei Start = aus
}

//*******************************
// Hauptschleife
//*******************************
void loop()
{
  delay(100);
  digitalWrite(LED, LOW);      // LED zurücksetzen falls zuvor Empfang oder Abfrage ausgeführt
}

//*******************************
// I2C-Empfangsereignis-Handler
//*******************************
void rxEvent(int cntData)
{
  while(1 < Wire.available())  // 1 Byte empfangen
  {
    char cI2C = Wire.receive();// Daten speichern
    digitalWrite(LED, HIGH);   // Empfang per LED quittieren
    Serial.print(cI2C);        // Debug-Meldung an COMx
  }
}

//*******************************
// I2C-Abfrageereignis-Handler
//*******************************
void rqEvent()
{
  int iI2C = Wire.receive();  // Daten als Integer
  Wire.send(89);              // Zwei Byte Daten (89) senden
  digitalWrite(LED, HIGH);    // Abfrage per LED quittieren
  Serial.print(iI2C);         // Debug-Meldung an COMx
}

Es wird nun ein weiteres externes Programm benötigt, welches auf einem Mikrocontroller oder Computer läuft und Daten an die Adresse 0x02 sendet. Beispiele dazu gibt es in allen möglichen Programmiersprachen im Internet. Ich habe „i2c_usb.exe“ verändert und als Testprogramm eingesetzt.

Anhang: Hardware-Setup

1. AVR-ISP MK II (v.l.n.r. Diamex ALL-AVR-Programmer, Arbotix-Controller, I2C-USB)
AVR - Arbotix - USB-I2C - AVR-ISP - Hardware Setup

2. FTDI-Schnittstelle
AVR - Arbotix - FTDI-Schnittstelle

Schreibe einen Kommentar