树莓派PICO-旋转编码器(MicroPython)

在这篇博客文章中,我们将探究如何把旋转编码器与树莓派 Pico 微控制器连接起来。旋转编码器是常用的输入设备,可用于测量和控制轴的位置与旋转。树莓派 Pico 凭借其通用输入输出(GPIO)引脚及相关功能,为将旋转编码器集成到你的项目中提供了一个出色的平台。在这个循序渐进的指南里,我们将详细讲解把旋转编码器连接到树莓派 Pico 的过程,并编写代码来读取和解读其输入信号。
旋转编码器与电位器

虽然电位器和旋转编码器看起来可能相似,但它们彼此之间却有很大差异。
旋转编码器和电位计之间的主要区别在于其用途。旋转编码器用于我们需要了解旋钮运动变化的情况,而电位计则用于需要测量旋钮确切位置的情况。
运动幅度也有很大差异。旋转编码器可以持续向任意方向转动,而电位器只能转动约 270 度 。
工作原理:
想象一下,你有一个可以向任意方向转动的旋钮。旋转编码器就像是一种精巧的装置,能够检测并测量该旋钮的移动和转动情况。它可以告诉你旋钮转动了多少,以及转动的方向。



旋转编码器通常由一个旋转轴以及被称为 “A” 通道和 “B” 通道的两部分组成。当你转动旋钮时,这些通道(在连接到公共接地端时)会产生一系列电信号,编码器能够识别这些信号。编码器利用这些信号来追踪旋钮的位置和转动情况。
等于是利用这两个相位差进行比较就能获得转动信息
旋转编码器的优点在于,它能够精确反馈旋钮的转动量。无论你是缓慢还是快速转动旋钮,它都能检测到哪怕极其微小的转动。此外,当旋钮像中央的按钮一样被按下时,它也能检测到。

SW(开关引脚):该引脚与旋转编码器上集成的按钮开关相对应。当按下按钮时,此引脚通常输出一个逻辑低电平或接地信号,表明发生了按钮按下事件。
VCC(正电源):该引脚连接到电路的正电源电压,通常称为 Vcc。它为旋转编码器提供电源。
GND(接地):该引脚连接到电路的地或 0V 参考点,为旋转编码器提供公共接地连接 。
DT(数据)或通道 B:此引脚提供额外的信号,用于帮助确定旋转方向。通过分析来自此引脚和 CLK(时钟)引脚的信号顺序和时序,可以确定旋转方向。
CLK(时钟)或通道 A:此引脚输出脉冲或信号来指示编码器的旋转情况。每个脉冲对应着顺时针或逆时针方向上特定的旋转量。

将旋转编码器的 VCC 引脚连接到树莓派 Pico 的 3.3V 引脚。
将旋转编码器的 GND 引脚连接到树莓派 Pico 上任意一个 GND 引脚。
将旋转编码器的 DATA 引脚连接到树莓派 Pico 的一个数字输入引脚(例如,引脚 25)。
将旋转编码器的 CLK 引脚连接到树莓派 Pico 的另一个数字输入引脚(例如,引脚 24)。
如果你的旋转编码器有内置开关,你可以将 SW 引脚连接到树莓派 Pico 的一个数字输入引脚(例如,引脚 26)。
以下是一个使用 Python 为树莓派 Pico 和旋转编码器进行连接的示例代码:
import time from rotary_irq_rp2 import RotaryIRQ from machine import Pin SW=Pin(20,Pin.IN,Pin.PULL_UP) r = RotaryIRQ(pin_num_clk=18, pin_num_dt=19, min_val=0, reverse=False, range_mode=RotaryIRQ.RANGE_UNBOUNDED) val_old = r.value() while True: try: val_new = r.value() if SW.value()==0: print("Button Pressed") print("Selected Number is : ",val_new) while SW.value()==0: continue if val_old != val_new: val_old = val_new print('result =', val_new) time.sleep_ms(50) except KeyboardInterrupt: break
设置为具有上拉电阻的输入对象
SW = Pin(20, Pin.IN, Pin.PULL_UP)
此行创建一个名为 r 的 RotaryIRQ 对象。它设置旋转编码器的引脚和参数,类似于前面的代码。
r = RotaryIRQ(pin_num_clk=18,
pin_num_dt=19,
min_val=0,
reverse=False,
range_mode=RotaryIRQ.RANGE_UNBOUNDED)
此行创建一个名为 r 的 RotaryIRQ 对象。它设置旋转编码器的引脚和参数,类似于前面的代码。
val_old = r.value()
此行使用旋转编码器位置的初始值初始化变量 val_old。
while True:
try:
val_new = r.value()
if SW.value() == 0:
print("Button Pressed")
print("Selected Number is:", val_new)
while SW.value() == 0:
continue
if val_old != val_new:
val_old = val_new
print('result =', val_new)
time.sleep_ms(50)
except KeyboardInterrupt:
break
这是程序的主循环。它使用 r.value() 连续读取旋转编码器的值并将其存储在 val_new 中。如果按下连接到引脚 20 (SW) 的按钮(其值为 0),它会打印“按钮按下”和旋转编码器的当前值 (val_new)。按住按钮时,它会继续打印值 (SW.value() == 0)。如果编码器的值发生变化(val_old 与 val_new 不同),它会更新 val_old 并打印新值。time.sleep_ms(50) 在循环的下一次迭代之前暂停程序 50 毫秒。如果检测到键盘中断 (Ctrl+C),程序将跳出循环并正常退出。
浙公网安备 33010602011771号