天天看點

一起玩轉樹莓派(16)——旋轉編碼傳感器一起玩轉樹莓派(16)——旋轉編碼傳感器

一起玩轉樹莓派(16)——旋轉編碼傳感器

    旋轉編碼傳感器是一種速度位移傳感器。其通過旋鈕的旋轉來帶動内部的光栅盤旋轉,光栅盤上會預置很多狹縫,光栅盤的轉動導緻經過狹縫的光線産生脈沖變化,此信号經過後繼電路的處理後,輸出成脈沖信号。最終,我們可以通過信号引腳的輸出來擷取旋鈕的旋轉動作。

    本次實驗,使用的旋轉編碼傳感器如下圖所示:

一起玩轉樹莓派(16)——旋轉編碼傳感器一起玩轉樹莓派(16)——旋轉編碼傳感器

通過内部發光源與光敏元件的配置,旋轉時産生脈沖信号,示意圖如下:

一起玩轉樹莓派(16)——旋轉編碼傳感器一起玩轉樹莓派(16)——旋轉編碼傳感器

我們使用的傳感器有5個引腳,其中除了電源和接地引腳外,還有3個信号引腳。SW引腳為複位信号引腳,此旋轉編碼傳感器本身也是一個按鈕,當按下此按鈕時,SW引腳會從高電平跳變為低電平。CLK引腳為旋轉信号引腳,未旋轉時,此引腳輸出高電平,旋轉時輸出低電平。DT引腳用來判定旋轉的方向,如果未旋轉時此引腳為高電平,旋轉時變低電平,則表示發生了順時針旋轉,如果未旋轉時此引腳為低電平,發生旋轉時此引腳為高電平,則表示發生了逆時針旋轉。

    下面,我們來連接配接樹莓派進行實驗,接線如下:

旋轉編碼傳感器 樹莓派
VCC +5V
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)——旋轉編碼傳感器一起玩轉樹莓派(16)——旋轉編碼傳感器
專注技術,懂的熱愛,願意分享,做個朋友
上一篇: 使用體驗

繼續閱讀