Debugging minibot

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.

minibot - Monster Moto Shield-Debugging mit Arduino
minibot – Monster Moto Shield-Debugging mit 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?

minibot - separater Test mit anderem Motor und Arduino
minibot – separater Test mit anderem Motor und Arduino
minibot - Monster Moto Shield-Debugging mit Arduino
minibot – Monster Moto Shield-Debugging mit Arduino

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:

minibot- Wo war der Fehler im Schaltplan?
minibot- Wo war der Fehler im Schaltplan?

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. :)

 

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert