Gui für Steppersteuerung

Fragen zu Tkinter.
Antworten
casavio
User
Beiträge: 3
Registriert: Dienstag 3. Februar 2015, 19:07

Liebe Forumsmitglieder,

ich habe einen Code geschrieben, der eine GUI für die Steuerung eines Schrittmotors mit Hilfe von Tkinter auf einem Raspberrypi erzeugt.
Das Programm benutzt die Software PWM - Modulation auf einem Raspberry pi.
Die Frequenz und die Pulsdicke der PWM werden mit Schiebereglern eingestellt, soweit funktioniert das.
Der Motor (die PWM) soll über einen Start - button gestartet und einen Stop- Button gestopt werden, um es vorwegzunehmen, der Start Button funktioniert nicht.
Wenn die PWM außerhalb der Klasse gestartet wird, startet sie, wenn icht den Start befehl aus der Funktion "start" aufrufe, geht es nicht. Nach mehreren Abenden des Probierens gebe ich das Problem ins Forum, in der Hoffnung, dass mir jemand weiterhelfen kann. Ich vermute, dass das Objekt PWM nicht richtig in die Klasse übergeben wird.

Gruß casavio

Code: Alles auswählen

#!/usr/bin/env python

import time
import RPi.GPIO as gpio # Library
gpio.setmode(gpio.BCM) 
from Tkinter import *

pins = [7,8,23,10,25]   #Pin 7 ist PWM, Restpins als OUT
for pin in pins:
    gpio.setup(pin, gpio.OUT)
    
p = gpio.PWM ( 7 , 1)
p.start(0.0)			#<--- steht hier nur zu Testzwecken

class MyClass (object) :
    
    def __init__(self, dc=50.0, fq=0.0 ):
    #def __init__(self, dc, fq ):   
        self.fq=fq
        self.dc=dc
        
    def show_values (self, dc, fq ):
        print (dc.get(), fq.get())
    
    def frequenz_modulation(self, fq):
        p.ChangeFrequency(float(fq))

    def pulsdicke (self, dc):
        p.ChangeDutyCycle(float(dc))
        
    def interrupt (self, channel):
        global counter
        counter = counter + 1
        print "Anzahl Ticks " + str(counter)
        self.ausgabefeld.config(text=str(counter))
    
    def start (self, fq): 
        p.start(float(fq)) #<-- damit sollte es eigentlich starten
        return p

    def stop (self): 
         p.stop (  )
         return p 

    def exit (self) : 
        gpio.cleanup()  
        master.destroy()
    
    def pin8an (self) : 
        gpio.output(8, gpio.HIGH)
    
    def pin8aus (self) : 
        gpio.output(8, gpio.LOW)


mein_objekt = MyClass(object)   # Objekt wird erzeugt 
  
master = Tk()
master.title ('StepperSteuerung')
master.geometry ('370x270') 

# dc muss <= 100 sein !
dc = Scale(master, from_=0, to=100, tickinterval=50, label='Pulsdicke (%)', orient=HORIZONTAL,command=mein_objekt.pulsdicke)
dc.set(10.0) 
dc.pack() 

# fq muss > 0 sein !
fq = Scale(master, from_=1, to=401,tickinterval=200, label='Frequenz (Hz)', orient=HORIZONTAL,command=mein_objekt.frequenz_modulation)
fq.set(5.0)
fq.pack()
        
start_button = Button(master, text='Start', command=mein_objekt.start(5.0))
start_button.pack (side=LEFT, padx = 5, pady = 5)

stop_button = Button(master, text='Stop', command=mein_objekt.stop)
stop_button.pack (side=LEFT, padx = 5, pady = 5)

schalte_buttonan = Button(master, text='rechts', command=mein_objekt.pin8an) 
schalte_buttonan.pack(side=LEFT, padx = 5, pady = 5)

schalte_buttonaus = Button(master, text='links', command=mein_objekt.pin8aus) 
schalte_buttonaus.pack(side=LEFT, padx = 5, pady = 5)

quit_button = Button(master, text='Quit', command=mein_objekt.exit)
quit_button.pack (side=RIGHT, padx = 5, pady = 5)

master.mainloop()
EyDu
User
Beiträge: 4881
Registriert: Donnerstag 20. Juli 2006, 23:06
Wohnort: Berlin

Hallo und willkommen im Forum!

Mal ein paar Tipps zu Selbsthilfe, dann kommst du bestimmt selber auf das Problem. Überlege dir mal, wo der Unterschied bei den command-Argumenten liegt. Was genau wird da an command gebunden?

Code: Alles auswählen

Button(master, text='Start', command=mein_objekt.start(5.0))
und

Code: Alles auswählen

Button(master, text='Stop', command=mein_objekt.stop)
Und noch ein kleiner Hinweis. Was erwartest du für eine Ausgabe?

Code: Alles auswählen

def spam(eggs):
    print eggs

print spam(42)
print spam
Und noch ein letzter Tipp: In Python sind auch Funktionen Objekte.

Lösung: Schau dir lambda-Ausdrücke oder im Modul functools die partial-Methode an.
Das Leben ist wie ein Tennisball.
casavio
User
Beiträge: 3
Registriert: Dienstag 3. Februar 2015, 19:07

Hallo EyDu,

vielen Dank für die schnelle Antwort.

Auf den ersten Blick dachte ich, klar ruf die Methode des Objektes? p.start (5,0) direkt mit dem command des Buttons auf, aber das wars nicht. Werde mich morgen noch mal näher damit beschäftigen,

Gruß casavio
casavio
User
Beiträge: 3
Registriert: Dienstag 3. Februar 2015, 19:07

Liebe Forengemeinde,

dank den Hinweisen von EyDu habe ich mich mal näher mit den Geheimnissen von "LAMBDA" (Argumente zurückgeben) beschäftigt und siehe da, so klappts.

Code: Alles auswählen

Button(master, text='Start', command=lambda: mein_objekt.start(fq.get()))
Jetzt hätte ich noch ne Frage zu PWM: Gibt es dafür eine Methode, die die Anzahl der erzeugten Pulse zurückgibt ?
Oder muss ich die Ausgabe noch an einen anderen Pin legen und dort die ausgegebenen Pulse zähle.

Viele Grüße
casavio
Ene Uran
User
Beiträge: 125
Registriert: Sonntag 17. September 2006, 20:14
Wohnort: Hollywood

Zahl der Pulse = Frequenz (Pulse/Sekunde) * Zeit (Sekunden)
Atomkraftwerkaktienbesitzer
Antworten