You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

树莓派编码器计数达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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.14 07:36:51