一叽讳、介紹
?? 該傳感器實際上是一個光敏電阻,它隨著光強的變化而改變其電阻,它可以用來制作光控開關绷杜。
二、組件
★Raspberry Pi主板*1
★樹莓派電源*1
★40P軟排線*1
★PCF8591模數(shù)轉換器模塊*1
★光敏傳感器模塊*1
★面包板*1
★跳線若干
三濒募、實驗原理
??隨著光強度的增加鞭盟,光敏電阻的電阻將降低,因此輸出電壓降低瑰剃。由光敏電阻收集的模擬信號通過PCF8591轉換為數(shù)字信號齿诉。然后將這些數(shù)字信號傳輸?shù)綐漭刹⒋蛴≡谄聊簧稀?/p>
??光敏電阻傳感器有兩個LED指示燈。PWR-LED是電源指示燈晌姚。DO-LED是數(shù)字輸出指示燈粤剧,當光弱時熄滅,DO輸出高電平挥唠;當光強時燈亮抵恋,DO輸出低電平。而判定光強弱的臨界值可以通過旋轉中間藍色元件上的十字螺絲調節(jié)猛遍。
四馋记、實驗步驟
??第1步:連接電路号坡。
樹莓派 | T型轉接板 | PCF8591模塊 |
---|---|---|
SDA | SDA | SDA |
SCL | SCL | SCL |
5V | 5V | VCC |
GND | GND | GND |
聲音傳感器模塊 | T型轉接板 | PCF8591模塊 |
---|---|---|
AO | * | AIN0 |
DO | G17 | * |
VCC | 5V | VCC |
GND | GND | GND |
??第2步:PCF8591模塊采用的是I2C(IIC)總線進行通信的,但是在樹莓派的鏡像中默認是關閉的梯醒,在使用該傳感器的時候宽堆,我們必須首先允許IIC總線通信。
??第3步:開始編程茸习。這里先編寫一個PCF8591.py庫文件畜隶,后面再編寫一個python程序引入這個庫文件。
??PCF8591.py庫文件就是PCF8591模塊的程序号胚,單獨編寫是為了便于重用籽慢。在這個腳本中,我們使用了一個放大器用于模擬輸入和一個LED燈用于模擬輸出猫胁,模擬輸入不能超過3.3V箱亿!
??該程序也可以單獨運行,用于測試3個電阻模塊的功能弃秆。需用短路帽連接AIN0和INPUT0(電位計模塊)届惋,連接AIN1和INPUT1(光敏電阻模塊),以及連接AIN2和INPUT2(熱敏電阻模塊)菠赚。
??連接LED燈脑豹,AIN0(模擬輸入0)端口用于接收來自電位計模塊的模擬信號,AOUT(模擬輸出)用于將模擬信號輸出到雙色LED模塊衡查,以便改變LED的亮度瘩欺。
??PCF8591的詳細內(nèi)容請查看樹莓派基礎實驗12:PCF8591模數(shù)轉換器實驗。
#!/usr/bin/env python
#------------------------------------------------------
#
# 您可以使用下面語句將此腳本導入另一個腳本:
# “import PCF8591 as ADC”
#
# ADC.Setup(Address) # 查詢PCF8591的地址:“sudo i2cdetect -y 1”
# i2cdetect is a userspace program to scan an I2C bus for devices.
# It outputs a table with the list of detected devices on the specified bus.
# ADC.read(channal) # Channal范圍從0到3
# ADC.write(Value) # Value范圍從0到255
#
#------------------------------------------------------
#SMBus (System Management Bus,系統(tǒng)管理總線)
import smbus #在程序中導入“smbus”模塊
import time
# for RPI version 1, use "bus = smbus.SMBus(1)"
# 0 代表 /dev/i2c-0拌牲, 1 代表 /dev/i2c-1 ,具體看使用的樹莓派那個I2C來決定
bus = smbus.SMBus(1) #創(chuàng)建一個smbus實例
#在樹莓派上查詢PCF8591的地址:“sudo i2cdetect -y 1”
def setup(Addr):
global address
address = Addr
def read(chn): #channel
if chn == 0:
bus.write_byte(address,0x40) #發(fā)送一個控制字節(jié)到設備
if chn == 1:
bus.write_byte(address,0x41)
if chn == 2:
bus.write_byte(address,0x42)
if chn == 3:
bus.write_byte(address,0x43)
bus.read_byte(address) # 從設備讀取單個字節(jié)俱饿,而不指定設備寄存器。
return bus.read_byte(address) #返回某通道輸入的模擬值A/D轉換后的數(shù)字值
def write(val):
temp = val # 將字符串值移動到temp
temp = int(temp) # 將字符串改為整數(shù)類型
# print temp to see on terminal else comment out
bus.write_byte_data(address, 0x40, temp)
#寫入字節(jié)數(shù)據(jù)们拙,將數(shù)字值轉化成模擬值從AOUT輸出
if __name__ == "__main__":
setup(0x48)
#在樹莓派終端上使用命令“sudo i2cdetect -y 1”稍途,查詢出PCF8591的地址為0x48
while True:
print '電位計 AIN0 = ', read(0) #電位計模擬信號轉化的數(shù)字值
print '光敏電阻 AIN1 = ', read(1) #光敏電阻模擬信號轉化的數(shù)字
print '熱敏電阻 AIN2 = ', read(2) #熱敏電阻模擬信號轉化的數(shù)字值
tmp = read(0)
tmp = tmp*(255-125)/255+125
# 125以下LED不會亮,所以將“0-255”轉換為“125-255”砚婆,調節(jié)亮度時燈不會熄滅
write(tmp)
time.sleep(2)
??若想深入學習模/數(shù)轉換等模電知識械拍,強烈推薦以下書籍,國外大學最經(jīng)典模電教程装盯,比國內(nèi)教程生動有趣更易懂坷虑。掃碼購買或者點擊下面的鏈接。
《模擬電子基礎》點擊購買:https://u.dangdang.com/OIVk
??第4步:編寫控制程序埂奈。打印在屏幕上的有兩個數(shù)據(jù):GPIO.input(DO) 是數(shù)字輸出信號迄损,光強輸出低電平,光弱輸出高電平账磺,而光強弱判定的臨界值可以通過旋轉十字螺絲調整芹敌;ADC.read(0)是光敏傳感器的模擬信號輸出痊远,通過PCF8591A/D轉換后得到的0~255的值,光強值低氏捞,光弱值高碧聪。
#!/usr/bin/env python
import PCF8591 as ADC
import RPi.GPIO as GPIO
import time
DO = 17
GPIO.setmode(GPIO.BCM)
def setup():
ADC.setup(0x48)
GPIO.setup(DO, GPIO.IN)
def loop():
status = 1
while True:
print '#######################'
print 'Digital output: ',GPIO.input(DO) #光強輸出低電平,光弱輸出高電平
print 'Value: ', ADC.read(0) #光強值低液茎,光弱值高
print '#######################'
time.sleep(0.5)
if __name__ == '__main__':
try:
setup()
loop()
except KeyboardInterrupt:
pass
??