我一直在寻找使用Raspberry Pi在Python中用quadrature
读取一个2位机械旋转编码器,以实现简单的人机界面(想想音量控制或菜单导航)。
我正在使用Keyes KY-040
模块进行初始测试,但可能会切换到类似this的内容。
我找到了以下两个页面,并根据其中的指导推出了我自己的解决方案。
我在两个编码器通道的上升沿和下降沿都使用event detection并根据移动递增计数器,我理解这使得我在上面的链路上具有正交性能。
我对A通道触发器的回调如下所示:
def A_trig(enc_A):
time.sleep(.001)
A = GPIO.input(enc_A)
B = GPIO.input(enc_B)
global count
if A:
if not B:
count += 1
else:
count -= 1
else:
if B:
count += 1
else:
count -= 1
B通道有一个同样的回调,尽管它在另一个方向上递增。在去抖动方面,我在每个频道添加了100nF
个上限,并使用了2 ms
的柔和去抖时间。
这段代码对我来说似乎很合乎逻辑,如果事件检测顺利进行,应该能很好地处理正交编码器。
表现令人满意,但它并不像我想的那样顺畅 - 我经常会错过动作(基于缓和的感觉)。
我在Arduino上使用Paul Stoffregen's Encoder Library获得了相同数量的经验,用于几乎完全相同的应用程序。
我理解MCUs
和RPis
是非常不同的野兽,但我不禁认为如果没有太多的硬件扩展,这里有更好的性能。
问题是,在这种情况下,这是阅读人机编码器的最佳方法吗?
我所拥有的其他一些想法是使用中介MCU
来处理编码器,并根据请求将计数报告给RPi
,甚至查看正交计数器芯片。
还有py-gaugette库可以尝试,还有一些调试(硬和软)我当前的方法有待尝试,但我有兴趣从一些硬件/软件专家那里得到一些关于它们如何的输入在此期间这样做。