樹莓派基礎(chǔ)實(shí)驗15:電位器傳感器實(shí)驗

一、介紹

?? 電位器(Potentiometer)是具有三個引出端、阻值可按某種變化規(guī)律調(diào)節(jié)的電阻元件。電位器通常由電阻體和可移動的電刷組成。當(dāng)電刷沿電阻體移動時,在輸出端即獲得與位移量成一定關(guān)系的電阻值或電壓。

??電位器既可作三端元件使用也可作二端元件使用。后者可視作一可變電阻器,由于它在電路中的作用是獲得與輸入電壓(外加電壓)成一定關(guān)系的輸出電壓,因此稱之為電位器。


二、組件

★Raspberry Pi主板*1

★樹莓派電源*1

★40P軟排線*1

★PCF8591模數(shù)轉(zhuǎn)換器模塊*1

★電位器傳感器模塊*1

★雙色LED燈模塊*1

★雙色LED模塊*1

★面包板*1

★跳線若干

三、實(shí)驗原理

電位器傳感器
電位器模塊原理圖

??在本實(shí)驗中,PCF8591用于讀取電位計的模擬值,并將值的大小轉(zhuǎn)化成相應(yīng)大小的模擬電壓值,輸出到LED,來控制LED的亮度,就好像用旋鈕控制臺燈亮度一樣。
??將電位器的引腳SIG(OUT)連接到PCF8591的引腳AIN0。將雙色LED的引腳R或引腳G連接到PCF8591的引腳AOUT。旋轉(zhuǎn)電位器旋鈕,觀察LED的亮度變化。

四、實(shí)驗步驟

??第1步:連接電路。

樹莓派 T型轉(zhuǎn)接板 PCF8591模塊
SDA SDA SDA
SCL SCL SCL
5V 5V VCC
GND GND GND
電位器模塊 T型轉(zhuǎn)接板 PCF8591模塊
SIG(OUT) * AIN0
VCC 5V VCC
GND GND GND
雙色LED模塊 T型轉(zhuǎn)接板 PCF8591模塊
R * AOUT
G * *
GND GND GND
電位器傳感器實(shí)驗電路圖
電位器傳感器實(shí)驗實(shí)物接線圖

??第2步:PCF8591模塊采用的是I2C(IIC)總線進(jìn)行通信的,但是在樹莓派的鏡像中默認(rèn)是關(guān)閉的,在使用該傳感器的時候,我們必須首先允許IIC總線通信。

打開I2C總線通信

??第3步:開始編程。這里先編寫一個PCF8591.py庫文件,后面再編寫一個python程序引入這個庫文件。
??PCF8591.py庫文件就是PCF8591模塊的程序,單獨(dú)編寫是為了便于重用。在這個腳本中,我們使用了一個放大器用于模擬輸入和一個LED燈用于模擬輸出,模擬輸入不能超過3.3V!
??該程序也可以單獨(dú)運(yùn)行,用于測試3個電阻模塊的功能。需用短路帽連接AIN0和INPUT0(電位計模塊),連接AIN1和INPUT1(光敏電阻模塊),以及連接AIN2和INPUT2(熱敏電阻模塊)。
??連接LED燈,AIN0(模擬輸入0)端口用于接收來自電位計模塊的模擬信號,AOUT(模擬輸出)用于將模擬信號輸出到雙色LED模塊,以便改變LED的亮度。
??PCF8591的詳細(xì)內(nèi)容請查看樹莓派基礎(chǔ)實(shí)驗12:PCF8591模數(shù)轉(zhuǎn)換器實(shí)驗

#!/usr/bin/env python
#------------------------------------------------------
#
#       您可以使用下面語句將此腳本導(dǎo)入另一個腳本:
#           “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   #在程序中導(dǎo)入“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實(shí)例

#在樹莓派上查詢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é)到設(shè)備
    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)         # 從設(shè)備讀取單個字節(jié),而不指定設(shè)備寄存器。
    return bus.read_byte(address)  #返回某通道輸入的模擬值A(chǔ)/D轉(zhuǎn)換后的數(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ù)字值轉(zhuǎn)化成模擬值從AOUT輸出

if __name__ == "__main__":
    setup(0x48) 
 #在樹莓派終端上使用命令“sudo i2cdetect -y 1”,查詢出PCF8591的地址為0x48
    while True:
        print '電位計   AIN0 = ', read(0)   #電位計模擬信號轉(zhuǎn)化的數(shù)字值
        print '光敏電阻 AIN1 = ', read(1)   #光敏電阻模擬信號轉(zhuǎn)化的數(shù)字
        print '熱敏電阻 AIN2 = ', read(2)   #熱敏電阻模擬信號轉(zhuǎn)化的數(shù)字值
        tmp = read(0)
        tmp = tmp*(255-125)/255+125 
# 125以下LED不會亮,所以將“0-255”轉(zhuǎn)換為“125-255”,調(diào)節(jié)亮度時燈不會熄滅
        write(tmp)
        time.sleep(2)

??若想深入學(xué)習(xí)模/數(shù)轉(zhuǎn)換等模電知識,強(qiáng)烈推薦以下書籍,國外大學(xué)最經(jīng)典模電教程,比國內(nèi)教程生動有趣更易懂。掃碼購買或者點(diǎn)擊下面的鏈接。

模擬電子基礎(chǔ)

《模擬電子基礎(chǔ)》點(diǎn)擊購買:https://u.dangdang.com/OIVk

??第4步:編寫電位器控制程序。轉(zhuǎn)動電位器的軸,你可以看到屏幕上打印的值從0(最?。┳?yōu)?55(最大)。LED燈逐漸變得更亮。

#!/usr/bin/env python
import PCF8591 as ADC
import time

def setup():
    ADC.setup(0x48)

def loop():
    status = 1
    while True:
        print 'Value:', ADC.read(0)  
 #讀取AIN0通道上模擬信號轉(zhuǎn)化成數(shù)字信號的值,范圍是0~255
        Value = ADC.read(0)  #值越大,LED燈越亮
        outvalue = map(Value,0,255,120,255)
        ADC.write(outvalue)
#為AOUT模擬輸出,寫入數(shù)字信號值(范圍0~255),會轉(zhuǎn)化為相應(yīng)的模擬電壓輸出
#但是當(dāng)outvalue的值在120以下時,LED燈就基本熄滅了,所以需要map()函數(shù)轉(zhuǎn)換一下
        time.sleep(0.2)
def destory():
    ADC.write(0)
    
def map(x,in_min,in_max,out_min,out_max):
#將范圍是0~255的輸入值轉(zhuǎn)化成范圍120~255的輸出值
#這樣轉(zhuǎn)化方式也能提高控制LED亮度的精度
    return (x-in_min) * (out_max-out_min) / (in_max - in_min) +out_min
    
if __name__ == '__main__':
    try:
        setup()
        loop()
    except KeyboardInterrupt: 
        destory()

??

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容