树莓派中旋转编码器的使用
@(树莓派学习笔记)
维基百科:https://en.wikipedia.org/wiki/Rotary_encoder#Incremental_encoder
RotaryEncoder
当经过一个0-2-3-1的循环便认为顺时针旋转了一步,
当经过一个0-1-3-2的循环便认为逆时针旋转了一步。
允许中间状态的摆动。
classgpiozero.RotaryEncoder(a, b, *, bounce_time=None, max_steps=16, threshold_steps=(0, 0), wrap=False, pin_factory=None)
Parameters:
a (int or str)
:连接到旋转编码器的“A”输出的 GPIO 引脚。
b (int or str)
:连接到旋转编码器的“B”输出的 GPIO 引脚。
bounce_time (float or None)
:如果None
(默认值),则不会执行任何软件退回补偿。否则,这是组件在初始更改后忽略状态更改的时间长度(以秒为单位)
max_steps (int)
: 编码器将value
从 0 更改为 1 或逆时针从 0 更改为 -1 所需的步数。如果此值为 0,则编码器的value
永远不会更改,但您仍然可以读取步骤来确定编码器顺时针或逆时针移动的整数步数。
threshold_steps (tuple of int)
:一个(min,max)步长元组,设备将被视为“活动”(包括该组)。换句话说,当步长大于或等于最小值,并且小于或等于最大值时,该属性将为 True,并且将触发相应的事件when_activated when_deactivated
.默认值为(0,0)
wrap (bool)
:如果 True 且 max_steps 为非零,则当步长达到正数或负数max_steps则通过否定进行换行。默认值为 False。
wait_for_rotate(timeout=None)
:暂停脚本,直到编码器在任一方向上至少旋转一步,或者达到超时。
wait_for_rotate_clockwise(timeout=None)
:暂停脚本,直到编码器顺时针旋转至少一步,或者达到超时。
wait_for_rotate_counter_clockwise(timeout=None)
:暂停脚本,直到编码器逆时针旋转至少一步,或者达到超时。
max_steps
:旋转编码器将value
从 0 顺时针移动到 1 或逆时针从 0 移动到 -1 所需的离散步数。从另一种意义上说,这也是此输入可以表示的离散状态的总数。
steps
:编码器的“步长”值从 0 开始。编码器顺时针旋转的每一步递增一,编码器逆时针旋转的每一步递减一。步长值受max_steps限制。它不会超过正数或负数max_steps,除非 wrap 为 True,在这种情况下,它将通过否定来滚动。如果max_steps为零,则步长不受任何限制,并且在任一方向上将无限增加,但值将返回常量零。
请注意,与大多数其他输入设备相比,由于旋转编码器没有绝对位置,因此步长属性(以及推论值)是可写的。
threshold_steps
:其中的最小和最大步数将返回 True。默认值为 (0, 0)。
value
:将旋转编码器的值表示为介于 -1 和 1 之间的值。该值的计算方法是将步长值划分为从负max_steps到正max_steps的范围。
请注意,与大多数其他输入设备相比,由于旋转编码器没有绝对位置,因此 value 属性是可写的。
when_rotated
:编码器沿任一方向旋转时要运行的函数。
这可以设置为不接受(必需)参数的函数,或接受单个强制参数(具有任意数量的可选参数)的Python函数。如果函数接受单个必需参数,则激活的设备将作为该参数传递。
将此属性设置为“无”(默认值)可禁用该事件
when_rotated_clockwise
:编码器顺时针旋转时要运行的函数。
这可以设置为不接受(必需)参数的函数,或接受单个强制参数(具有任意数量的可选参数)的Python函数。如果函数接受单个必需参数,则激活的设备将作为该参数传递。
将此属性设置为“无”(默认值)可禁用该事件。
when_rotated_counter_clockwise
:编码器逆时针旋转时要运行的函数。
这可以设置为不接受(必需)参数的函数,或接受单个强制参数(具有任意数量的可选参数)的Python函数。如果函数接受单个必需参数,则激活的设备将作为该参数传递。
将此属性设置为“无”(默认值)可禁用该事件。
wrap
:如果为 True,则当value
达到其限制(-1 或 1)时,它将“环绕”到相反的限制。当为 False 时,值(和相应的步长属性)根本不会超出其限制。
encoder
github上的一个类,与RotaryEncoder类的原理类似
链接:https://github.com/nstansby/rpi-rotary-encoder-python
采用RPi库编写。
注意:在实际使用中发现,使用这两个类时,旋转方向会出现不定期的判断错误,例如一直将电机朝顺时针方向转,value
大体上一直增加,但在增加的过程中会出现少量减少的过程。该现象无法避免,原因可能是树莓派边缘检测不及时或外部信号干扰,但好在对结果的影响不是很大。
如果结果及其不稳定,可考虑编码器是否出现故障。