Guten Tag,
ich hätte da einmal eine Frage:
Ich habe ein Auto gebaut, bei dem ich mittels PWM die Geschwindigkeit beim Vorfahren einstellen möchte. Im Script funktioniert dies auch perfekt, indem ich einfach die Variable ändere. Ich möchte dies aber nun mittels tkinter und einem Schieberegler realisieren, sodass ich über diese die Geschwindigkeit steuern kann.
Hier mal der Code:
##Importieren der Lybraries
import RPi.GPIO as GPIO #zur Vereinfachung umbenennen in GPIO
import time
##Boardlayout setzten: Boardnummerierung
GPIO.setmode(GPIO.BOARD)
#Mindestabstand a(vorne), b(rechts) und c(links)
global aa
global bb
global cc
aa = 38 #Abstand vorne USS 1
bb = 26 #Abstand rechts USS 2
cc = 26 #Abstand links USS 3
##Eingaenge und Ausgaenge zur Vereinfachung umbenennen
Trig1 = 21 #Daten USS1 #Lila
Echo1 = 23 #Blau
Trig2 = 15 #Daten USS3 #Grau
Echo2 = 26 #Braun
Trig3 = 8 #Daten USS2 #Weiss
Echo3 = 10 #Gruen
#Eingaenge vom Motorshield
In1 = 7
In2 = 13
In3 = 16
In4 = 18
#Skriptschalter
startb = 19
#Fehler LED
ERR = 24
GPIO.setup(In1, GPIO.OUT)
GPIO.setup(In2, GPIO.OUT)
GPIO.setup(In3, GPIO.OUT)
GPIO.setup(In4, GPIO.OUT)
GPIO.setup(Trig1, GPIO.OUT)
GPIO.setup(Echo1, GPIO.IN)
GPIO.setup(Trig2, GPIO.OUT)
GPIO.setup(Echo2, GPIO.IN)
GPIO.setup(Trig3, GPIO.OUT)
GPIO.setup(Echo3, GPIO.IN)
GPIO.setup(startb, GPIO.IN)
GPIO.setup(ERR, GPIO.OUT)
GPIO.output(Trig1, 0)
GPIO.output(Trig2, 0)
GPIO.output(Trig3, 0)
time.sleep(0.3)
#Geschwindigkeit Reifen links und rechts mittels PWM
global ld
global rd
ld = 100 #Geschwindigkeit links
rd = 100 #Geschwindigkeit links
pwm1 = GPIO.PWM(In1, 100)
pwm2 = GPIO.PWM(In4, 100)
#Definition der unterschiedlichen Methoden
def aus():
pwm1.stop()
pwm2.stop()
GPIO.output(In1, 0)
GPIO.output(In2, 0)
GPIO.output(In3, 0)
GPIO.output(In4, 0)
def vor():
pwm1.start(ld)
GPIO.output(In2, 0)
GPIO.output(In3, 0)
pwm2.start(rd)
time.sleep(0.1)
GPIO.output(In1, 0)
GPIO.output(In2, 0)
GPIO.output(In3, 0)
GPIO.output(In4, 0)
print("Ich bin vorgefahren!")
def rueck():
pwm1.stop()
pwm2.stop()
GPIO.output(In1, 0)
GPIO.output(In2, 1)
GPIO.output(In3, 1)
GPIO.output(In4, 0)
time.sleep(0.23)
aus()
print("Ich bin zurueckgefahren!")
def rueckweit():
pwm1.stop()
pwm2.stop()
GPIO.output(In1, 0)
GPIO.output(In2, 1)
GPIO.output(In3, 1)
GPIO.output(In4, 0)
time.sleep(0.5)
aus()
print("Ich bin weit zurueckgefahren!")
def rechts():
pwm1.stop()
pwm2.stop()
GPIO.output(In1, 1)
GPIO.output(In2, 0)
GPIO.output(In3, 1)
GPIO.output(In4, 0)
time.sleep(0.5)
aus()
print("Ich habe mich nach rechts gedreht!")
def rechtsweit():
pwm1.stop()
pwm2.stop()
GPIO.output(In1, 1)
GPIO.output(In2, 0)
GPIO.output(In3, 1)
GPIO.output(In4, 0)
time.sleep(0.75)
aus()
print("Ich habe mich weit nach rechts gedreht!")
def links():
pwm1.stop()
pwm2.stop()
GPIO.output(In1, 0)
GPIO.output(In2, 1)
GPIO.output(In3, 0)
GPIO.output(In4, 1)
time.sleep(0.5)
aus()
print("Ich habe mich nach links gedreht!")
def linksweit():
pwm1.stop()
pwm2.stop()
GPIO.output(In1, 0)
GPIO.output(In2, 1)
GPIO.output(In3, 0)
GPIO.output(In4, 1)
time.sleep(0.75) #ca 68 Grad
aus()
print("Ich habe mich weit nach links gedreht!")
def Error():
aus()
#Blaue LED Blinken
GPIO.output(ERR, 1)
time.sleep(0.3)
GPIO.output(ERR, 0)
time.sleep(0.3)
#Definition der 3 Messungen
def messung():
global a #USS 1
global b #USS 3
global c #USS 2
global km
#1
print("Messung 1 wird gestartet...")
GPIO.output(Trig1, 1)
time.sleep(0.00001)
GPIO.output(Trig1, 0)
start1 = time.time()
while GPIO.input(Echo1) == 0:
if(time.time() - start1) > 0.4:
break
while GPIO.input(Echo1) == 1:
pass
stop1 = time.time()
a = (stop1 - start1) * 17000
#2
print("Messung 2 wird gestartet...")
GPIO.output(Trig2, 1)
time.sleep(0.00001)
GPIO.output(Trig2, 0)
start2 = time.time()
while GPIO.input(Echo2) == 0:
if(time.time() - start2) > 0.4:
break
while GPIO.input(Echo2) == 1:
pass
stop2 = time.time()
b = (stop2 - start2) * 17000
#3
print("Messung 3 wird gestartet...")
GPIO.output(Trig3, 1)
time.sleep(0.00001)
GPIO.output(Trig3, 0)
start3 = time.time()
while GPIO.input(Echo3) == 0:
if(time.time() - start3) > 0.4:
break
while GPIO.input(Echo3) == 1:
pass
stop3 = time.time()
c = (stop3 - start3) * 17000
#Kleinster Wert ausgeben
werte = [a, b, c]
werte.sort()
kleinster = werte[0]
if a < b and a < c:
km = 1
elif b < a and b < c:
km = 3
else:
km = 2
print 'Der kleinste Wert ist' , kleinster, 'cm', 'am', 'Ultraschallsensor Nr.', km
#Definition der Hauptfunktion "fahren"
def fahren():
messung()
if a > aa and b > bb and c > cc:
vor()
elif b < c and c > cc:
rueck()
links()
elif c < b and b > bb:
rueck()
rechts()
elif a < aa and b < bb and c < cc:
rueckweit()
if b >= c:
rechtsweit()
elif c > b:
linksweit()
else:
while a < aa:
rechts()
elif b > 15 and c > 15:
rueck()
else:
print("Ich habe ein Problem, wohin soll ich fahren? Ich sitze fest!") #Fall kann nicht eintreffen
#Programmverlauf Hauptprogramm wird durch Schalter gestartet
try:
while True:
GPIO.output(ERR, 1)
if (GPIO.input(startb) == 1):
GPIO.output(ERR, 0)
fahren()
else:
print("Ich bin stehen geblieben, lege den Schalter S1 zum fortfahren um!")
Error()
except KeyboardInterrupt:
aus()
print("Ich bin stehen geblieben, du musst das Programm neustarten!")
GPIO.output(ERR, 1)
Alles anzeigen
Ich habe das ganze schon so versucht zu realisieren:
Es müssen ja die Variablen rd ld verändert werden, also 100 -- 100% der Vollen Geschwinigkeit:
from Tkinter import *
master = Tk()
rd = Scale(master, from_=0, to=100, orient=HORIZONTAL)
rd.pack()
ld = Scale(master, from_=0, to=100, orient=HORIZONTAL)
ld.pack()
mainloop()
Alles anzeigen
Das Problem nun: beides läuft nicht gleichzeitig. Ich bekomme es entweder so hin, dass sich erst das tkinter Fenster zum einstellen öffnet oder das erst das Programm startet.
Hat da jemand eine Idee, wie ich also über eine GUI die beiden Variablen ändern kann, mit 2 Schiebereglern?
MFG