旋转编码传感器是一种速度位移传感器。其通过旋钮的旋转来带动内部的光栅盘旋转,光栅盘上会预置很多狭缝,光栅盘的转动导致经过狭缝的光线产生脉冲变化,此信号经过后继电路的处理后,输出成脉冲信号。最终,我们可以通过信号引脚的输出来获取旋钮的旋转动作。
本次实验,使用的旋转编码传感器如下图所示:
通过内部发光源与光敏元件的配置,旋转时产生脉冲信号,示意图如下:
我们使用的传感器有5个引脚,其中除了电源和接地引脚外,还有3个信号引脚。SW引脚为复位信号引脚,此旋转编码传感器本身也是一个按钮,当按下此按钮时,SW引脚会从高电平跳变为低电平。CLK引脚为旋转信号引脚,未旋转时,此引脚输出高电平,旋转时输出低电平。DT引脚用来判定旋转的方向,如果未旋转时此引脚为高电平,旋转时变低电平,则表示发生了顺时针旋转,如果未旋转时此引脚为低电平,发生旋转时此引脚为高电平,则表示发生了逆时针旋转。
下面,我们来连接树莓派进行实验,接线如下:
旋转编码传感器 树莓派
VCC +5V
GND GND
CLK GPIO17 (BCM编码)
DT GPIO18 (BCM编码)
SW GPIO19 (BCM编码)
编写实验代码如下:
#coding:utf-8
import RPi.GPIO as GPIO
import time
# 定义引脚
resetPin = 35 # BCM编码为19的GPIO 物理编码为35
clkPin = 11
dtPin = 12
# 计数变量
clockwise = 0
anticlockwise = 0
# 进行引脚初始化
GPIO.setmode(GPIO.BOARD)
GPIO.setup(clkPin, GPIO.IN)
GPIO.setup(dtPin, GPIO.IN)
GPIO.setup(resetPin, GPIO.IN, pull_up_down=GPIO.PUD_UP)
# 注册中断函数
def reset(channel):
global clockwise, anticlockwise
clockwise = 0
anticlockwise = 0
print('计数复位')
# 监听下降沿
GPIO.add_event_detect(resetPin, GPIO.FALLING, callback=reset)
# 开启主循环
while True:
lastDT = GPIO.input(dtPin)
# 高电平 没有发生旋转动作
while GPIO.input(clkPin):
pass
# 开始旋转
currentDT = GPIO.input(dtPin)
if (lastDT == 1) and (currentDT == 0):
# 顺时针
clockwise += 1
print('顺时针旋转计数:%d'%(clockwise))
if (lastDT == 0) and (currentDT == 1):
# 逆时针
anticlockwise += 1
print('逆时针旋转计数:%d'%(anticlockwise))
运行代码,效果如下图所示: