Manchmal sieht etwas so einfach aus: Schaltplan skizzieren, alles aufbauen und los geht’s. Das dachte ich auch bei meinem neuen Roboter dem minibot. Aber leider bewegten sich die Motoren meines kleinen Bots kein Stück.
Lange suchte ich den Fehler in der neu erstellten Test-Software, die ich (erstmals) in Python programmierte. Insbesondere, da das Monster Moto Shield zur Geschwindigkeitsregelung der Motoren PWM (Pulsweitenmodulation) benötigt. Diese wird mit dem verwendeten Python-Modul GPIO per Software erzeugt. Zum Mitmachen und Suchen des Fehlers hier einmal der verwendete Sourcecode:
#!/usr/bin/python try: import RPi.GPIO as GPIO except RuntimeError: print("Error importing RPi.GPIO! This is probably because you need superuser privileges. You can achieve this by using 'sudo' to run your script") import time # for sleep # print some infos # print GPIO.RPI_INFO # timings secs = 5 # init GPIO.setmode(GPIO.BCM) # use the GPIO names, _not_ the pin numbers on the board # pins BOARD BCM motor1A = 17 # Motor 1 A pin 11 = GPIO 17 motor1B = 27 # Motor 1 B pin 13 = GPIO 27 motor1PWM = 22 # Motor 1 PWM pin 15 = GPIO 22 motor2A = 25 # Motor 2 A pin 22 = GPIO 25 motor2B = 8 # Motor 2 B pin 24 = GPIO 8 motor2PWM = 7 # Motor 2 PWM pin 26 = GPIO 7 # speed in percent motor1speed = 128 # 128 motor2speed = 128 # 128 # PWM duty cycle motor1dc = 1.0 motor2dc = 1.0 # PWM frequency in Hz motor1freq = 100 motor2freq = 100 # setup GPIO outputs print('starting setup...') GPIO.setup(motor1A, GPIO.OUT) GPIO.setup(motor1B, GPIO.OUT) GPIO.setup(motor1PWM, GPIO.OUT) GPIO.setup(motor2A, GPIO.OUT) GPIO.setup(motor2B, GPIO.OUT) GPIO.setup(motor2PWM, GPIO.OUT) # setup PWM Hz # pwm1 = GPIO.PWM(motor1PWM, motor1freq) # pwm2 = GPIO.PWM(motor2PWM, motor2freq) # neu neu neu GPIO.output(motor1PWM, GPIO.HIGH) GPIO.output(motor2PWM, GPIO.HIGH) # start pwm print('starting PWM...') #pwm1.start(motor1dc) #pwm2.start(motor2dc) # --- drive --- print('!!driving forward for ' + str(secs) + ' seconds !!') # motor 1 forward GPIO.output(motor1A, GPIO.HIGH) GPIO.output(motor1B, GPIO.LOW) # motor 2 forward GPIO.output(motor2A, GPIO.HIGH) GPIO.output(motor2B, GPIO.LOW) # delay x seconds time.sleep(secs) # --- stop --- print('motor off...') # motor 1 GPIO.output(motor1A, GPIO.LOW) GPIO.output(motor1B, GPIO.LOW) # motor 2 GPIO.output(motor2A, GPIO.LOW) GPIO.output(motor2B, GPIO.LOW) # stop pwm print('stopping PWM...') # pwm1.stop() # pwm2.stop() # neu neu neu GPIO.output(motor1PWM, GPIO.LOW) GPIO.output(motor2PWM, GPIO.LOW) # cleanup GPIO.cleanup()
Und Fehler entdeckt? Nein? Nun, zugegeben, der PWM-Teil wurde zum Testen hier noch „deaktiviert“, bzw. die entsprechenden GPIOs einfach stumpf auf HIGH gesetzt. Da ich der Ursache nicht näher, kam, testete ich nun das verbaute Moto Shield mit einem Arduino.
Aber es änderte sich Nichts. Die Motoren sagten keinen Pieps. Also nochmals versucht die Funktionsweise aller Pins genau zu verstehen, und den Aufbau noch weiter vereinfacht: Ein Moto Shield aus einem anderen Roboter ausgebaut, Arduino drunter, Demo-Software auf den Arduino, 6 Volt Motorspannung, Motor angeschlossen: Läuft!
WTF?
Also musste doch irgendwas in der Verkabelung zwischen Raspberry Pi und Monster Moto Shield falsch sein. Darum noch einmal einen Blick auf den Schaltplan geworfen. PS.: Die Lösung ist hier bereits eingezeichnet:
Die Ursache lag an der fehlenden Versorgungsspannung des Moto Shields. Die hier eingezeichneten VCC werden am Moto Shield zusätzlich benötigt und werden nicht über die Motorspannung (hier 6 Volt) erzeugt! Die VCC ist in der Zeichnung als leicht roter Strich zu erkennen.
Und – Tada! – nun fährt der Roboter. Natürlich nicht autonom; einzig die Motoren drehen sich eine gewisse Zeit lang, wie oben aus dem Code ersichtlich. :)