一起玩转树莓派(16)——旋转编码传感器

    旋转编码传感器是一种速度位移传感器。其通过旋钮的旋转来带动内部的光栅盘旋转,光栅盘上会预置很多狭缝,光栅盘的转动导致经过狭缝的光线产生脉冲变化,此信号经过后继电路的处理后,输出成脉冲信号。最终,我们可以通过信号引脚的输出来获取旋钮的旋转动作。

    本次实验,使用的旋转编码传感器如下图所示:

一起玩转树莓派(16)——旋转编码传感器

通过内部发光源与光敏元件的配置,旋转时产生脉冲信号,示意图如下:

一起玩转树莓派(16)——旋转编码传感器

我们使用的传感器有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))

运行代码,效果如下图所示:

一起玩转树莓派(16)——旋转编码传感器

专注技术,懂的热爱,愿意分享,做个朋友

QQ:316045346