Der Client greift auf das Server-Objekt zu, indem er zuerst die am Server erzeugte Registry holt und dann das Objekt, das hier unter dem Namen RMIServer registriert wurde, dort abruft. Nachdem der Client das Server-Objekt abgerufen und in einem lokalen Objekt abgelegt hat, ruft er an diesem die im Interface definierten Methoden auf. Listing 6 zeigt den entsprechenden Quellcode der Client-Anwendung.
Listing 6
Registry r = LocateRegistry.getRegistry("RasPi-IP", Registry-Port);
RMIServerI server = (RMIServerI) r.lookup("RMIServer");
Xbox360-Controller
Die durch die Server-Anwendung bereitgestellten Methoden sollen in Abhängigkeit davon aufgerufen werden, welche Tasten Sie an einem Xbox360-Controller drücken. Hierzu gilt es, diesen mit dem Client-PC zu verbinden und den passenden Treiber zu installieren. Anschließend fügen Sie der Client-Anwendung die JInput-Bibliothek [10] hinzu.
Mit deren Hilfe prüfen Sie zunächst, ob überhaupt ein Controller am Client hängt. Falls ja, testen Sie in einer Schleife, ob sich der Zustand der Steuertasten verändert hat, und starten gegebenenfalls einen entsprechenden Funktionsaufruf. Was bei welchem Tastendruck geschieht, passen Sie nach Belieben selbst an.
Der Code in Listing 7 bewirkt beispielsweise, dass beim Drücken der A-Taste des Controllers die Zustände der entsprechenden GPIO-Pins am RasPi auf HIGH/LOW beziehungsweise 1/0 schalten, wie es die Methode motor1Forward() erfordert. Beim Loslassen setzt die Routine, wie es die Methode motor1Stop() vorgibt, die entsprechenden GPIO-Pins auf LOW beziehungsweise 0.
Listing 7
while (isRunning) {
gamepad.poll();
for (Component c : gamepad.getComponents()) {
if (c.getIdentifier() == button0) {
if (!oldValue == c.getPollData())) {
if (oldValue == 0) {
server.motor1Forward();
oldValue = 1;
} else {
server.motor1Stop();
oldValue = 0;
}
}
}
}
}
Fazit und Ausblick
Die Kosten für den hier vorgestellten Eigenbau belaufen sich bei Neukauf aller Komponenten auf rund 200 Euro. Mögen Sie es bequemer, ersetzen Sie die selbst gebaute Elektronik durch einen BrickPi [11]. Damit lassen sich die Motor- und Sensorikkomponenten von Lego Mindstorms ohne Weiteres an den RasPi anschließen [12]. Diesen Komfort bezahlen Sie jedoch mit einem wesentlich höheren Preis.
Dem vorhandenen Motorcontrollerchip schalten Sie auf Wunsch beliebig viele weitere hinzu, solange freie GPIO-Pins zur Verfügung stehen. Um diese dann anzusteuern, definieren und implementieren Sie die entsprechenden Methoden im Interface für den RMI-Server. Des Weiteren fügen Sie eine Abfrage für den gewünschten Tastendruck inklusive Methodenaufruf hinzu. So erweitern Sie das Fahrzeug um neue Funktionen, wie etwa eine motorisierte Version des Greifarms des Lego-Modells 42006.
Glossar
- PWM
-
Pulse Width Modulation (PWM) erlaubt es, die Breite elektrischer Impulse im Hinblick auf einen gewünschten Zielwert zu modulieren. Dabei kann es sich etwa um einen bestimmten Wert für die Drehgeschwindigkeit (RPM, Revolutions Per Minute) eines elektrischen Motors handeln.
Infos
- Lego Mindstorms: http://mindstorms.lego.com
- Lego Power Functions: http://powerfunctions.lego.com
- Power Functions Interna: http://www.philohome.com/pf/pf.htm
- GPIO-Programmierung: Richard Ryniker, “Rein und raus”, RPG 05/2013, S. 74, http://www.raspi-geek.de/29891
- 5V-USB-Akku: http://elinux.org/RPi_VerifiedPeripherals
- RasPi-Konfiguration: Joe Casad, Joseph Guarino, Paul Brown, “Von null auf Pi”, RPG 02/2014, S. 8, http://www.raspberry-pi-geek.de/29878
- WLAN-Adapter: http://elinux.org/RPi_USB_Wi-Fi_Adapters
- Pi4J-Bibliothek: http://www.pi4j.com
- WiringPi-Bibliothek: https://projects.drogon.net/raspberry-pi/wiringpi/
- JInput-Bibliothek: https://java.net/projects/jinput
- BrickPi: http://www.dexterindustries.com/BrickPi/
- BrickPi-Workshop: Marko Dragicevic, “PiBot”, RPG 01/2014, S. 66, http://www.raspi-geek.de/31214





