Motorsteuerung mit Gyroskop
Verfasst: Sonntag 4. Juni 2017, 20:19
Hallo,
Ich möchte mit meinem Script bewirken, dass sich mein Bot um die angegebene Grad-Zahl dreht.
Ich verwende ein Pi 3 mit dem Modul HMC883l sowie einer Motorsteuerung.
Damit ich ein Verständnis dafür bekomme, sollen noch einige andere Sensoren (DHT22, GPS, Ultraschall...) hinzukommen und miteinander zusammen kommunizieren.
Mein Script sieht bisher so aus:
Zur besseren Verständnis habe ich die Motorsteuerung erst mal ausgeblendet.
Sobald ich das Starte, möchte ich einen Drehwinkel einstellen. Die Motoren sollen so lange laufen, bis dieser Winkel erreicht wurde.
Es soll auch noch unterscheiden können, ob er schneller nach links dreht, um das Ziel zu erreichen, oder es besser ist, nach rechts zu drehen.
Was passiert derzeit:
- ich kann den Winkel eingeben
- der Winkel (angle_start) wird auch ausgelesen und angezeigt, jedoch nicht verändert (angle_run).
- die Motoren drehen endlos im Kreis
Die Ausgabe sieht so aus:
Was mir nicht so einleuchtet ist, dass sich der Winkel nicht ändert. Nun ich vermute mal, das liegt im Zusammenspiel mit dem Code hier:
...welcher außerhalb der While-Anweisung steht.
Jetzt die Frage:
Wie optimiere ich das? Es ist so, dass "angle_run" sich verändern muss, "turn" ist die Grad-Zahl der Eingabe und "move" ist ja das Ziel.
...ich bin leider nicht so fit in der Sache. Ich wäre dankbar, mich in dieser Sache zu unterstützen.
ich danke euch.
v
Ich möchte mit meinem Script bewirken, dass sich mein Bot um die angegebene Grad-Zahl dreht.
Ich verwende ein Pi 3 mit dem Modul HMC883l sowie einer Motorsteuerung.
Damit ich ein Verständnis dafür bekomme, sollen noch einige andere Sensoren (DHT22, GPS, Ultraschall...) hinzukommen und miteinander zusammen kommunizieren.
Mein Script sieht bisher so aus:
Code: Alles auswählen
#!/usr/bin/python
import time, smbus, math
import L298NHBridge as HBridge
speed = 0.7
bus = smbus.SMBus(1)
address = 0x1e # check: i2cdetect -y 1
turn =input("Grad Zahl fuer die Drehung des Roboter-Autos: ")
# Pruefen ob die eingegebene Grad Zahl Sinn macht.
if turn <= 0 or turn >= 360:
print "--------------------------------------------"
print "Bitte eine Gradzahl zwischen >0 und <360 eingeben."
print "--------------------------------------------"
# +++++++++++++++++++++++++++++++++
# + Gyroskop auslesen +
# +++++++++++++++++++++++++++++++++
def read_byte(adr):
return bus.read_byte_data(address, adr)
def read_word(adr):
high = bus.read_byte_data(address, adr)
low = bus.read_byte_data(address, adr+1)
val = (high << 8) + low
return val
def read_word_2c(adr):
val = read_word(adr)
if (val >= 0x8000):
return -((65535 - val) + 1)
else:
return val
def write_byte(adr, value):
bus.write_byte_data(address, adr, value)
# +++++++++++++++++++++++++++++++++
# + Motorsteuerung +
# +++++++++++++++++++++++++++++++++
# So lange stopp = 0 arbeitet dieser Teil in der
# Endlosschleife
stopp = 0
# Startwinkel speichern
write_byte(0, 0b01110000) # Set to 8 samples @ 15Hz
write_byte(1, 0b00100000) # 1.3 gain LSb / Gauss 1090 (default)
write_byte(2, 0b00000000) # Continuous sampling
scale = 0.92
time.sleep(0.1)
x_out = read_word_2c(3) * scale
y_out = read_word_2c(7) * scale
z_out = read_word_2c(5) * scale
z = math.atan2(y_out, x_out)
if (z < 0):
z += 2 * math.pi
angle_start = int(math.degrees(z))
while stopp == 0:
print "Speed: ",speed
angle_run = int(math.degrees(z))
move = angle_start-turn
if turn <= 180:
if turn > 0:
# Ist speed postiv drehen sich die Motoren vorwaerts.
# Ist speed negativ drehen sich die Motoren rueckwaerts.
#HBridge.setMotorLeft(speed)
#HBridge.setMotorRight(-speed)
print move, " Grad <= 180 Aktuell: ",angle_run
elif turn < 0:
#HBridge.setMotorLeft(-speed)
#HBridge.setMotorRight(speed)
print move, " Grad < 0 Aktuell: ",angle_run
elif turn > 180:
if turn > 0:
#HBridge.setMotorLeft(-speed)
#HBridge.setMotorRight(speed)
print move, " Grad > 0 Aktuell: ",angle_run
elif turn < 0:
#HBridge.setMotorLeft(speed)
#HBridge.setMotorRight(-speed)
print move, " Grad < 0 Aktuell: ",angle_run
# Wenn die Abweichung zum Ziel lediglich
# +-15 Grad betraegt verlangsamen die Motoren.
if angle_run - 15 < turn < angle_run + 15:
speed = 0.5
print "langsamer, Differenz +-15 Grad"
# Wenn die Abweichung zum Ziel lediglich +-2 Grad betraegt
# stoppen die Motoren und das Programm wird beendet.
if angle_run - 2 < turn < angle_run + 2:
stopp = 1.0
print "Stopp, das Ziel ist erreicht!"
time.sleep(0.04)
Sobald ich das Starte, möchte ich einen Drehwinkel einstellen. Die Motoren sollen so lange laufen, bis dieser Winkel erreicht wurde.
Es soll auch noch unterscheiden können, ob er schneller nach links dreht, um das Ziel zu erreichen, oder es besser ist, nach rechts zu drehen.
Was passiert derzeit:
- ich kann den Winkel eingeben
- der Winkel (angle_start) wird auch ausgelesen und angezeigt, jedoch nicht verändert (angle_run).
- die Motoren drehen endlos im Kreis
Die Ausgabe sieht so aus:
- Grad Zahl fuer die Drehung des Roboter-Autos: 100
Speed: 0.7
74 Grad <= 180 Aktuell: 174
Speed: 0.7
74 Grad <= 180 Aktuell: 174
Speed: 0.7
74 Grad <= 180 Aktuell: 174
Speed: 0.7
74 Grad <= 180 Aktuell: 174
Speed: 0.7
74 Grad <= 180 Aktuell: 174
Speed: 0.7
74 Grad <= 180 Aktuell: 174
Speed: 0.7
74 Grad <= 180 Aktuell: 174
Speed: 0.7
74 Grad <= 180 Aktuell: 174
Speed: 0.7
74 Grad <= 180 Aktuell: 174
Was mir nicht so einleuchtet ist, dass sich der Winkel nicht ändert. Nun ich vermute mal, das liegt im Zusammenspiel mit dem Code hier:
Code: Alles auswählen
# Startwinkel speichern
write_byte(0, 0b01110000) # Set to 8 samples @ 15Hz
write_byte(1, 0b00100000) # 1.3 gain LSb / Gauss 1090 (default)
write_byte(2, 0b00000000) # Continuous sampling
scale = 0.92
time.sleep(0.1)
x_out = read_word_2c(3) * scale
y_out = read_word_2c(7) * scale
z_out = read_word_2c(5) * scale
z = math.atan2(y_out, x_out)
if (z < 0):
z += 2 * math.pi
angle_start = int(math.degrees(z))
Jetzt die Frage:
Wie optimiere ich das? Es ist so, dass "angle_run" sich verändern muss, "turn" ist die Grad-Zahl der Eingabe und "move" ist ja das Ziel.
...ich bin leider nicht so fit in der Sache. Ich wäre dankbar, mich in dieser Sache zu unterstützen.
ich danke euch.
v