TigerJython4Kids | HomeTurtlegrafikRobotikDatenbanken |
DU LERNST HIER... |
wie du mit der Oxocard einen fahrenden Roboter baust, den du mit dem Handy fernsteuern kannst. Mit Fantasie und Erfindergeist realisierst du viele andere Anwendungen: Fahren längs einer Streifenbahn, Bewegen in einem Labyrinth, usw. |
VORSCHLAG ZUM BAU DES ROVERS |
Der OxoRover wird auf einem Chassis mit Antriebsrädern und einer Kugelauflage (Caster wheel) aufgebaut. Dieses Konzept ist einfacher als die Verwendung von 4 Rädern oder ein Raupenantrieb, da du das Fahrzeug so steuerst, dass du die Motoren in unterschiedlicher Richtung oder mit unterschiedlicher Drehzahl laufen lässt. Einen Bausatz, der die Chassisplatten, zwei 5V-Motoren mit Getriebe und Räder, sowie das Kugelrad enthält, ist bei Pimoroni erhältlich. Er ist eigentlich für die Verwendung eines Raspberry Pi konzipiert, eignet sich aber ebenso gut für die Oxocard (Bezugsquelle shop.pimoroni.com/products/sts-pi). Nach dem Zusammenbau des Chassis nimmst du die Oxocard aus der Kartonhülle und klebst sie mit Doppelklebband auf die Chassisplatte. |
H-BRÜCKE |
Zur Ansteuerung der Gleichstrommotoren verwendest du als Treiberbaustein eine Doppel-H-Brücke mit dem Chip DRV8835. Damit kannst du die zwei Motoren über 4 GPIO-Ports unter Verwendung von PWM sowohl vorwärts wie rückwärts mit einer wählbaren Drehzahl laufen lassen. Der Chip ist auf einem kleinen Breakout-Board von Pololu erhältlich (Bezugsquelle: https://www.pololu.com/product/2135). Wenn du einen Header einlötest, kannst du das Board direkt am GPIO-Port der Oxocard einstecken und mit den beiden Motoren verbinden. Schaltschema:
Ein Widerstand von 1 kOhm zwischen IO5 und GND sorgt dafür, dass beim Booten der Port IO5 nicht kurzzeitig hochgezogen wird, wodurch der Motor bereits vor Programmstart anlaufen würde. Die Versorgungsspannung für die Motoren beträgt 5V und wird von einer PowerBank geliefert, die auch die Oxocard speist. Dazu konfektionierst du eine gleiches Kabel wie bei der Verwendung von NeoPixels. Der Widerstand von 100 Ohm parallel zur PowerBank verhindert das automatische Abschalten der Spannung. Die H-Brücke hat beim Tiefziehen des Mode-Pins für jeden Motor folgendes Verhalten:
Die beiden Stop-Zustände unterscheiden sich darin, dass beim ersten Fall die Motoranschlüsse offen und beim zweiten Fall kurzgeschlossen werden. Dies führt dazu, dass im ersten Fall der Motor durch den Wirbelstromeffekt schneller abgebremst wird. |
MUSTERBEISPIEL |
Die Motoren werden durch ein PWM-Signal von 50 Hz angesteuert. Dein Programm dient lediglich dazu, den Aufbau zu testen, insbesondere auch, was die Drehrichtungen der beiden Motoren betrifft. A ist dabei der rechte und B der linke Motor. Programm: from machine import Pin, PWM from time import sleep pA1 = Pin(5) pA2 = Pin(23) pB1 = Pin(18) pB2 = Pin(19) fPWM = 50 def stop(brake = False): if brake: d = 1023 else: d = 0 motA1.duty(d) motA2.duty(d) motB1.duty(d) motB2.duty(d) def forward(): motA1.duty(speed) motA2.duty(0) motB1.duty(speed) motB2.duty(0) def backward(): motA1.duty(0) motA2.duty(speed) motB1.duty(0) motB2.duty(speed) motA1 = PWM(pA1, freq = fPWM, duty = 0) motA2 = PWM(pA2, freq = fPWM, duty = 0) motB1 = PWM(pB1, freq = fPWM, duty = 0) motB2 = PWM(pB2, freq = fPWM, duty = 0) speed = 600 forward() sleep(5) backward() sleep(5) stop() Der Code dieser Funktionen ist im Modul oxorover gekapselt, das zwei einfache Klassen Motor und Gear mit folgenden Methoden enthält: Klasse Motor:
Klasse Gear:
Mit folgendem Programm bewegt sich der Rover auf einem Quadrat: Programm: from oxorover import * from time import sleep gear = Gear() repeat 4: gear.forward() sleep(5) gear.left() sleep(1.2) gear.stop() |
FERNSTEUERUNG DES OXOROVERS |
Programm: from oxorover import * from tcpcom import * html = """<!DOCTYPE html> <html> <head> <title>OxoRover</title> <meta name="viewport" content="width=device-width, initial-scale=1"> </head> <body> <h1>OxoRover Control</h1> <form method="get"> <table> <tr> <td></td> <td><input type="submit" style="font-size:20px; height:50px; width:100px" name="btn" value="forward"/></td> <td></td> </tr> <tr> <td><input type="submit" style="font-size:20px; height:50px; width:100px" name="btn" value="left"/></td> <td><input type="submit" style="font-size:20px; height:50px; width:100px" name="btn" value="stop"/></td> <td><input type="submit" style="font-size:20px; height:50px; width:100px" name="btn" value="right"/></td> </tr> <tr> <td></td> <td><input type="submit" style="font-size:20px; height:50px; width:100px" name="btn" value="backward"/></td> <td></td> </tr> </table> </form><br> Current state: %s<br> </body> </html> """ def onRequest(clientIP, filename, params): global state if len(params) > 0: state = params[0][1] return html % (state) def stateChanged(): global oldState if oldState != state: oldState = state return True return False state = "stop" oldState = "" Wlan.activateAP(ssid = "oxorover", password = "") HTTPServer(requestHandler = onRequest) gear = Gear() while True: if stateChanged(): if state == "forward": gear.forward() elif state == "backward": gear.backward() elif state == "left": gear.leftArc() elif state == "right": gear.rightArc() elif state == "stop": gear.stop() sleep(0.01) |
MERKE DIR... |
Zur Ansteuerung der Motoren verwendest du das Modul oxorover, das die Motoren und das Fahrwerk als Objekte modelliert. Die darin enthaltenen Methoden setzen den OxoRover in einen bestimmten Bewegungszustand, der andauert, bis er geändert wird. Du verwendest hier also das Programmierparadigma "Objektorientiertes Zustandsprogrammieren". |
ZUM SELBST LÖSEN |
|