Tkinker und Servo mit pca9685

Python auf Einplatinencomputer wie Raspberry Pi, Banana Pi / Python für Micro-Controller
Antworten
melmager
User
Beiträge: 8
Registriert: Donnerstag 23. Juli 2020, 14:50

ich sehe den Fehler nicht

ich arbeite mit adafruit-circuitpython-servokit

Code: Alles auswählen

import time
from adafruit_servokit import ServoKit

weichen = []
weiche_lo = 30
weiche_hi = 100


#callback chkbox weiche
def chkcb(nr,event=None):
    print(nr)
    turn = weichen[nr].get() > 0
    if turn:
        print("abzweig")
        kit.servo[nr].angel = weiche_lo
    else:
        print("grade")
        kit.servo[nr].angel = weiche_hi
        
kit = ServoKit(channels=16)

master = Tk()
master.title( "Easy Switch" )
master.geometry("640x480")
frametop = Frame(master)
frametop.pack()

wl = IntVar()
for lo in range(16):
    weichen.append(IntVar())
for sw in range(16):
    Checkbutton(frametop, text=str(sw), variable=weichen[sw], command=lambda nr=sw : chkcb(nr)).grid(row=0,column=sw)

gui wird aufgebaut , die callback funktion wird aufgrufen (darum die vielen print anweisungen)
nur servo dreht sich nicht

wenn ich python3 in konsole aufrufe kann ich den servo drehen

Code: Alles auswählen

from adafruit_servokit import ServoKit
kit = ServoKit(channels=16)
kit.servo[0].angel = 100
geht

ich verstehe es nicht
__deets__
User
Beiträge: 14493
Registriert: Mittwoch 14. Oktober 2015, 14:29

Bist du sicher es heißt Engel und nicht Winkel? Denn ersteres hat mit Servos nix zu tun, steht aber im GUI-Code.
melmager
User
Beiträge: 8
Registriert: Donnerstag 23. Juli 2020, 14:50

man ich brauche ne brille - ich habe es nicht gesehen - stundenlang - peinlich :geek:

Code: Alles auswählen

kit.servo[0].angle = 180
Weckstaben verbuschtelt :-)
Benutzeravatar
__blackjack__
User
Beiträge: 13004
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@melmager: `time` wird importiert, aber nirgends verwendet. Dafür werden Sachen aus dem `tkinter`-Modul verwendet ohne importiert zu werden.

Auf Modulebene sollte nur Code stehen der Konstanten, Funktionen, und Klassen definiert. Das Hauptprogramm steht üblicherweise in einer Funktion die `main()` heisst.

Funktionen bekommen alles was sie ausser Konstanten benötigen als Argument(e) übergeben. `chkcb()` braucht also noch `weichen` und `kit` als Argumente.

Namen sollten noch weit von der Stelle definiert werden an der sie verwendet werden. `weichen` wird am Anfang als leere Liste definiert, aber erst viel später mit Werten befüllt.

Die ”magische” 16 die da mehrfach im Code steht sollte besser eine Konstante sein.

`wl` wird definiert, aber nirgends verwendet. Namen sollten keine kryptischen Abkürzungen enthalten, oder gar nur daraus bestehen. `lo`? `sw`? `chkcb()`!?

Man braucht da auch nicht nacheinander zwei Schleifen die bis 16 zählen wenn man das auch in *einer* erledigen kann. `weichen` braucht man eigentlich auch nicht, denn man kann das `IntVar`-Objekt selbst an die Rückruffunktion übergeben. Beziehungsweise ein `BooleanVar`-Objekt, denn es sind ja gar keine Zahlen, sondern Wahrheitswerte die hier gespeichert werden.

Ungetestet:

Code: Alles auswählen

#!/usr/bin/env python3
import tkinter as tk
from functools import partial

from adafruit_servokit import ServoKit

SERVO_COUNT = 16

WEICHENWINKEL_ABZWEIG = 30
WEICHENWINKEL_GERADE = 100


def schalte_weiche(weichen_var, kit, servo_index, _event=None):
    kit.servo[servo_index].angle = (
        WEICHENWINKEL_ABZWEIG if weichen_var.get() else WEICHENWINKEL_GERADE
    )


def main():
    kit = ServoKit(channels=SERVO_COUNT)

    root = tk.Tk()
    root.title("Easy Switch")

    for servo_index in range(SERVO_COUNT):
        weichen_var = tk.BooleanVar()
        tk.Checkbutton(
            root,
            text=servo_index,
            variable=weichen_var,
            command=partial(schalte_weiche, weichen_var, kit, servo_index),
        ).grid(row=0, column=servo_index)
    
    root.mainloop()


if __name__ == "__main__":
    main()
“Most people find the concept of programming obvious, but the doing impossible.” — Alan J. Perlis
Benutzeravatar
Dennis89
User
Beiträge: 1123
Registriert: Freitag 11. Dezember 2020, 15:13

Hallo,
__blackjack__ hat geschrieben: Dienstag 16. Februar 2021, 18:13 Namen sollten noch weit von der Stelle definiert werden an der sie verwendet werden.
Wo wir doch gestern oder vorgestern(?) erst bei Tippfehler waren :P

Oder verstehe ich den Satz nur nicht und es ist gar kein Tippfehler?


Grüße
Dennis
"When I got the music, I got a place to go" [Rancid, 1993]
Benutzeravatar
__blackjack__
User
Beiträge: 13004
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

Ich wollte nur schauen ob der Text auch aufmerksam gelesen wird. 😜

Sollte natürlich „nicht“ anstelle von „noch“ heissen. 🙂
“Most people find the concept of programming obvious, but the doing impossible.” — Alan J. Perlis
Antworten