天天看點

一起玩轉樹莓派(8)——樹莓派模數/數模轉換實踐(三)

在上一篇部落格中,我們介紹了在樹莓派中使用模數轉換晶片的基本方法,如果你對上一篇博文中介紹的内容已經有了深入的了解,那後面的應用試驗對你來說将非常容易。如果不是,那麼我建議你先将之前介紹的内容在研究一下: https://my.oschina.net/u/2340880/blog/5142788 現在,如果你決定繼續本篇部落格的學習,那麼我認為你已經了解了PCF8591晶片的基本用法,明白了PCF8591的接線方式,I2C總線的基本工作原理以及PCF8591的設定指令的意義和讀資料的方法。

一、讀取外部傳感器的模拟信号

在本系列部落格的上一篇文章中,我們通過讀取PCF8591實驗子產品自帶的可調節電壓輸出、光敏傳感器和熱敏傳感器實作了對目前環境資訊的的讀取,除了可以讀取目前設定的輸出電壓外,我們還可以獲得目前的環境的溫度和亮度。PCF8591實驗子產品自帶的傳感器可以讓我們很友善的進行實驗,其實在實際應用中,更多時候我們需要從AIN0到AIN3引腳來擷取外接傳感器的模拟信号。現在,我們嘗試下通過AIN0和AIN1兩個輸入引腳來擷取外接光敏和熱敏傳感器的資料。

1.關于實驗所使用的傳感器

我們這裡的小實驗将使用光敏和熱敏傳感器。

光敏子產品

光敏傳感器能夠感應光纖的明暗變化,其實作此功能的核心在于光敏電阻,隻做光敏電阻的常用材料有硫化镉、硫化鋁等。這些材料在特定波長的光波照射下,其阻值會産生明顯的變化。本次實驗,我們使用的光敏傳感器子產品如下圖所示:

一起玩轉樹莓派(8)——樹莓派模數/數模轉換實踐(三)

可以看到,此子產品的核心是一個光敏電阻,提供了可調節靈敏度的功能單元和兩個LED訓示燈,其中一個LED是電源訓示燈,接通電源後會亮,另一個LED燈是電平訓示燈,當光亮達到門檻值時,輸出引腳輸出低電平,此LED燈亮,當光亮度較暗時,輸出引腳輸出高電平,此LED燈不亮。我們再看此子產品的4個引腳:

VCC:電源引腳

GND:接地引腳

DO:數字信号輸出引腳(高低電平)

AO:模拟信号輸出引腳

熱敏子產品

本次實驗我們使用的熱敏子產品的功能與上面将的光敏子產品類似,如下圖所示:

一起玩轉樹莓派(8)——樹莓派模數/數模轉換實踐(三)

此熱敏子產品同樣包含兩個LED訓示燈、靈敏度調節單元和4個引腳,引腳如下:

2.實驗連線

本次實驗,我們使用PCF8591讀取光敏和熱敏傳感器的模拟信号,将其轉換成數字信号被樹莓派程式處理,同時,我們使用樹莓派的GPIO端口來讀取傳感器本身輸出的數字信号,首先,我們先确定要使用的PCF8591的輸入引腳和要使用的樹莓派GPIO引腳。

PCF8591輸入引腳使用:AINO和AIN1,其中AINO讀取光敏模拟信号,AIN1讀取熱敏模拟信号。

GPIO輸入引腳使用:GPIO17和GPIO18(BCM編碼方式),其中17引腳讀取光敏數字信号,18引腳讀取熱敏數字信号。

PCF8591連線:

PCF8591 樹莓派功能引腳

SCL SCL

SDA SDA

GND GND

VCC 5V

光敏傳感器:

光敏傳感器 樹莓派/PCF8591

VCC 樹莓派3.3V

GND 樹莓派GND

DO 樹莓派GPIO11(實體引腳)

AO PCF8591 AIN0

熱敏傳感器:

熱敏傳感器 樹莓派/PCF8591

--- ---

DO 樹莓派GPIO12(實體引腳)

AO PCF8591 AIN1

連線最終如下圖所示:

一起玩轉樹莓派(8)——樹莓派模數/數模轉換實踐(三)

和之前相比,我們這次直接在樹莓派上連接配接了3個元件,連線也複雜了很多,隻要按照上面的表格,注意引腳的正确即可。

3.編寫程式

步入正題,先上代碼:

#coding:utf-8

#SMBus (System Management Bus,系統管理總線)

import smbus   #在程式中導入“smbus”子產品

import RPi.GPIO as GPIO

import time

bus = smbus.SMBus(1)         #建立一個smbus執行個體

# 通過PCF8591讀取模拟信号

# 資料亮度的模拟資料

def readLight():

   #發送一個控制位元組到裝置 表示要讀取AIN0通道的資料

   bus.write_byte(0x48,0x40)  

   bus.read_byte(0x48)         # 空讀一次,消費掉無效資料

   return bus.read_byte(0x48)  # 傳回某通道輸入的模拟值A/D轉換後的數字值

def readTemperature():

#發送一個控制位元組到裝置 表示要讀取AIN1通道的資料

   bus.write_byte(0x48,0x41)  

# 通過GPIO讀取數字信号

# 設定使用的引腳編碼模式

GPIO.setmode(GPIO.BOARD)

# 光敏子產品的數字輸出引腳 BCM 17

LP = 11

# 熱敏子產品的數字輸出引腳 BCM 18

TP = 12

# 引腳初始化

GPIO.setup(LP, GPIO.IN)

GPIO.setup(TP, GPIO.IN)

while True:

print('--------分割線----------')

print('亮度數字信号:', GPIO.input(LP))

print('亮度模拟信号:', readLight())

print('溫度數字信号:', GPIO.input(TP))

print('溫度模拟信号:', readTemperature())

time.sleep(2)

上面的代碼有着比較詳盡的注釋,這裡我們無需多說,在樹莓派上運作此代碼,即可觀察到控制台的資料輸出。

二、使用操縱杆外設控制圓球移動

如果你順利完成了上面的實驗,先别急着慶祝,你會發現,和本系列前面幾篇部落格的内容較比,到目前為止我們并沒有介紹新的知識,同時也沒有做什麼新穎的事情。的确如此,但是通過上面實驗的練習,可以幫助你更深入的了解數模/模數轉換的應用場景,并且讓你能夠更加靈活的對I2C總線與通用GPIO序列槽結合進行使用。下面我們要來做一些好玩的事情了,不知道你小時候是否有玩過“大把機”,這是一種搖杆遊戲機,搖杆可以朝上下左右4個方向轉動,也可以從中間按下。通常,上下左右用來控制遊戲人物的行動方向,按下用來進行人物跳躍。現在,我們要來做一個簡單的遊戲,為樹莓派連接配接操縱杆,控制遊戲程式頁面上圓球的行為,其中方向控制圓球的移動,按下操縱杆則使圓球變色。

此實驗所使用的操縱杆如下圖所示:

一起玩轉樹莓派(8)——樹莓派模數/數模轉換實踐(三)

可以看到,此元件有5個引腳:

+5V:5V電源引腳

VRX:橫向坐标模拟信号輸出引腳

VRY:縱向坐标模拟信号輸出引腳

SW:按鈕數字信号輸出引腳

操作杆内部實際上封裝了雙向的電阻器,其阻值會根據搖杆的方向變動産生變化,進而影響引腳信号的産生變化。

1.進行連線

我相信,現在連線對你來說應該是最簡單的工作了。操縱杆有模拟信号輸出同時也有數字信号輸出,我們依然需要結合PCF8591與樹莓派GPIO一起使用。關于PCF8591的接線上面有介紹,這裡不再重複。操作杆的接線方式如下:

操縱杆 樹莓派/PCF8591

+5V 樹莓派5.5V

VRX PCF8591 AIN0

VRY PCF8591 AIN1

SW 樹莓派GPIO 11(實體引腳)

繼續閱讀