TigerJython4Kids
HomeTurtlegrafikRobotikDatenbanken
oxorover

15. OXOROVER

 

 

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:

In1
In2
Out1
Out2
Motor
0
0
hochohmig
hochohmig
stop
PWM
0
PWM
0
vorwärts
0
PWM
0
PWM
rückwärts
1
1
0
0
stop (gebremst)

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()
► In Zwischenablage kopieren

Der Code dieser Funktionen ist im  Modul oxorover gekapselt, das zwei einfache Klassen Motor und Gear mit folgenden Methoden enthält:


Klasse Motor:
 mot = Motor(label, speed = 400)    erzeugt eine Motorobjekt mit label = 'A' oder 'B'
 und vordefiniertem Speed
 setSpeed(speed)  setzt den Speed (0..1023)
 getSpeed()  gibt den Speed zurück
 forward()  setzt den Motor in Vorwärtsbewegung
 backward()  setzt den Motor in Rückwärtsbewegung
 stop(brake = False  stoppt den Motor (brake = False: langsam stoppen)


Klasse Gear:
 gear = Gear(speed = 400)    erzeugt ein Fahrwerkobjekt (2 gleichzeitig laufende
 Motoren) mit vordefiniertem Speed
 setSpeed(speed)  setzt den Speed (0..1023)
 getSpeed()  gibt den Speed zurück
 forward()  setzt das Fahrwerk in Vorwärtsbewegung
 backward()  setzt das Fahrwerk in Rückwärtsbewegung
 left()  setzt das Fahrwerk in Linksdrehung
 leftArc(radius)  setzt das Fahrwerk auf einen Linksbogen mit
 gegebenem Radius (ungefähr in m)
 right()  setzt das Fahrwerk in Rechtsdrehung
 rightArc(radius)  setzt das Fahrwerk auf einen Rechtsbogen mit
 gegebenem Radius (ungefähr in m)
 top(brake = False  stoppt das Fahrwerk (brake = False: langsam stoppen)

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()
► In Zwischenablage kopieren

 

 

FERNSTEUERUNG DES OXOROVERS

 

Mit den Kenntnissen aus dem Kapitel 4 kannst du eine Fernsteuerung mit deinem Handy realisieren, ohne eine spezielle Smartphone-App zu installieren. Das Konzept ist das Folgende:

Du startest auf der Oxocard einen Access-Point und eine Webserver, der eine einfache HTML-Seite anbietet. Diese zeigt 5 Buttons forward, backward, left, right und stop zur Steuerung des Roboters. Bei einem HTTP-Request des Handybrowsers führst du die entsprechende Aktion auf der Oxocard aus.

 

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)    
► In Zwischenablage kopieren

 

 

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

 

 

1.

Montiere einen Distanzsensor, z.B. einen Laser-Distanzsensor und schreibe ein Programm, damit der OxoRover nicht von einer runden Tischplatte herunterfällt oder beim Fahren gegen eine Wand nicht mir ihr kollidiert und rückwärts fährt.

 

2.

Montiere einen Lichtsensor, der nach unten zeigt und schreibe ein Programm, damit der OxoRover der Kante eines Streifens nachfährt.


 


 

3.
Montiere zwei Lichtsensoren, die nach unten zeigen und schreibe ein Programm, damit der OxoRover entlang eines Streifens fährt.