почему мой обратный вызов прерывается с tkinter - PullRequest
0 голосов
/ 13 февраля 2020

Я подключаю ротационный энкодер к Raspberry Pi, используя метод прерывания, и хочу показать его значение на tkinter Label. Сначала я протестировал свою функцию обратного вызова прерывания с помощью main, где мой вращающийся кодировщик работает отлично, т.е. счетчик = 1000 за один оборот кодера, но когда я добавляю часть tkinter, он замедляется, то есть счетчик = 800 за один оборот кодера. Я думаю, что есть какая-то проблема с обработкой функции tkinter, но она не в состоянии отследить проблему. Здесь я предоставляю свои два разных кода с выводом.

from RPi import GPIO
from time import sleep
import math
import Adafruit_MCP4725
dac=Adafruit_MCP4725.MCP4725(address=0x61)
a=22
b=23
GPIO.setmode(GPIO.BCM)
GPIO.setup(a,GPIO.IN)
GPIO.setup(b,GPIO.IN)

clkLastState=GPIO.input(a)

def my_callback(channel):
   global clkLastState
   global counter
   clkState=GPIO.input(a)
   if clkState != clkLastState:
           dtState=GPIO.input(b)
           if dtState != clkState:
              counter +=1
           else:
              counter -=1
           text=str(counter/2)
           print (text[0:-2])
   clkLastState=clkState
  # sleep(0.001)
   #finally:
counter=0
clkLastState=GPIO.input(a)
def main():
 global counter
 try:
#  GPIO.add_event_detect(23,GPIO.BOTH,callback=my_callback)
  while (1):
     print(counter/2)
     dac.set_voltage(int(counter/2))
     vlt=int(counter/2)/4096*5.0
     print(vlt)
     sleep(1)
 except KeyboardInterrupt:
  print("end it")
  GPIO.cleanup() 
GPIO.add_event_detect(23,GPIO.BOTH,callback=my_callback)
#input("enter anything")
if __name__=='__main__':
 # input("do") 
  main()

Это код, в котором он работает в соответствии со спецификацией кодера.

955
955
956
956
957
957
958
958
959
959.0
1.170654296875

Здесь программа с tkinter.

from RPi import GPIO
from time import sleep
import tkinter as tk
a=22
b=23
GPIO.setmode(GPIO.BCM)
GPIO.setup(a,GPIO.IN)
GPIO.setup(b,GPIO.IN)
root=tk.Tk()
clkLastState=GPIO.input(a)

def my_callback(channel):
   global clkLastState
   global counter
   clkState=GPIO.input(a)
   if clkState != clkLastState:
           dtState=GPIO.input(b)
           if dtState != clkState:
              counter +=1
           else:
              counter -=1
           text=str(counter/2)
           print (text[0:-2])
           var.set(text)
   clkLastState=clkState
  # sleep(0.001)
counter=0
clkLastState=GPIO.input(a)
GPIO.add_event_detect(23,GPIO.BOTH,callback=my_callback)
print (counter)
var=tk.IntVar()
L1=tk.Label(root,bg="orange",fg="red",textvariable=var)
L1.pack()
# var.set(counter)
# root.after(500,main)
root.geometry("100x100")
root.mainloop()
#var=tk.IntVar()
#L1=tk.Label(root,bg="orange",fg="red",textvariable=var)
#L1.pack()  
#GPIO.add_event_detect(23,GPIO.BOTH,callback=my_callback)
input("enter anything")
GPIO.cleanup()

А вот его вывод.

759
760
761
762
763
763

Для получения более подробной информации, я приведу таблицу данных моего кодировщика <<a href="http://dien-congnghiep.com/upload/ls_mecapion/encoder_ls_mecapion_s40.pdf" rel="nofollow noreferrer">http://dien-congnghiep.com/upload/ls_mecapion/encoder_ls_mecapion_s40.pdf>

...