树莓派编码器计数达10后重置为0的技术实现求助
解决编码器计数循环重置的问题
我来帮你搞定这个编码器计数无法归零循环的问题~ 你当前的代码里,当编码器换算值达到10时,只给Arduino发送了0,但没有重置编码器的核心计数变量A_Pos,所以数值会一直递增下去,不会回到0重新开始。
修改后的完整代码
import RPi.GPIO as GPIO import time import serial ser = serial.Serial('/dev/ttyACM0', 9600) # ser.write(b'0') GPIO.setmode(GPIO.BCM) GPIO.setwarnings(True) pin_A = 17 pin_B = 18 Encoder_Count = 0 A_Pos2 = 0 GPIO.setup(pin_A, GPIO.IN) GPIO.setup(pin_B, GPIO.IN) A_Pos = 0 A_Last = "00" STATE = {"0001":1,"0010":-1,"0100":-1,"0111":1,"1000":1,"1011":-1, "1101":-1, "1110":1} def Encoder1(channel1): global Encoder_Count, A_Pos, A_Last, STATE now = str(GPIO.input(17)) + str(GPIO.input(18)) key = A_Last + now if key in STATE: direction = STATE[key] A_Last = now A_Pos += direction GPIO.add_event_detect(pin_A, GPIO.BOTH, callback=Encoder1) GPIO.add_event_detect(pin_B, GPIO.BOTH, callback=Encoder1) # A_Pos2=0 while(1): A_Pos2 = A_Pos / 1600 print(A_Pos2) # 修改点1:用>=10避免跳变错过触发 if A_Pos2 >= 10: ser.write(b'0') time.sleep(0.01) # 修改点2:重置核心计数变量,让数值从0重新开始 A_Pos = 0 # 加个小延时,降低循环频率减少资源占用 time.sleep(0.001) GPIO.cleanup()
关键修改说明
- 重置核心计数变量:在触发Arduino指令后,必须把
A_Pos设为0,这样后续计算的A_Pos2才会从0开始递增,实现循环计数的效果。 - 调整判断条件:把
>10改成>=10,防止因为编码器计数跳变(比如从9.99直接到10.01)导致错过触发重置的时机。 - 添加循环延时:在while循环末尾加了
time.sleep(0.001),避免循环占用过多CPU资源,同时不影响计数精度。
如果你需要更灵活的循环控制,还可以考虑用取模运算(比如A_Pos2 = (A_Pos / 1600) % 10),不过这种方式更适合仅展示循环值的场景;而你需要触发Arduino指令,所以主动重置A_Pos的方案更可靠。
内容的提问来源于stack exchange,提问作者Vaibhav Thacker
相关产品推荐
相关产品推荐

