Hallo Leute,
ich habe eine Frage bezüglich Threads. 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:
# ADXL345 Python library for Raspberry Pi
#
# author: Jonathan Williamson
# license: BSD, see LICENSE.txt included in this package
#
# This is a Raspberry Pi Python implementation to help you get started with
# the Adafruit Triple Axis ADXL345 breakout board:
# http://shop.pimoroni.com/products/adafruit-triple-axis-accelerometer
import time, smbus, os, math, sys
# from time import sleep
# Threads Bibliothek importieren
from threading import Thread
# Das Programm L298NHBridge.py wird als Modul geladen.
import L298NHBridge as HBridge
bus = smbus.SMBus(1)
address = 0x1e
# Variablen initialisieren fuer das Gyroskop
z = 0
turn= 0
# Motor Grund-Geschwindigkeit
speed = 0.7
turn_delta = 0
stopp = 0
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)
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
# Drehen um einen bestimmten Gradwert
def turn_robot(value):
global turn
global turn_delta
global speed
global z
global stopp
# uebergebener Wert aus der Eingabe des Anwenders
turn = value
# initiale Drehgeschwindigkeit
speed = 0.7
# So lange stopp = 0 arbeitet dieser Thread in der
# Endlosschleife
while stopp == 0:
if turn <= 180:
if turn - z > 0:
HBridge.setMotorLeft(speed)
HBridge.setMotorRight(-speed)
elif turn - z < 0:
HBridge.setMotorLeft(-speed)
HBridge.setMotorRight(speed)
elif turn > 180:
if z - turn > 0:
HBridge.setMotorLeft(-speed)
HBridge.setMotorRight(speed)
elif z - turn < 0:
HBridge.setMotorLeft(speed)
HBridge.setMotorRight(-speed)
# Berechnung der aktuellen Abweichung.
turn_delta = turn - z
# Wenn die Abweichung zum Ziel lediglich
# +-15 Grad betraegt verlangsamen die Motoren.
if z - 15 < turn < z + 15:
speed = 0.5
# Wenn die Abweichung zum Ziel lediglich +-2 Grad betraegt
# stoppen die Motoren und das Programm wird beendet.
if z - 2 < turn < z + 2:
# Anzeige des roten Stopp Symbols
stopp = 1
time.sleep(0.04)
# Auslesen des Gyroskopes des Sense HAT
def gyroscope():
# Variablen als global definieren
global z_out
global y_out
global x_out
global z
global stopp
while True:
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
print "Bearing: ", math.degrees(z)
time.sleep(0.03)
# Einlesen der Gradzahl die der Anwender eingibt
gradzahl=input("Grad Zahl fuer die Drehung des Roboter-Autos: ")
# Pruefen ob die eingegebene Grad Zahl Sinn macht.
if gradzahl <= 0 or gradzahl >= 360:
print "--------------------------------------------"
print "Bitte eine Gradzahl zwischen >0 und <360 eingeben."
print "--------------------------------------------"
else:
# initialisieren der Threads gyroscope und compass.
t_gyroscope = Thread(target=gyroscope)
t_turn_robot = Thread(target=turn_robot, args=(gradzahl,))
# Starten der Threads gyroscope und compass.
t_gyroscope.start()
t_turn_robot.start()
t_gyroscope.join()
t_turn_robot.join()
Alles anzeigen
Ich bin nicht so firm in Python... das so vorab. Ich habe mir das Script irgendwie zusammen gebastelt.
Zur Sicherheit hänge ich es einfach noch mal an.
Was geschieht, wenn ich das Script starte?
Nun, ich werde nach der Richtung gefragt, die sich der Bot drehen soll. Nach Eingabe, dreht sich aber der Bot ständig um die eigene Achse.
Das Script läuft ohne Ende weiter. Eine Fehlermeldung kommt nicht.
Damit der Bot stehen bleibt, muss ich das Terminal schließen.
Ich finde einfach den Fehler nicht. Die Variable "z" wird doch übergeben und hat doch einen Wert....
Vielleicht kann ja jemand helfen.
Ich danke.