树莓派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),程序将跳出循环并正常退出。

 

posted @ 2025-01-20 10:42  mcwhirr  阅读(218)  评论(0)    收藏  举报