Я подключаю ротационный энкодер к 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>