EM2014SSP07

Aus Verteilte Systeme - Wiki
Wechseln zu: Navigation, Suche

Das Projekt: Rp6 - Sensor Ansteuerung

Der Rp6 Einleitung

Der RP6 ist ein autonomer mobiler Roboter, entwickelt um sowohl
Anfängern, als auch fortgeschrittenen Elektronik-
und Software Entwicklern einen Einstieg
in die faszinierende Welt der Robotik zu bieten.

Er trat im Jahr 2007 die Nachfolge des 2003 von der Conrad Electronic SE auf den Markt gebrachten
und sehr erfolgreichen "C-Control Robby RP5" an
(CCRP5, RP5 hieß dabei "Robot Project 5"), hat mit dessen Elektronik aber nur wenig gemeinsam.


Rp6.png

Ziel

Wir steuern den Rp6 per Wiimote Controller.


Der Rp6 fungiert im Zusammenspiel mit einem Raspberry Pi über eine I2C Anbindung per Master Slave Prinzip.
Dabei nimmt der Rp6 die Kommandos des Masters(Raspberry Pi) entgegen und führt diese aus.
Doch auch eigenständige Entscheidungen, wie in dem Falle (bzw. dem bevorstehenden eintreffen) einer Kollision sollte der Rp6 per Sensoren lesen,
dem Master melden und ausweichmaßnahmen vornehmen können.


Idee.png

Hardware-Bestandteile des Rp6

Ich unterteile den Rp6 in 4 Komponenten 1. Die Sensorik 2.Der Prozessor 3. Die Motoren 4. Der Antrieb

Aufbau.png

Sensoren

Der Lichtsensor

LDRs.jpg LDRs "Light Dependant Resistors" ist vorne auf dem Rp6 positioniert.

Er besteht aus zwei lichtabhängigen Widerständen, welche je nach Lichteinfall und Intensität Ihre Spannung ändern.
Zwischen den LDRs ist eine kleine Trennwand damit das Licht aus einer Richtung nur einen der Sensoren erreicht.
Durch diese Vorrichtung, kann man eine Lichtquelle orten und diese in 3 Bereiche einteilen Links, Rechts oder in der Mitte.
Sie bilden zusammen mit je einem normalen Widerstand einen Spannungsteiler, um das Umgebungslicht zu messen.

Das Anti Collision System (ACS)

ACS.png Der aus Softwaresicht komplexeste Sensor des RP6 ist das ACS.

Das Anti Collision System (ACS),besteht aus einem Infrarot Empfänger
und zwei vorne auf der Sensorplatine links und rechts angebrachten Infrarot LEDs.
Es sendet mehrere, mit 36kHz modulierte, Infrarot Impulse, die an einem Hindernis abprallen und zurück an den Empfänger gehen.
Das ACS wartet mehrere dieser zurückgeworfenen Impulse ab, bis der Empfänger reagiert.
Durch die eventuell unterschiedlichen Richtungen der Impulse kann er grob unterscheiden
ob das Hindernis direkt auf seinem Weg liegt oder leicht rechts oder links davon.
Wichtig ist dazu noch zusagen, dass die Genauigkeit der Sensoren massiv von dem Objekt, das sich als Hindernis darstellt abhängt.
Je dunkler das Objekt, desto schwerer hat es der Infrarot Empfänger.
Die Reichweite ist also immer vom jeweiligen Objekt abhängig!

Stoßstangensensoren (Bumper)

Bum.png

Der Bumper ist sozusagen das letzte Notfallsystem des Rp6 vor der Kollision mit einem Hindernis.
Die vorne am Roboter angebrachten Mikroschalter sind mit langem Schalthebel auf einer separaten Platine untergebracht. Dadurch werden die IR LEDs auf der Sensorplatine geschützt und können nicht so leicht verbiegen wenn der Roboter gegen ein Hindernis fährt. Sie funktionieren wie ein Taster, sobald ein Hindernis berührt wird löst der Bumper über direkt mit dem Prozessorverbundene Ports ein Warnsignal aus.

Die Motorstromsensoren

Motor.png


Wie schon gezeigt besitzt der Rp6 zwei Motoren, die jeweils unabhängig von einander agieren könne. Jeder dieser Motoren hat einen Leistungswiderstand mit einem Wiederstand von 0.1 Ohm in seinem Motorstromkreis, welcher durch das Ohmsche Gesetz U=RxI die Spannung, die daran abfällt misst. Sie ist durch den geringen wiedeWiederstand so klein, dass bevor sie ausgelesen werden kann nochmals mit einem Operationsverstärker erhöht wird. Das Ergebnis ist durch die zusätzlichen Widerstände welcher der Operationsverstärker auch noch mit sich bringt sehr ungenau. (Ungenauigkeiten im Bereich von etwa 270mA sind möglich wenn man die Sensoren nicht kalibriert!) Doch reichen diese Wert aus um zu prüfen ob die Motoren stark oder wenig belastet werden. Im Falle eines Hindernisses, auf welches nicht reagiert wurde, würden die Motoren sonst heiß laufen und dadurch Schaden nehmen.


Der Encoder

Encoder.png


Der Encoder besteht aus Reflexlichtschranken, die auf Codierscheiben mit je 18 weißen und 18 schwarzen Segmenten ausgerichtet sind.
Diese Codierscheiben sind an die Zahnräder der beiden Getriebe geklebt.
Somit bewegen sie sich beim Rotieren der Ketten mit. Die schwarzen Segmente reflektieren das Infrarotlicht nur schwach,
dieses Signal wird deswegen verstärkt und digital interpretiert, wodurch jeweils ein Interrupt-Ereignis ausgelöst wird,
das dann von der Software gezählt wird. Somit können Drehzahl, Geschwindigkeit und auch die rückgelegte Strecke gemessen werden.
Die Drehzahl ist auch Hauptanwendung der Encoder; jedes der zwei mittleren Stufenzahnräder des Getriebes hat 50 Zähne auf dem großen-,
und 12 auf dem kleineren Zahnrad. Die Codierscheiben befinden sich auf dem Zahnrad neben dem Motor, also rechnet man:

50/12 * 50/12 =17.13/36; 17.13/36 * 36=625

Die Zahl 625 entspricht also der Flanken pro Radumdrehung, die bei einem Raddurchmesser von ca. 50mm inkl. Raupenkette liegen.
Jedoch kann man aber von 0.25mm pro Zählschritt ausgehen, meist ist es sogar etwas weniger, z.B. nur 0.24mm oder 0.23mm.

Steuerungssystem (Prozessor)

Prozessor.png

Der ATmega32 Mikrocontroller der Firma Atmel bildet das Herzstück des Rp6.
Vom Steuer-Programm werden die Sensoren abgefragt und die Aktoren (Motoren, LEDs) eingestellt.
Er hat (32768 Bytes) Flash ROM und einen 2KB (2048 Bytes) großen Arbeitsspeicher.

Der Controller ist auf 16MHz getaktet und führt so ca. 16 Millionen Instruktionen pro Sekunde aus.

Antriebssystem

Antrieb.png


Der Antrieb des RP6 besteht aus zwei Gleichstrom Motoren mit nachgeschaltetem Getriebe,
über das die beiden Raupenketten angetrieben werden. Jeder Motor besitzt einen Leistungstreiber in Form von einer H-Brücke.
Diese besteht, wie im Schaubild dargestellt, aus vier Schaltern S1, S2, S3, S4.
Würde man S2 und S3 anschalten, wäre der Kreislauf geschlossen und der Motor würde sich nach links drehen, andersrum bei S1 und S4.
Man sollte darauf achten, nicht gleichzeitig S1 und S2, oder S3 und S4 einzuschalten, sonst entstünde ein Kurzschluss
und dadurch könnten die "Schalter" zerstört werden!

Stromversorgung

Der Rp6 enthält 6 Akkus die bis zu (6x1.2V) 7.2V.Nennspannung erzeugen. Mit 3 bis 6 Stunden Laufzeit.

Power.png

Wichtig ist, viele der verwendeten Komponenten wie z.B. der Mikrocontroller sind nur auf 5V oder weniger Betriebsspannung ausgelegt.
Die Akku Spannung muss also auf einen genauen Wert herunter geregelt und stabilisiert werden!
Dies geschieht mittels Spannungswandler.

Wandler.png

Projektaufbau

Hardware

UnserRp6.png

Wir haben dem Rp6 einen Raspberry Pi auf den Rückengeschnallt, welcher nun als Master fungiert
und gleichzeitig als Server für WLAN und Bluetooth dient.
Über USB wird er von einem Accupack aus mit Strom versorgt, welches am Heck des Rp6 befestigt ist.

Software

Auf dem RP6 befindet sich zurzeit eine I²C Slave Software, die eigentlich für die M32 Erweiterungsplatine gedacht ist.
Meine Hauptaufgabe besteht nun neben dem gemeinsamen Hardwareaufbau und dessen Funktionalität darin,
die Ansteuerung vom Raspberry Pi aus über unsere I2C Schnittelle zu den jeweiligen Sensoren und Motoren am Rp6
und deren weitere Verbindung über eine gemeinsam definiertes Interface zum Wiimote Controller zu realisieren.

I2C

Unsere Schnittstelle vom Rp6 zum Raspberry Pi, "Der I²C Bus" , kann bis zu 127 Teilnehmer miteinander
verbinden und hat eine maximale Übertragungsrate von 400kBit/s.
Er wurde in den 1980er und 1990er Jahren von Philips Semiconductors entwickelt
und ist seitdem zu einem sehr weit verbreiteten Bussystem geworden
und findet in sehr vielen elektronischen Geräten der Unterhaltungselektronik, wie Videorecordern und Fernsehern Verwendung,
aber auch in industriellen Geräten und Systemen.


Es handelt sich um einen Master-Slave orientierten Bus - ein oder mehrere Master
steuern den Datenverkehr von und bis zu 127 Slaves!

I2C Anbindung

Der Rp6 als I²C Bus Peripheriegerät wird über ein Leseregister sowie ein Schreibregister gesteuert,
indem Arrays, bestehend aus 8 Datenbits = 1 Oktett, gesendet werden.
Die Grundsoftware welche sich auf dem Rp6 befindet, ist deshalb auch so gestaltet,
dass es „Register“ (ein Array aus 8 Bit Variablen) gibt, die der Bus-Master/Slave beschreiben und auch lesen kann.
Der Datenaustausch über den I²C Bus läuft im Slave Modus komplett über diese Register.
Wenn man Daten auf dem Bus verfügbar machen will, müssen diese im Array ablegt werden,
im Anschluss kann ein Master über die Arrayposition (=Registernummer) auf die gewünschten Daten zugreifen.
Soll ein Master z.B. Sensorwerte vom Slave empfangen, schreibt er diese einfach an vorher festgelegte Positionen.
Anschließend kann der Master diese Daten auslesen, indem er zunächst die Registernummer an den Slave überträgt
und dann die Daten liest. Die Registernummer wird automatisch inkrementiert, also kann der Master auch mehrere Register in einem Rutsch auslesen.
Ähnlich funktioniert auch das Schreiben. Der Master überträgt zunächst die gewünschte Zielregisternummer und fängt dann an,
die Daten zu schreiben.

Code EM2014SSP12



Aufbau der Library und derne Funktionen

Allgemein

Ich habe die Steuerung des Rp6 in sechs Grundfunktionen, drei Zusatzfunktionen und zwei Abfragen unterteilt.
In diesem Kapitel möchte ich zunächst oberflächlich auf jene Funktionen eingehen, die den Rp6 erst zum „Leben erwecken“.

Die Erwartungs- und Rückgabewerte im Detail lasse ich erst einmal außen vor, da sie sich, je nachdem
ob ich den Code als eigenständiges Programm ausführe oder als C Library zu Verfügung stelle, ändern.

Grundfunktionen

Funktion Motor an
Sie beinhaltet die grundlegenden Befehle, die durch das Setzten des Registers 0 auf den Wert 0 sowie
das Statusregister 1 auf den Wert 1, die Motoren aktivieren.

Code EM2014SSP13

Funktion Stop

Mit dieser Funktion werden, egal in welcher Befehlskette sich der Rp6 zurzeit befindet, die Motoren sofort gestoppt.
Vor allem in Situationen, in denen Hindernisse auftreten ist sie sehr sinnvoll. Sobald z.B. einer der Bumper gedrückt worden ist,
sollte der Rp6 aus Sicherheitsgründen sofort anhalten.

Code EM2014SSP14

Funktion linksDrehen / rechtsDrehen

Die Funktionen „linksDrehen“ und „rechtsDrehen“ erwarten pro Motor einen Geschwindigkeitswert.
Leider ändert sich der Rotationsradius der Kurven je nach Untergrund erheblich.
Nach mehreren Versuchen hat sich die simple Aufteilung (die Geschwindigkeit des Motors in die Richtung,
in die der Rp6 fahren soll, zu halbieren), als die im Schnitt beste Lösung herausgestellt.

Code EM2014SSP16

Funktion nachvorne/nachhinten

Der Rp6 nutzt den Encoder dazu, um die bisher gefahrene Distanz auszulesen.
Genau in dieser Funktion kommt der Sensor nun zum Einsatz.
Parameter 3 und 4 erwarten für jede der Ketten links und rechts eine Distanz, die zurückgelegt werden soll.
Der Encoder kalibriert diese dann intern vor.

Die Funktionen (nachvorne/nachhinten) bilden das Herzstück der Beweglichkeit des Rp6,
sie werden mehrere Male pro Sekunde aufgerufen, deshalb ist die Präzision eher Nebensache.
Daher habe ich die Distanz in der Library zum Wohle der Reaktionszeit klein gehalten.
Des Weitern benötigt die Funktion eine Richtung, die ich im Parameter 2 mitgebe sowie die Geschwindigkeit,
die sich nun auf beide Ketten bezieht. Ein Befehl/eine Funktion wird vom Rp6 solange ausgeführt, bis dieser einen neuen erhält.
In diesem Fall würde die Distanz dem Rp6 jedoch ein internes Stoppsignal geben.
Im Parameter 5 gibt man also per boolean an, ob nach der Abarbeitung ein weiterer Befehl folgen darf, ohne vorher anzuhalten.

Code EM2014SSP15

Zusatzfunktionen

Funktion richtungswechsel

Diese Funktion erwartet nur eine Richtung, die an die Motoren übergeben wird,
indem der Roboter zuerst stopp, in die gewünschte Richtung wechselt und wieder auf die alte Geschwindigkeit beschleunigt.

Code EM2014SSP20


Funktion rotate

Der Rp6 kann sich auf einer bestimmten Stelle bewegen.
Dazu benötigt er die entweder die Richtung links oder rechts, einen beliebigen Radius,
angegeben in Grad, und eine Geschwindigkeit. Leider ist diese Funktion nicht sehr genau, die Drehung weicht in der Regel -10 % - +10% ab.
Gründe dafür sind die unterschiedlichen äußern Einflüsse, wie der Untergrund oder das derzeitige Gewicht des Roboters.

Code EM2014SSP21

Funktion setLeds

Mit dieser Funktion können durch verschiedene Bit-Muster im Parameter1, die jeweiligen LEDs
(in der Zahl 6 Stück) auf dem Rp6 angesprochen werden.

Code EM2014SSP22

Abfragen

Funktion acs

Das Antikollisionssystem dersRp6 ist, im Gegensatz zu anderen Sensoren, nicht sofort einsatzbereit,
sondern muss erst aktiviert werden, bevor es abgefragt werden kann. Die Funktion acs beinhaltet diese Aktivierung aber nur solange
wie wir den Code als ein geständiges Programm betrachten.
Als Library muss dieser Befehl in die Hauptfunktion eingebunden werden,
da die Befehlskette sonst nicht ordnungsgemäß durchgeführt wird(Dazu später mehr).
Die Leistung der Infrarot LEDs, die in 3 Sendestärken aufgeteilt sind, bekommt die Funktion über den Parameter 1.

Code EM2014SSP23

Funktion bumper

Die Bumper können jeder Zeit über die Registerstelle 0 ausgelesen werden.
Sobald dieser die richtige Bit-Maske in Form eines „Integer Wertes“ zurückgibt,
wird die Funktion stop() aufgerufen. Ohne diesen nachfolgenden Befehl, würde der Rp6 sich von Haus aus nach kurzer Zeit abschalten.

Code EM2014SSP24

Kommandos

Kommandos.png

Settings

ACS1.jpg


Lese Register

LeseRegister.jpg

Aufbau der Befehlsreihen

Zur Erinnerung: der Rp6 als I²C Bus Peripheriegerät wird über ein Leseregister
und ein Schreibregister gesteuert. Ein Kommando besteht aus mehreren, hintereinander folgenden Befehlen, die über das Schreibregister Arrays,
bestehend aus 8 Datenbits = 1 Oktett, gesendet werden.
Nehmen wir als Beispiel die Funktion „Fahre, welche mehrere Parameter erwartet.
Diese sind dann unsere abzuarbeitenden „Befehlsreihen“.
Im Grunde dreht sich alles um die Stellen Null und Eins unseres Buffers.
Die Stelle 0 repräsentiert eine Prüfmaske, die sich als Kommando in der Tabelle
als jeweiligen Parameter beschreiben lässt. Die Stelle 1 ist unsere Status ID, die den „Hauptbefehl“ setzt
und die jeweiligen Parameterwerte in Kombination mit der richtigen Prüfmaske annimmt.

Beispiel Befehlskette nachvorne

Ein Befehl würde also wie folgt aussehen:

1.
Buffer[0] = 1; // Parameter 1
Buffer[1] = speed; // 0-255
Schreibe auf Rp6.
2.
Buffer[0] = 2; // Parameter 2
Buffer[1] = 0; // Wert in Tabelle Einstellung Move;
Schreibe auf Rp6.
3. Buffer[0] = 2; // Parameter 3
Buffer[1] = 3000 // Encoder Zählschritte Links
Schreibe auf Rp6.
4.
Buffer[0] = 2; // Parameter 4
Buffer[1] = 3000 // Encoder Zählschritte Rechts
Schreibe auf Rp6.
5.
Buffer[0] = 2; // Parameter 5
Buffer[1] = True or False // Darf nach Ablauf der Distanz direkt ein neuer Befehl folgen.
Schreibe auf Rp6.
6.
Hauptbefehl: Buffer[0] = 0; // Prüfmaske wir auf null gesetzt.
Buffer[1] = 7;// Gibt nun den eigentlichen Befehl die ID
Schreibe auf Rp6.

Beispiel Befehlskette acs

Wie auch Kommandos, können Abfragen aus mehreren, hintereinander geschachtelten Befehlen bestehen.
Eine interessante Funktion ist hierbei die Abfrage des Antikollisionssystems,
welches vor der eigentlichen Abfrage erst ein Kommando zur Aktivierung benötigt.

Eine Abfrage würde also wie folgt aussehen:

1.
Buffer[0] = 1; // Parameter 1
Buffer[1] = 3; // ACS Settings
Schreibe auf Rp6.
2.
Hauptbefehl: Buffer[0] = 0; // Prüfmaske wir auf null gesetzt.
Buffer[1] = 9;// Gibt nun den eigentlichen Befehl die ID
Schreibe auf Rp6<br.

Nun ist das Antikollisionssystem aktiv

Die eigentliche Abfrage beginnt. Wir könnten im Status Register 1 nun prüfen, ob unser ACS aktiv ist.
Gehen wir einmal davon aus, dass wir es grade erst aktiviert haben.

In der Tabelle Status Register 0 sehen wir nun, dass der
Abstandssensor links auf dem Bit 5 liegt sowie der Abstandssensor rechts auf Bit 6. 2^5 = 32 / 2^6 = 64
32 + 64 = 96, also ergibt sich:

3.
Lese vom Rp6.
Buffer[0] = 32; draus folgt: Hindernis links.
Buffer[0] = 64; draus folgt: Hindernis rechts.
Buffer[0] = 96; draus folgt: Hindernis direkt voraus.

Funktions Parameter

Funktionen

Hauptfunktionen der Rp6 Library

void drehenLinks  	(int rp6, unsigned char speed);   // Adresse
void drehenRechts 	(int rp6, unsigned char speed);
void rotiereLinks 	(int rp6, unsigned char speed);
void rotiereRechts	(int rp6, unsigned char speed);
void nachvorne	        (int rp6, unsigned char speed);
void nachhinten 	(int rp6, unsigned char speed);
void motoran 	        (int rp6);
void stop      	(int rp6);
int verbinde		(void); // gibt adresse zurück
int bumper		(int rp6,unsigned char speed); //gibt die störung zurück
int acs   		(int rp6); // gibt die Störung zurück




Sobald ich die Funktion als Library zur Verfügung stelle,
fallen alle globalen Variablen, wie die Adresse des IC2 Busses raus und
müssen somit den einzelnen Funktion übergeben werden. Die Funktion „Verbinde“ ist nun sozusagen unsere neue „Main“.
Sie baut die Verbindung per portName (/dev/i2c-1) und Adresse (0x05) über den Ic2 Buss zum Rp6 auf.
Sie stellt eine Adresse bereit, mit der die anderen Funktionen per write und read Befehl auf den Rp6 zugreifen können.




Hauptfunktionen des Rp6 Main Programs.

void motorAn		(void);
void* bumper		(void *arg);
void* acs   		(void *arg);
void drehenLinks	(unsigned char speed);
void drehenRechts	(unsigned char speed);
void nachvorne		(unsigned char speed);
void nachhinten	(unsigned char speed);
void stop		(void);
void rotateR		(unsigned char speed);
void rotate		(unsigned char speed);
int semaphore_operation(int op);
int init_semaphore 	(void);

Beim direkten Ausführen des Programms kommt es wegen dem gemeinsamen Zugriff der Abfragen und
gleichzeitigen Kommandos zu Kollisionen auf dem I2C Bus.
Ich habe den Abfragen daher jeweils einen Thread zugewiesen und diese durch Semaphore blockieren lassen.

Dokumente, Quellen, Fazit

Erreichte Ziele

Pflicht Ziele: - Rp6 komplett lauffähig machen, Hauptfunktionen (Nachvorne,Nachinten,Rechtsfahren,Linksfahren)

-Anbindung der I2C Schnittstelle des RP6 an den Raspberry Pi -Bereitstellung der Library zur Ansteuerung des RP6 über den Wiimote Controller -Auslesen der wichtigsten Sensoren des RP6 (Antikollisionssystem , Bumper)

Optionale Ziele:

Zusatzfunktionen -Funktion richtungswechsel -Funktion rotate -Funktion setLeds


Verbesserungspotential

Funktionalität des Antikollisionssystems, nicht nur bei Testvorführung sondern im laufenden Betrieb gängig machen.

Der Rp6 hat einen Encoder, an dem man die Geschwindigkeit und auch die gefahrene Distanz ablesen kann. Bisher benutzte ich diese Werte ausschließlich als Parameter 3 & 4 zur Kommunikation. Man könnte sie aber genauso gut auslesen oder selbst durch ein Eingabefeld definieren.

Denkbare Erweiterungen

In diesem Zustand kann der Rp6 als Ausgangspunkt für viele interessante Hardware Experimente verwendet werden. Wenn man den Energiebedarf, das Gewicht und die Bauhöhe in einem funktionsfähigen Rahmen hält, könnten theoretisch beliebig viele Erweiterungsmodule übereinander gestapelt werden.

Quellcode

Quellcode der Testvorführung sowie der Library.

Gesamter Quellcode

Präsentationen

28.04.2014 Datei:Projekt RP6 mit Raspberry Pi (1).pdf

26.05.2014 Datei:Projekt RP6 mit Raspberry Pi (2).pdf

23.06.2014 Datei:Seminarvortrag USB.pdf

Quellen

Einen hervorragenden Einstig in der Welt des Rp6 bietet die Bedienungsanleitung „RP6 Robot System“ Version RP6-BASE-DE-20120215 für RP6 und RP6v2 von AREXX Engineering.

Sie beschreibt sehr genau den Hardwareaufbau und geht spezifisch auf die verbaute Sensorik ein.

Eine sehr ähnliche Dokumentation bietet auch das RN-Wissen Forum an.


Das Praxisbuch „Embedded Linux“ von Joachim Schröder, Tilo Gockel,Rüdiger Dillmann ISBN: 978-3-540-78620-7 bietet ab Seite 136 FF. einen sehr genaue Übersicht über das Ic2 Konzept. Ein nettes nachschlage Werk was die Programmiersprache C anbelangt, ist das Handbuch Standard C Programmierung von Dipl.- Math. Wilhelm Noack / Leibniz Universität Hannover.


http://www.roboternetz.de/community/forums/58-Robby-RP6
http://www.amazon.de/Raspberry-Pi-RBCA000-Mainboard-1176JZF-S/dp/B008PT4GGC/
http://www.raspberrypi.org/
http://www.golem.de/news/piphone-raspberry-pi-handy-fuer-160-us-dollar-1404-106082.html
http://www.arexx.com/rp6/html/de/docs.htm
http://www.conrad.de/ce/de/product/191584/Arexx-RP6-V2-Robotersystem
http://www.pcwelt.de/special/Raspberry-Pi-8527389.html