Nachdem ich die L293D verstanden hatte, habe ich mir eine Platine geholt und die Bauteile aufgelötet. Leider hatte ich nur drei verschiedene Farben Draht zur Verfügung. Also habe ich für Ground Weiß, für +V Braun und für alles andere Grün genommen. Sehr übersichtlich ist es nicht. Vielleicht mache ich das Ganze nochmals neu, wenn alles einmal läuft.
Als nächstes habe ich mir überlegt, wie ich am besten die Akkus anbringe. Diese wollte ich unbedingt auf der unteren Ebene befestigen, vor allem wegen dem Gewicht. Auch die Zugänglichkeit für den Rapberry und Co ist hier wichtiger.
Außerdem steht in der Zukunft noch an, dass ich ein Ladegerät für sechs AA-Akkus organisiere und diese dann über einen Steckmechanismus laden kann. Somit müsste ich die obere Ebene nicht jedes Mal ab- und wieder anschrauben.
Als nächstes habe ich einige Jumper Kabel abgezwickt und mit den einzelnen Kabeln der Motoren verknüpft. Zwei Jumper habe ich noch an die Enden der Batteriefächer gelötet. Auf die Platine habe ich die dementsprechend Anzahl Pins montiert. Jetzt kann ich meine Motoren sehr leicht an und ausstecken.
Zusätzlich habe ich noch einen Schalter angebracht, mit dem ich die Batteriefächer zuschalten kann. Eine rote LED mit Vorwiderstand zeigt mir an, ob die Spannung aktiv ist oder nicht.
Die Platine ist mit etwas längeren Schrauben an der oberen Ebene befestigt und der Raspberry Pi versetzt darunter (siehe Bild). Hinter oder unter erstere soll die Powerbank für den Raspberry Pi angebracht werden. Leider ist meine bisherige ein paar Millimeter zu breit. Hier muss ich mir unbedingt noch eine Lösung einfallen lassen.
Die Löcher für die Montage habe ich einfach mit einem passenden Bohrer hinzugefügt. Das Plastik hält das durchaus aus. Trotzdem ist Vorsicht besser als Nachsicht. Laufen zu viele Löcher in einer Bahn, hat man schnell eine Sollbruchstelle. Mir ist beim Verschrauben vorne Rechts der Zapfen mit dem Loch für die Verbindungsstrebe abgebrochen. Obwohl ich mit wenig Druck gearbeitet hatte. Aber mit diesem Schaden kann ich durchaus leben.
Ein wenig Code habe ich auch schon geschrieben. Zum eine die Motor Klasse, die ich benutze, um die Motoren zu steuern. Und meine „main“, in der ich eben alles andere regele. Bisher funktioniert leider nur das Testen der Motoren, für den Rest muss ich mir noch ein wenig Steuerungscode ausdenken. Ich möchte unbedingt eine GUI mit Tkinter erstellen und über diese das spätere Webcam Bild ausgeben lassen. Zudem soll auf ihr der Status der einzelnen Räder und aller zusammen angezeigt werden. Ich überlege auch, eine Socket Connection herzustellen und die Steuerungssoftware auf einem Windows PC laufen zu lassen.
Hier die Motor Klasse:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 |
#!/bin/python # Imports import RPi.GPIO as io from time import sleep io.setmode(io.BCM) # Steuerung eines Motors mit allen Funktionen class Motor(): # PWM Pin Nummer (Integer) global pwmPin # PWM Signal global geschwindigkeit # Geschwindigkeit in Lesbaren Zahlen global speed # In Pins Nummer (Integer) global pinInEins global pinInZwei # In Pins Stati global pinInEinsStatus global pinInZweiStatus # Konstruktor def __init__(self, pwmPin, pinInEins, pinInZwei): self.pwmPin = pwmPin self.pinInEins = pinInEins self.pinInZwei = pinInZwei self.pinInEinsStatus = False self.pinInZweiStatus = False self.setupInPins() self.setupPWM() # Pins konfigurieren # Sollte nur einmal, am Anfang, aufgerufen werden def setupInPins(self): io.setup(self.pinInEins, io.OUT) io.setup(self.pinInZwei, io.OUT) io.setup(self.pwmPin, io.OUT) self.changeInPinSignal() #PWM konfigurieren # Darf/sollte nur einmal, am Anfang aufgerufen werden def setupPWM(self): # Pulse Weite self.geschwindigkeit = io.PWM(self.pwmPin, 100) # Start des Pulses self.geschwindigkeit.start(0) # Stillstand vorgeben self.geschwindigkeitAendern(0) # Vorwaerts fahren def moveVorwaehrts(self): self.pinInEinsStatus = False self.pinInZweiStatus = True self.changeInPinSignal() # Rueckwaerts fahren def moveRueckwaerts(self): self.pinInEinsStatus = True self.pinInZweiStatus = False self.changeInPinSignal() # Bremsen; Output auf False def bremsen(self): self.pinInEinsStatus = False self.pinInZweiStatus = False self.changeInPinSignal() self.geschwindigkeitAendern(0) # Pin Signale veraendern def changeInPinSignal(self): io.output(self.pinInEins, self.pinInEinsStatus) io.output(self.pinInZwei, self.pinInZweiStatus) # Geschwindigkeit veraendern def geschwindigkeitAendern(self, speed): # pwmPin Range 0-100, Angabe fuer den Benutzer 0-9 # Multiplikator ist 11, um auf die Prozentzahl zu kommen speed = int(speed) * 11 self.geschwindigkeit.ChangeDutyCycle(speed) self.speed = speed def getGeschwindigkeit(self): return self.speed def getInPinEinsStatus(self): return self.pinInEinsStatus def getInPinZweiStatus(self): return self.pinInZweiStatus def testen(self): print("Vorwaerts:") self.moveVorwaehrts() for x in range(0, 11): if x != 10: print("Geschwindigkeit: " + str(x)) self.geschwindigkeitAendern(x) else: print("Bremsen") self.bremsen() sleep(1) self.moveRueckwaerts() for y in range(0, 11): if y != 10: print("Geschwindigkeit: " + str(y)) self.geschwindigkeitAendern(y) else: print("Bremsen") self.bremsen() sleep(1) |
Und das ist meine „main“:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 |
#!/bin/python # Imports import RPi.GPIO as io # Import own class from Motor import * # Abfrage nach dem naechsten Kommando def frageKommando(text): eingabe = raw_input(text) return eingabe # Kommando bearbeiten def bearbeiteKommando(kommando): action = kommando[0] # Programm beenden if action == "x": beenden() elif action == "t": # Motortest starten testeMotor() elif action == "s": # Programm starten print("Comming Soon") else: print("Ungueltiges Kommando") # Komplettes Programm beenden und cleanup durchfuehren def beenden(): print("Das Programm wird nun beendet!") io.cleanup() exit() # Motoren testen def testeMotor(): weitererTest = True while True: kommando = frageKommando("""Bitte den zu testenden Motor auswaehlen: lh = Motor links hinten rh = Motor rechts hinten lv = Motor links vorne rv = Motor rechts vorne tb = Tests beenden """) motorauswahl = kommando[0] + kommando[1] if motorauswahl == "lh": print("Motor links hinten ausgewaehlt. Tests werden druchgefuehrt.") motorLinksHinten.testen() print("Test beendet.") elif motorauswahl == "rh": print("Motor rechts hinten ausgewaehlt. Tests werden druchgefuehrt.") motorRechtsHinten.testen() print("Test beendet.") elif motorauswahl == "lv": print("Motor links vorne ausgewaehlt. Tests werden druchgefuehrt.") motorLinksVorne.testen() print("Test beendet.") elif motorauswahl == "rv": print("Motor rechts vorne ausgewaehlt. Tests werden druchgefuehrt.") motorRechtsVorne.testen() print("Test beendet.") elif motorauswahl == "tb": # Tests beenden print("Test wird beendet") weitererTest == False break else: print("Falsches Kommando.") # || MAIN || # if __name__ == '__main__': # Motoren initialisieren motorLinksVorne = Motor(23, 2, 3) motorRechtsVorne = Motor(15, 27, 22) motorLinksHinten = Motor(18, 10, 9) motorRechtsHinten = Motor(14, 4, 17) # Willkommensnachricht print("Willkommen beim Raspberry Car.") while True: # Kommando abfragen kommando = frageKommando("""Bitte waehle eine Option: t = Motortests starten s = Programm starten x = Programm beenden """) # Kommando verarbeiten bearbeiteKommando(kommando) # Cleanup io.cleanup() |
Den aktuellsten Code gibt es immer in meinem GitHub Repo:
github.com/PetzJohannes/RaspberryCar_v2
Hier noch zwei Bilder vom Aufbau: