一、關于U型光電傳感器
U型光電傳感器由于其有一個U型的凹槽而得名。其凹槽的一側會發射紅外光,凹槽的另一側裝有接收裝置。通過對紅外光的遮擋與導通,進而改變元件信号源引腳的電平高低。基于這種特性,我們很容易使用U型光電傳感器來測量是否有物體遮擋光線。在測速領域,運用廣泛。
本實驗使用的傳感器子產品如下圖所示:

可以看到,此元件有3個引腳,GND引腳為接地引腳,VCC引腳為電源引腳,OUT引腳是輸出引腳,當接收器能夠接收到從發射源發出的光線時,輸出引腳為低電平,當光線被阻斷時,輸出引腳為高電平。
二、計數器 OR 測速器
U型光電傳感器有着非常廣泛的應用,試想一下,如果一個工廠中的房間流水線在不停的生産商品,如何友善的對生産的商品數量進行自動計數?這時我們就可以将一個U型光電傳感器安裝到商品的傳送帶上,隻要有商品從傳送帶上通過,即會擋住傳感器發射源發出的紅外光,進而觸發電平的跳變,實作計數功能。除此之外,U型光電傳感器也可以友善的實作測速,我們隻要知道了物體的長度和物體通過U型傳感器的時間,就可以使用公式**v = s / t**進而計算出物體運動的速度。下面我們就來編寫代碼實作這兩個功能。
首先,元件與樹莓派連線如下:
U型光電傳感器 樹莓派
VCC 3.3V電源
GND GND
OUT GPIO17(BCM編碼)
編寫如下代碼:
#coding:utf-8
import RPi.GPIO as GPIO
import time
# 采用實體編碼
GPIO.setmode(GPIO.BOARD)
# BCM GPIO17的實體編碼是11
out_pin = 11
# 0 計數模式 1 測速模式
MODE = 0
count = 0
# 測速模式下,需要初始化長度S 機關為毫米
S = 10
t1 = 0
t2 = 0
# 進行引腳的初始化,不被遮擋時為低電平,使用低電平的下拉電阻
GPIO.setup(out_pin, GPIO.IN, pull_up_down=GPIO.PUD_DOWN)
# 定義回調函數
def switch_state(pin):
global count,t1,t2
# 如果是高電平
if GPIO.input(pin):
print("物體遮擋")
if MODE == 0:
count += 1
else:
t1 = time.time()
else:
print("物體遮擋消失")
print('計數器-數量:%d'%(count))
t2 = time.time()
t = t2 - t1
v = S / t
print('測速器-速度%fmm/s'%(v))
GPIO.add_event_detect(out_pin, GPIO.BOTH, callback=switch_state)
while True:
pass
如上代碼所示,我們可以設定MODE變量來讓元件工作在計數模式下或者測速模式下。在樹莓派上運作此代碼,嘗試下計數和測速的功能吧。