Durch den Einbau von kleinen WLAN-fähigen Microcontrollern können Geräte über ein Netzwerk mit übergeordneten Systemen kommunizieren. In der Industrie werden Transportroboter bequem per WLAN gesteuert. Immer häufiger können Roboter, auch Haushaltsroboter über das Internet ferngesteuert werden. Auch der Microcontroller, der im EV3 eingebaut ist, kann für die WLAN-Steuerung verwendet werden. Mit Tools und Befehlen, die in der Bibliothek ev3robot integriert sind, kann man auf dem EV3 sogar einen einfachen Webserver einrichten und mit interaktiven Webseiten, die auch Smartphone fähig sind, den Roboter über das WLAN steuern. Falls Sie bis jetzt ihre Programme über das Bluetooth heruntergeladen haben, brauchen Sie zusätzlich einen USB-WLAN-Adapter (Edimax EW 7811UN), den man vor dem Einschalten des EV3 in die USB-Schnittstelle einstecken muss. Die Kommunikation erfolgt über einen Accesspoint. In grösseren Institutionen oder im Klassenverband ist es vorteilhaft, eigenen, billigen WLAN-Router zu verwenden [mehr...]. Sie können aber auch WLAN- Hotspot Ihres Smartphones nutzen. Die SSID und Passwort des Accesspoints stellen Sie im EV3-Menü unter WiFi ein. Der EV3 dient als Webserver, der Webseiten zur Verfügung stellen und auf die eingehenden Anfragen (Requests) der Benutzer (Clients) reagieren kann. Die Clients (Smartphone, PC) können mit einem Webbrowser auf diese Webseiten zugreifen. |
Beispiel 1: LEDs des EV3 über das WLAN ein- und ausschalten Um die Webseite anzuzeigen, muss der Client auf einem Smartphone oder PC Internetbrowser starten und in der Adressleiste die IP-Adresse des EV3 eingeben. Da die Kommunikation über den Port 81* erfolgt, muss man zusätzlich ":81" eingeben (z.B. 192.168.0.27:81). |
|
|
#Ro16a.py from ev3robot import * from time import sleep html = """ <!DOCTYPE html> <html> <head> <meta name="viewport" content="width=device-width, initial-scale=1"> <head> <body> <h2>WebRobot</h2> <p>Press to change the state:</p> <p><a href="on">Light ON</a></p> <p><a href="off">Light OFF</a></p> </body> </html> """ def onRequest(clientIP, state, params): if state == "/on": robot.setLED(2) elif state == "/off": robot.setLED(0) return html robot = LegoRobot() server = HTTPServer(requestHandler = onRequest, port = 81) while not robot.isEscapeHit(): sleep(1) server.terminate() robot.exit() |
Programmcode markieren
|
Erklärungen zum Programmcode:
html = """ .... """ : der HTML-Code wird in einem Python-Programm als ein mehrzeiliger String zwischen zwei dreifachen Anführungszeichen """ …""" eingegeben |
|
<meta name="viewport" ...>: mit dieser Zeile wird die Webseite an die Breite des Gerätes angepasst. So erscheint sie auch auf dem Smartphone korrekt |
|
onRequest(clientIP, state, params): diese Callbackfunktion wird aufgerufen, wenn der Benutzer die IP-Adresse des Servers wählt |
|
server = HTTPServer(requestHandler = onRequest, port = 81): die Callbackfunktion wird registriert |
Beispiel 2: Roboter mit Smartphone steuern |
|
#Ro16b.py from ev3robot import * from time import sleep html = """ <!DOCTYPE html> <html> <head> <meta name="viewport" content="width=device-width, initial-scale=1"> <head> <body> <h2>WebRobot</h2> <p>Press to change the state:</p> <p><a href="forward">forward</a></p> <p><a href="stop">stop</a></p> </body> </html> """ def onRequest(clientIP, state, params): if state == "/forward": gear.forward() elif state == "/stop": gear.stop() return html robot = LegoRobot() gear = Gear() robot.addPart(gear) gear.setSpeed(30) server = HTTPServer(requestHandler = onRequest, port = 81) while not robot.isEscapeHit(): sleep(1) server.terminate() robot.exit() |
Programmcode markieren
|
Erklärungen zum Programmcode:
while not robot.isEscapeHit(): mit Drücken der ESCAPE-Taste auf dem EV3 oder durch Schliessen des Terminalfensters wird die Verbindung zum Server unterbrochen und das Programm beendet. sleep(1) bewirkt, dass die while-Schleife nur einmal pro Sekunde aktualisiert wird |
Beispiel 3: Webseite mit Buttons Mit wenig Aufwand können Sie das Programm mit den Buttons "backward", "left" und "right" ergänzen und eine vollständige Steuerung programmieren (siehe Aufgaben 2 und 3). |
#Ro16c.py from ev3robot import * from time import sleep html = """ <!DOCTYPE html> <html> <head> <meta name="viewport" content="width=device-width, initial-scale=1"> <head> <body> <h2>WebRobot</h2> <form method="get"> <p><input type="submit" style="font-size:18px; height:40px; width:110px" name="btn" value="forward"/> <input type="submit" style="font-size:18px; height:40px; width:110px" name="btn" value="stop"/></p> </form> </body> </html> """ def onRequest(clientIP, state, params): if "btn" in params: state = params["btn"] if state == "forward": gear.forward() elif state == "stop": gear.stop() return html robot = LegoRobot() gear = Gear() robot.addPart(gear) gear.setSpeed(30) state = "stop" server = HTTPServer(requestHandler = onRequest, port = 81) while not robot.isEscapeHit(): sleep(1) server.terminate() robot.exit() |
Programmcode markieren
|
Erklärungen zum Programmcode:
if "btn" in params : das Drücken des Buttons wird in der Callbackfunktion über die Parameterliste params registriert |
|
state = params["btn"]: der Wert des Parameters btn wird in der Variablen state, die zu beginn den Wert "stop" hat, gespeichert |
Aufgaben: Serie 16 |
1) |
Ergänze das Programm im Beispiel 2 mit den Links "backward", "left" und "right". Mit Klick auf den Link "left" soll sich der Robiter auf einem Linksbogen mit dem Radius 0.1 , mit Klick auf den Link "right" auf einem Rechtsbogen mit dem Radius 0.1 bewegen. |
|
|
2) |
Ergänze das Programm im Beispiel 3 mit den Schaltflächen "backward", "left" und "ight". Bei der Links- bzw. Rechtsdrehung soll sich der Roboter auf einem Links- bzw. Rechtsbogen mit dem Radius 0.1 bewegen. Passe die Geschwindigkeit an, so dass sich der Roboter mit einem Smartphone leicht steuern lässt. |
|
|
3) |
Mit der Anordnung der Buttons in einer Tabelle, kannst du eine elegantere Benutzeroberfläche erstellen. Informiere dich im Internet oder in der Kurzanleitung HTML, wie man im HTML Elemente in einer Tabelle anordnen kann. |
*Fachlicher Hinweis:
Ein Netzwerkport ist ein Teil einer Netzwerkadresse. Mit seiner Hilfe wird dem Datenpaket die richtige Anwendung zugeordnet. Die Standardportnummer für http ist Port 80. Diese muss nicht explizit angegeben werden. Da beim EV3 bereits der Programmdownload vom Entwicklungscomputer zum EV3 über den Port 80 läuft, wird hier für die Server-Client-Kommunikation der Port 81 verwendet. |