天天看點

一起玩轉樹莓派(12)——U型光電傳感器

一、關于U型光電傳感器

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

   本實驗使用的傳感器子產品如下圖所示:

一起玩轉樹莓派(12)——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變量來讓元件工作在計數模式下或者測速模式下。在樹莓派上運作此代碼,嘗試下計數和測速的功能吧。

一起玩轉樹莓派(12)——U型光電傳感器

繼續閱讀