ftduino am TXT - Python Frage zum IO Update bzw. Timer

Community-Firmware (cfw), Selbstbaucontroller (TX-Pi, ftduino, usw.), usw.
Forumsregeln
Bitte beachte die Forumsregeln!
Antworten
Uwe
Beiträge: 11
Registriert: 11 Mai 2019, 17:22

ftduino am TXT - Python Frage zum IO Update bzw. Timer

Beitrag von Uwe » 02 Apr 2021, 22:37

Hallo liebe ft-Freunde,

wie im anderen Thread zum TX-Pi schon geschrieben, versuche ich mich gerade in Python einzuarbeiten und habe mein Setup etwas umgestellt.
Ich habe ein WallE mit TXT und ftduino hier stehen und versuche ihm über ftrobopy und ftduino_direct mit Python leben einzuhauchen.

Nach einigen Abenden klappt es mittlerweile Inputs und Outputs von beiden Controllern auszulesen bzw. anzusteuern. An ein paar Punkten beiße ich mir aber gerade die Zähne aus.

1. ftrobopy - update_interval Option - Verständnisfrage
Mir ist nicht ganz klar wie diese Option wirkt und genutzt werden kann. In den meisten Beispielen wird die Option gar nicht separat aufgerufen.
Ich vermute, das es einen Standardwert gibt, und das in dem Intervall I/Os gefeuert werden (also Geräteebene). Für die "kontinuierliche" Auswertung in Python auf Softwarebene benötige ich noch eine Schleife oder eine Timer-Funktion, wie sie in den Beispielen im ftc Tutorial verwendet wird. Passt die Interpretation oder laufen hier jetzt zwei Timer parallel?

Code: Alles auswählen

self.txt = ftrobopy.ftrobopy("localhost", 65000, update_interval=0.01) #TXT über ftrobopy Bibliothek verbinden
...
self.timer = QTimer(self)                        # create a timer
self.timer.timeout.connect(self.on_timer)        # connect timer to on_timer slot
self.timer.start(100);                           # fire timer every 100ms (10 hz)
2. Encodermotoren am ftduino
Diese hängen am ftduino und sie laufen die nötigen Schritte wenn ich danach eine ausreichende sleep-Pause setze. Ich suche nach einer Codevorlage, die im engen Takt den Status de Motors abfragt, um möglichst nahtlos die nächsten Befehle auszuführen. Am TXT könnte man die Funktion motorX.finished() nutzen. Meine Versuche führen aber nicht zum Ziel. Der erste Schritt wird vorzeitig abgebrochen:

Code: Alles auswählen

    def on_button5_clicked(self):
        myftd.comm("motor_counter M2 left 512 200")       #kurze Vorwärtsfahrt
        myftd.comm("motor_counter M3 right 512 200")     
        time.sleep(0.2)                                   #Wartezeit um counter_state auslesen zu können

        while myftd.comm('counter_get_state C2') == 1:    #warte bis Vorwärtsfahrt beendet
            #self.txt.updateWait()
            time.sleep(0.01)
            
        myftd.comm("motor_counter M2 left 512 230")        #viertel Drehung
        myftd.comm("motor_counter M3 left 512 230") 
Habt Ihr einen Tipp was ich falsch mache.

Danke und LG
Uwe

Uwe
Beiträge: 11
Registriert: 11 Mai 2019, 17:22

Re: ftduino am TXT - Python Frage zum IO Update bzw. Timer

Beitrag von Uwe » 04 Apr 2021, 14:03

Punkt 2 (Encodermotoren am ftduino) ist erledigt. Das hat mich nicht losgelassen.

Mit counter_get_state war ich vermutlich auf dem Holzweg. Wenn ich das richtig interpretiere werden hier die Counterflanken (0 oder 1) vom Encoder zurückgegeben. Damit musste meine alte Funktion recht flott aussteigen.

Der Befehl motor_counter_active() wäre wohl der Richtige, den habe ich aber in ftduino_direct nicht gefunden.

Beholfen habe ich mir mit der Beobachtung, das Counter_get bei laufendem Motor_Counter über 65000 springt und am Ende zurückgesetzt wird:

Code: Alles auswählen

    def on_button5_clicked(self):
        myftd.comm("motor_counter M2 left 512 200")       #kurze Vorwärtsfahr
        myftd.comm("motor_counter M3 right 512 200")     
        while int(myftd.comm("counter_get C3")) >= 65000: #warte bis Encodercounter beendet
            time.sleep(0.01)
            
        myftd.comm("motor_counter M2 left 512 230")       #viertel Drehung von WallE
        myftd.comm("motor_counter M3 left 512 230")
        while int(myftd.comm("counter_get C3")) >= 65000: #warte bis Encodercounter beendet
            time.sleep(0.01)  
Vermutlich geht das noch eleganter, aber ich bin glücklich das es funktioniert :idea: :)

LG Uwe

Antworten