Ich bin erst am Anfang in sachen Programmieren und hoffe hier Hilfe zu finden. Ich habe versucht einen Slide Regler in form einer GUI zu erstellen der mir einen Servomotor bewegt. Der Code sieht wie folgt aus :
from tkinter import *
import pigpio
import time
servo = 3
pi= pigpio.pi()
pi.set_mode(servo, pigpio.OUTPUT)
def changeServoAngle(angle): Hier ist das Problem ich weiß nicht wie ich die def changeServoAngle
mache
pi.set_servo_pulsewidth(servo, 650)
pi.set_servo_pulsewidth(servo,2100)
#GUI
root= Tk()
root.wm_title('Servo Control GUI')
scale = Scale(root, from_=1, to=180, orient=HORIZONTAL, length=400, command=changeServoAngle)
scale.grid(row=0, column=0, padx=10, pady=3)
root.mainloop() # GUI wird upgedated. Danach keine Elemente setzen
Ich hoffe hier Hilfe zu finden
MfG
Michael
GUI zur Steuerung eines Servo's
- noisefloor
- User
- Beiträge: 3856
- Registriert: Mittwoch 17. Oktober 2007, 21:40
- Wohnort: WW
- Kontaktdaten:
Hallo,
was ist denn genau die Frage? Wie du das mit pigpio machst oder wie der Wert in die Funtkion kommt?
Der folgende Code gibt den Wert des Sliders per `print()` aus:
Der Wert von `scale` wird automatisch an die an `command` gebundene Funktion übergeben.
Wichtig: es wird _jeder_ Wert direkt übergeben. Wenn du Funktion `change_servo_anlge` also langsam ist (weil z.B. der Servo langsam ist), dann kann es sein, dass der Servo dem Slider nicht folgen kann.
Gruß, noisefloor
was ist denn genau die Frage? Wie du das mit pigpio machst oder wie der Wert in die Funtkion kommt?
Der folgende Code gibt den Wert des Sliders per `print()` aus:
Code: Alles auswählen
import tkinter as tk
def change_servo_angle(angle):
print(angle)
root= tk.Tk()
root.wm_title('Servo Control GUI')
scale = tk.Scale(root, from_=1, to=180, orient=tk.HORIZONTAL, length=400,
command=change_servo_angle)
scale.grid(row=0, column=0, padx=10, pady=3)
root.mainloop()
Wichtig: es wird _jeder_ Wert direkt übergeben. Wenn du Funktion `change_servo_anlge` also langsam ist (weil z.B. der Servo langsam ist), dann kann es sein, dass der Servo dem Slider nicht folgen kann.
Gruß, noisefloor
-
- User
- Beiträge: 16
- Registriert: Sonntag 14. Januar 2018, 19:13
Danke für deine antwort mein problem ist das sich mit meiner def der servo so nicht bewegt sprich wie geb ich den 0-180 grad vom servo an die 650-2100msec weiter (650-2100= bei meinen servo jeweils der maximal anschlag)
MfG
MfG
- noisefloor
- User
- Beiträge: 3856
- Registriert: Mittwoch 17. Oktober 2007, 21:40
- Wohnort: WW
- Kontaktdaten:
Hallo,
da musst du dir halt ein passende Formel bauen, die die 0 - 180, die der Slider liefert, in 650 - 2100, die der Server kann, umrechnet. Und dann halt den berechneten Wert an die pigpio Funktion weiter geben.
Gruß, noisefloor
da musst du dir halt ein passende Formel bauen, die die 0 - 180, die der Slider liefert, in 650 - 2100, die der Server kann, umrechnet. Und dann halt den berechneten Wert an die pigpio Funktion weiter geben.
Gruß, noisefloor
-
- User
- Beiträge: 16
- Registriert: Sonntag 14. Januar 2018, 19:13
Ok danke werd mir da mal gedanken machen wie ich das am besten anstelle sollte das dann so aussehen?
Pi.set_servo_pulsewidth(servo, (formel))
Mfg
Pi.set_servo_pulsewidth(servo, (formel))
Mfg
- noisefloor
- User
- Beiträge: 3856
- Registriert: Mittwoch 17. Oktober 2007, 21:40
- Wohnort: WW
- Kontaktdaten:
Hallo,
ob du die Formel direkt in den Funktionsaufruf einbaust oder vorher an eine Variable bindest und dann übergibst hängt in erster Linien davon ab, wo komplex die Formel ist. Der Code soll ja noch lesbar sein... Funktionieren tut beides.
Gruß, noisefloor
ob du die Formel direkt in den Funktionsaufruf einbaust oder vorher an eine Variable bindest und dann übergibst hängt in erster Linien davon ab, wo komplex die Formel ist. Der Code soll ja noch lesbar sein... Funktionieren tut beides.
Gruß, noisefloor
-
- User
- Beiträge: 16
- Registriert: Sonntag 14. Januar 2018, 19:13
Ah ok stimmt danke für deine Hilfe werde das Ergebnis dan hier posten wenn ich die lösung habe
-
- User
- Beiträge: 16
- Registriert: Sonntag 14. Januar 2018, 19:13
ich komme im moment einfach nicht weiter ich hab schon vieles probiert aber ich bekomme es einfach nicht hin die werte vom slider an den servo zu übergeben :K :K
-
- User
- Beiträge: 16
- Registriert: Sonntag 14. Januar 2018, 19:13
Also das war die ausgangsposition
bin für jede hilfe sehr dankbar bin leider noch ganz am anfang
mfg
Code: Alles auswählen
from tkinter import *
import pigpio
import time
servo = 3
pi= pigpio.pi()
pi.set_mode(servo, pigpio.OUTPUT)
def changeServoAngle(angle): #Hier ist das Problem ich weiß nicht wie ich die def changeServoAngle mache
pi.set_servo_pulsewidth(servo, 650)
pi.set_servo_pulsewidth(servo,2100)
#GUI
root= Tk()
root.wm_title('Servo Control GUI')
scale = Scale(root, from_=1, to=180, orient=HORIZONTAL, length=400, command=changeServoAngle)
scale.grid(row=0, column=0, padx=10, pady=3)
root.mainloop() # GUI wird upgedated
mfg
- noisefloor
- User
- Beiträge: 3856
- Registriert: Mittwoch 17. Oktober 2007, 21:40
- Wohnort: WW
- Kontaktdaten:
Hallo,
@Michael1991: du solltest aber schon die Tipps, die dir gegeben wurden, einarbeiten - ob's dann so direkt läuft ist sekundär. Nur solltest du hier zeigen, was du probiert hast - sonst wird das nichts. Ohne sichtbare Aktionen deinerseits gibt's auch eher wenige weitere Aktionen der Hilfsbereiten.
Gruß, noisefloor
@Michael1991: du solltest aber schon die Tipps, die dir gegeben wurden, einarbeiten - ob's dann so direkt läuft ist sekundär. Nur solltest du hier zeigen, was du probiert hast - sonst wird das nichts. Ohne sichtbare Aktionen deinerseits gibt's auch eher wenige weitere Aktionen der Hilfsbereiten.
Gruß, noisefloor
-
- User
- Beiträge: 16
- Registriert: Sonntag 14. Januar 2018, 19:13
Achso ja kann ich noch machen hatte nur gedacht da ich bei den versuchen noch keinen erfolg hatte piste ich die ausgangsposition werde mich bemühen das ich mit hilfe von meinem buch und den tips von hier am wochenende ein ergebnis bekomme
Mfg
Mfg
-
- User
- Beiträge: 16
- Registriert: Sonntag 14. Januar 2018, 19:13
so erster erfolg ist da
DANKE noisefloor du hast es ja schön beschrieben aber ich hab irgenwie zu kompliziert gedacht ist zwar noch nicht das gewünschte endergebnis aber der servo bewegt sich schonmal.
damit ich es mit einer scale von 1 -180 hinbekomme muss ich es jetzt noch schaffen die scale auszulesen und mit einem errechneten wert an den servo weiter zu geben.
dabei war mein gedanke so ich hab 650-2100 msec also einen bereich von 1450 wenn ich jetzt die 1450 durch die 180 von der scale rechne bekomme ich 8.06 raus jetzt hatte ich es so probiert:
da hab ich im moment noch das problem mit
NameError: name 'scale' is not defined
DANKE noisefloor du hast es ja schön beschrieben aber ich hab irgenwie zu kompliziert gedacht ist zwar noch nicht das gewünschte endergebnis aber der servo bewegt sich schonmal.
Code: Alles auswählen
from tkinter import*
import pigpio
import time
servo = 3
pi=pigpio.pi()
pi.set_mode(servo, pigpio.OUTPUT)
def change_servo_angle(angle):
pi.set_servo_pulsewidth(servo, angle) #Der wert wird direkt an die command gebundene funktion übergeben
root= Tk()
root.wm_title('Servo Control GUI')
scale = Scale(root, from_=650, to=2100, orient=HORIZONTAL, length=400,
command=change_servo_angle)
scale.grid(row=0, column=0, padx=10, pady=3)
root.mainloop()
dabei war mein gedanke so ich hab 650-2100 msec also einen bereich von 1450 wenn ich jetzt die 1450 durch die 180 von der scale rechne bekomme ich 8.06 raus jetzt hatte ich es so probiert:
Code: Alles auswählen
from tkinter import*
import pigpio
import time
servo = 3
a=8.06 #1450/180
b=650 # ausgangsposition vom servo
c= scale * 8.06 + 650 # der wert der an den servo übergeben werden soll
pi=pigpio.pi()
pi.set_mode(servo, pigpio.OUTPUT)
def change_servo_angle(angle):
pi.set_servo_pulsewidth(servo,c)
root= Tk()
root.wm_title('Servo Control GUI')
scale = Scale(root, from_=1, to=180, orient=HORIZONTAL, length=400,
command=change_servo_angle)
scale.grid(row=0, column=0, padx=10, pady=3)
root.mainloop()
da hab ich im moment noch das problem mit
NameError: name 'scale' is not defined
-
- User
- Beiträge: 16
- Registriert: Sonntag 14. Januar 2018, 19:13
DANKE DANKE DANKE
Vielen Dank für eure Hilfe
MfG
Jetzt hab ich es__deets__ hat geschrieben:Na du musst deine Berechnung schon in change_servo_angle machen. Und statt scale meinst du wohl angle, den Parameter an deinen callback.
Code: Alles auswählen
from tkinter import*
import pigpio
import time
servo = 3
pi=pigpio.pi()
pi.set_mode(servo, pigpio.OUTPUT)
def change_servo_angle(angle):
d = float(angle) *8.06 +650
pi.set_servo_pulsewidth(servo, d)
root= Tk()
root.wm_title('Servo Control GUI')
scale = Scale(root, from_=1, to=180, orient=HORIZONTAL, length=400,
command=change_servo_angle)
scale.grid(row=0, column=0, padx=10, pady=3)
root.mainloop()
MfG
-
- User
- Beiträge: 16
- Registriert: Sonntag 14. Januar 2018, 19:13
So da die Steuerung jetzt so mal Funktioniert möchte ich sie jetzt erweitern und zwar mit LED's hab an 8 stk gedacht die mir den Winkel vom Servo anzeigen. Also von 0-20 Grad leuchtet 1 Led von 21-40 Grad 2 LED's usw. ich hoffe ich darf bei fragen wieder auf euch zurückkommen.
MfG
MfG
-
- User
- Beiträge: 16
- Registriert: Sonntag 14. Januar 2018, 19:13
Hallo zusammen ich bräuchte bitte nochmal eure hilfe habe den code jetzt zur probe mal so erweitert und wenn ich das skript starte ist alles solange ok bis ich auf den slider klicke und ihn verschieben möchte (wert ändern)
der code sieht wie folgt aus:
vielen dank im vorhinein
mfg michael
der code sieht wie folgt aus:
Code: Alles auswählen
from tkinter import*
import pigpio
import RPi.GPIO as gpio
import time
servo = 3
led1 = 11
led2 = 15
gpio.setwarnings(False)
gpio.setmode(gpio.BOARD)
pi=pigpio.pi()
pi.set_mode(servo, pigpio.OUTPUT)
gpio.setup(led1, gpio.OUT)
gpio.setup(led2, gpio.OUT)
def change_servo_angle(angle):
d = float(angle) *8.06 +650
a = angle
pi.set_servo_pulsewidth(servo, d)
while int(input(angle))<=20:
gpio.setup(led1, true)
root= Tk()
root.wm_title('Servo Control GUI')
scale = Scale(root, from_=1, to=180, orient=HORIZONTAL, length=400,
command=change_servo_angle)
scale.grid(row=0, column=0, padx=10, pady=3)
root.mainloop()
gpio.cleanup()
mfg michael
Du kannst keine while-Schleife benutzen, die beim slider-Wert kleiner 20 halt endlos rumrennt. Und das *input* hat doch erst recht nichts da verloren, das wartet dann doch auf dem Terminal auf eine Eingabe, die du in Form von angle doch schon laengst hast? Was du da brauchst ist eine if-Abfrage stattdessen
Und ein bisschen mehr Sorgfalt kann auch nicht schaden - a = angle ist voellig unnuetz, und "true" gibt's in Python auch nicht. Ausserdem mischst du pigpio und RPI.GPIO, das ist Unfug. Benutz *nur* pigpio, das kann genauso LEDs schalten. Den Import von time auch gleich rausschmeissen, das Modul kannst du in einer GUI sinnvoll eh nicht benutzen.
Und ein bisschen mehr Sorgfalt kann auch nicht schaden - a = angle ist voellig unnuetz, und "true" gibt's in Python auch nicht. Ausserdem mischst du pigpio und RPI.GPIO, das ist Unfug. Benutz *nur* pigpio, das kann genauso LEDs schalten. Den Import von time auch gleich rausschmeissen, das Modul kannst du in einer GUI sinnvoll eh nicht benutzen.
-
- User
- Beiträge: 16
- Registriert: Sonntag 14. Januar 2018, 19:13
vielen dank deets habs jetzt so gelöst und es funktioniert
Danke nochmal
mfg michael
Code: Alles auswählen
from tkinter import*
import pigpio
servo = 3
led1 = 11
led2 = 15
pi=pigpio.pi()
pi.set_mode(servo, pigpio.OUTPUT)
pi.set_mode(led1, pigpio.OUTPUT)
pi.set_mode(led2, pigpio.OUTPUT)
def change_servo_angle(angle):
d = float(angle) *8.06 +650
pi.set_servo_pulsewidth(servo, d)
if int(angle)<=20:
pi.write(led1, 1)
else:
pi.write(led1, 0)
root= Tk()
root.wm_title('Servo Control GUI')
scale = Scale(root, from_=1, to=180, orient=HORIZONTAL, length=400,
command=change_servo_angle)
scale.grid(row=0, column=0, padx=10, pady=3)
root.mainloop()
mfg michael
-
- User
- Beiträge: 16
- Registriert: Sonntag 14. Januar 2018, 19:13
hallo ich habe eine frage ich möchte bei meinem code das eine led zwischen den werten 21 und 40 leuchtet nur leuchtet die led ab 21 und hört bei 40 nicht mehr auf hier die dazugehörige codezeile
vielen dank für eure hilfe
mfg michael
Code: Alles auswählen
if int(angle) >20 <40 :
pi.write(led2, 1)
else:
pi.write(led2, 0)
mfg michael