Raspberry Pi是一款基于ARM架構(gòu)處理器的主板,專為電子工程師和業(yè)余愛好者設(shè)計(jì)。PI是目前最值得信賴的項(xiàng)目開發(fā)平臺(tái)之一。憑借更高的處理器速度和 1 GB RAM,PI 可用于許多備受矚目的項(xiàng)目,如圖像處理和物聯(lián)網(wǎng)。PI可以做很多很酷的事情,但一個(gè)可悲的功能是它沒有內(nèi)置的ADC模塊。
在這個(gè)項(xiàng)目中,我們將學(xué)習(xí)如何將柔性傳感器與樹莓派連接并在LCD屏幕上顯示其值。
所需材料:
樹莓派(任何型號(hào))
16*2液晶顯示屏
柔性傳感器
面包板或性能板。
ADC0804 單通道 8 位 ADC 模塊:
在繼續(xù)之前,讓我們了解一下這款A(yù)DC0804 IC,以及如何將其與樹莓派配合使用。ADC0804是一款單通道8位IC,這意味著它可以讀取單個(gè)ADC值并將其映射到8位數(shù)字?jǐn)?shù)據(jù)。這些 8 位數(shù)字?jǐn)?shù)據(jù)可以被樹莓派讀取,因此值將是 0-255,因?yàn)?2^8 是 256。如下面IC的引腳排列所示,引腳DB0至DB7用于讀取這些數(shù)字值。
現(xiàn)在,另一個(gè)重要的事情是,ADC0804工作在5V,因此它提供5V邏輯信號(hào)輸出。在8引腳輸出(代表8位)中,每個(gè)引腳提供+5V輸出以表示邏輯“1”。所以問題是PI邏輯是+3.3V,所以你不能給PI的+3.3VGPIO引腳提供+5V邏輯。如果為PI的任何GPIO引腳提供+5V,電路板就會(huì)損壞。
因此,為了從+5V降壓邏輯電平,我們將使用分壓器電路。我們之前已經(jīng)討論了分壓器電路,以進(jìn)一步澄清。我們要做的是,我們使用兩個(gè)電阻將+5V邏輯分頻為2*2.5V邏輯。因此,除法后,我們將為樹莓派提供+2.5v邏輯。因此,每當(dāng)ADC0804提供邏輯“1”時(shí),PI GPIO引腳上都會(huì)看到+2.5V,而不是+5V。在此處了解有關(guān)ADC的更多信息:ADC0804簡介。
以下是我們在Perf板上構(gòu)建的采用ADC0804的ADC模塊的圖片:
電路圖及說明:
柔性傳感器與樹莓派接口的完整電路圖如下所示。解釋如下。
這個(gè)樹莓派柔性傳感器電路可能看起來有點(diǎn)復(fù)雜,有很多電線,但如果你仔細(xì)觀察,大多數(shù)電線都直接從LCD和8位數(shù)據(jù)引腳連接到樹莓派。下表將幫助您建立和驗(yàn)證連接。
引腳名稱 | 覆盆子別針編號(hào) | 樹莓派 GPIO 名稱 |
液晶屏與液晶屏 | 引腳 4 | 地 |
液晶顯示器 Vdd | 引腳 6 | 伏直流 (+5V) |
液晶 V 形 | 引腳 4 | 地 |
液晶顯示器 Rs | 引腳 38 | GPIO 20 |
液晶顯示器 RW | 引腳 39 | 地 |
液晶顯示器 E | 引腳 40 | GPIO 21 |
液晶屏 D4 | 引腳 3 | GPIO 2 |
液晶屏 D5 | 引腳 5 | GPIO 3 |
液晶屏 D6 | 引腳 7 | GPIO 4 |
液晶屏 D7 | 引腳 11 | GPIO 17 |
ADC0804 虛擬交流系統(tǒng) | 引腳 2 | 伏直流 (+5V) |
ADC0804 B0 | 引腳 19(至 5.1K) | GPIO 10 |
ADC0804 B1 | 引腳 21(至 5.1K) | GPIO 9 |
ADC0804 B2 | 引腳 23(至 5.1K) | GPIO 11 |
ADC0804 B3 | 引腳 29(至 5.1K) | GPIO 5 |
ADC0804 B4 | 引腳 31(至 5.1K) | GPIO 6 |
ADC0804 B5 | 引腳 33(至 5.1K) | GPIO 13 |
ADC0804 B6 | 引腳 35(至 5.1K) | GPIO 19 |
ADC0804 B7 | 引腳 37(至 5.1K) | GPIO 26 |
ADC0804 WR/INTR | 引腳 15 | GPIO 22 |
您可以使用下圖來確定樹莓上的引腳編號(hào)。
與所有ADC模塊一樣,ADC0804 IC也需要時(shí)鐘信號(hào)才能工作,幸運(yùn)的是該IC具有內(nèi)部時(shí)鐘源,因此我們只需將RC電路添加到CLK輸入和CLK R引腳,如圖所示。我們使用了 10K 和 105pf 的值,但我們可以使用任何接近的值,例如 1uf、0.1uf、0.01uf 也應(yīng)該有效。
然后,為了連接Flex傳感器,我們使用了一個(gè)使用100K電阻的分壓器電路。當(dāng) Flex 傳感器彎曲時(shí),其兩端的電阻會(huì)發(fā)生變化,電阻兩端的電位降也會(huì)發(fā)生變化。該壓降由ADC0804 IC測量,并相應(yīng)地生成8位數(shù)據(jù)。
對(duì)樹莓派進(jìn)行編程:
完成連接后,我們應(yīng)該使用 Raspberry Pi 讀取這些 8 位的狀態(tài)并將它們轉(zhuǎn)換為十進(jìn)制,以便我們可以使用它們。本頁末尾給出了用于執(zhí)行相同操作并在LCD屏幕上顯示結(jié)果值的程序。此外,代碼在下面解釋為小垃圾。
我們需要一個(gè) LCD庫來將 LCD 與 Pi 連接。為此,我們使用 shubham 開發(fā)的庫,它將幫助我們在四線模式下將 16*2 LCD 顯示器與 Pi 連接。此外,我們還需要庫來利用時(shí)間和 Pi GPIO 引腳。
注意:lcd.py 應(yīng)從此處下載,并放置在保存此程序的同一目錄中。只有這樣,代碼才會(huì)編譯。
import lcd #Import the LCD library by shubham@electro-passion.com
import time #Import time
import RPi.GPIO as GPIO #GPIO will be reffered as GPIO only
LCD引腳定義分配給變量,如下所示。請注意,這些數(shù)字是 GPIO 引腳編號(hào),而不是實(shí)際引腳編號(hào)。可以使用上表將 GPIO 編號(hào)與引腳編號(hào)進(jìn)行比較。數(shù)組二進(jìn)制文件將包括所有數(shù)據(jù)引腳編號(hào),數(shù)組位將存儲(chǔ)所有 GPIO 引腳的結(jié)果值。
#LCD pin definitions
D4=2
D5=3
D6=4
D7=17
RS=20
EN=21
binarys = (10,9,11,5,6,13,19,26) #Array of pin numbers connect to DB0-DB7
bits = [0,0,0,0,0,0,0,0] #resulting values of 8-bit data
現(xiàn)在,我們必須定義輸入和輸出引腳。七個(gè)數(shù)據(jù)引腳將是輸入引腳,觸發(fā)引腳(RST 和 INTR)將是輸出引腳。只有當(dāng)我們根據(jù)數(shù)據(jù)表觸發(fā)輸出引腳在特定時(shí)間內(nèi)為高電平時(shí),我們才能從輸入引腳讀取 8 位數(shù)據(jù)值。由于我們已經(jīng)在二進(jìn)制數(shù)組中聲明了二進(jìn)制引腳,因此可以使用 for 循環(huán)進(jìn)行聲明,如下所示。
for binary in binarys:
GPIO.setup(binary, GPIO.IN) #All binary pins are input pins
#Trigger pin
GPIO.setup(22, GPIO.OUT) #WR and INTR pins are output
現(xiàn)在使用 LCD 庫命令,我們可以初始化 LCD 模塊并顯示一條小的介紹消息,如下所示。
mylcd=lcd.lcd()
mylcd.begin(D4,D5,D6,D7,RS,EN)
#Intro Message
mylcd.Print("Flex Sensor with")
mylcd.setCursor(2,1)
mylcd.Print("Raspberry Pi")
time.sleep(2)
mylcd.clear()
在無限 while 循環(huán)中,我們開始讀取二進(jìn)制值將它們轉(zhuǎn)換為十進(jìn)制并在 LCD 上更新結(jié)果。如前所述,在讀取ADC值之前,我們應(yīng)該使觸發(fā)引腳在特定時(shí)間內(nèi)保持高電平,以激活A(yù)DC轉(zhuǎn)換。這是使用以下行完成的。
GPIO.output(22, 1) #Turn ON Trigger
time.sleep(0.1)
GPIO.output(22, 0) #Turn OFF Trigger
現(xiàn)在,我們應(yīng)該讀取 8 個(gè)數(shù)據(jù)引腳并更新 bit 數(shù)組中的結(jié)果。為此,我們使用 for 循環(huán)將每個(gè)輸入引腳與 True 和 False 進(jìn)行比較。如果為 true,則相應(yīng)的位數(shù)組將設(shè)為 1,否則將設(shè)為 0。這是所有8位數(shù)據(jù)將被分別讀取的0和1值。
#Read the input pins and update result in bit array
for i in range(8):
if(GPIO.input(binarys[i]) == True):
bits[i] = 1
if(GPIO.input(binarys[i]) == False):
bits[i] = 0
更新 bits 數(shù)組后,我們應(yīng)該將此數(shù)組轉(zhuǎn)換為十進(jìn)制值。這只不過是二進(jìn)制到十進(jìn)制的轉(zhuǎn)換。對(duì)于 8 位二進(jìn)制數(shù)據(jù),2^8 為 256。因此,我們將獲得從 0 到 255 的十進(jìn)制數(shù)據(jù)。在python中,運(yùn)算符“**”用于查找任何值的冪。由于位[0]以MSB開頭,我們將其乘以2^(7位)。這樣,我們可以將所有二進(jìn)制值轉(zhuǎn)換為十進(jìn)制數(shù)據(jù),然后將其顯示在LCD上
#calculate the decimal value using bit array
for i in range(8):
decimal = decimal + (bits[i] * (2**(7-i)))
一旦我們知道十進(jìn)制值,就很容易計(jì)算電壓值。我們只需要將其乘以 19.63。因?yàn)閷?duì)于 8 位 5VADC,每個(gè)位都是 19.3 毫伏的類比。得到的電壓值是ADC0804 IC引腳Vin+和Vin-兩端出現(xiàn)的電壓值。
#calculate voltage value
Voltage = decimal * 19.63 *0.001 #one unit is 19.3mV
使用電壓值,我們可以確定柔性傳感器是如何彎曲的,以及它是如何彎曲的。在下面的幾行中,我剛剛將讀取的電壓值與預(yù)定的電壓值進(jìn)行了比較,以指示Flex傳感器在LCD屏幕上的位置。
#compare voltage and display status of sensor
mylcd.setCursor(1,1)
if (Voltage>3.8):
mylcd.Print("Bent Forward")
elif (Voltage<3.5):
mylcd.Print("Bent Backward")
else:
mylcd.Print("Stable")
同樣,您可以使用電壓值來執(zhí)行您希望樹莓派執(zhí)行的任何任務(wù)。
使用樹莓派在液晶屏上顯示柔性傳感器值:
該項(xiàng)目的工作非常簡單。但請確保您已下載 lcd.py頭文件并將其放置在當(dāng)前程序所在的同一目錄中。然后使用面包板或性能板在電路圖中顯示連接,并在Pi上運(yùn)行以下程序,您應(yīng)該開始工作。您的設(shè)置應(yīng)如下所示。
如圖所示,LCD將顯示十進(jìn)制值,電壓值和傳感器位置。只需向前或向后彎曲傳感器,您應(yīng)該能夠看到電壓和十進(jìn)制值發(fā)生變化,還會(huì)顯示狀態(tài)文本。您可以連接任何傳感器,并注意到其兩端的電壓發(fā)生變化。
import lcd #Import the LCD library by electro-passionindia
import time #Import time
import RPi.GPIO as GPIO #GPIO will be referred as GPIO only
GPIO.setmode(GPIO.BCM)
GPIO.setwarnings(False)
#LCD pin definitions
D4=2
D5=3
D6=4
D7=17
RS=20
EN=21
binarys = (10,9,11,5,6,13,19,26) #Array of pin numbers connect to DB0-DB7
bits = [0,0,0,0,0,0,0,0] #resulting values of 8-bit data
for binary in binarys:
GPIO.setup(binary, GPIO.IN) #All binary pins are input pins
#Trigger pin
GPIO.setup(22, GPIO.OUT) #WR and INTR pins are output
mylcd=lcd.lcd()
mylcd.begin(D4,D5,D6,D7,RS,EN)
#Intro Message
mylcd.Print("Flex Sensor with")
mylcd.setCursor(2,1)
mylcd.Print("Raspberry Pi")
time.sleep(2)
mylcd.clear()
while 1:
decimal = Voltage = 0 #intitialize to zero
GPIO.output(22, 1) #Turn ON Trigger
time.sleep(0.1)
GPIO.output(22, 0) #Turn OFF Trigger
mylcd.clear()
#Read the input pins and update result in bit array
for i in range(8):
if(GPIO.input(binarys[i]) == True):
bits[i] = 1
if(GPIO.input(binarys[i]) == False):
bits[i] = 0
#print binary values if required for debugging
## mylcd.Print("Binary= ")
## mylcd.setCursor(1,8)
## for i in range(8):
## mylcd.Print(bits[i])
#calculate the decimal value using bit array
for i in range(8):
decimal = decimal + (bits[i] * (2**(7-i)))
#Display decimal value
mylcd.setCursor(2,1)
mylcd.Print("D=")
mylcd.setCursor(2,3)
mylcd.Print(decimal)
#calculate voltage value
Voltage = decimal * 19.63 *0.001 #one unit is 19.3mV
#compare voltage and display status of sensor
mylcd.setCursor(1,1)
if (Voltage>3.8):
mylcd.Print("Bent Forward")
elif (Voltage<3.5):
mylcd.Print("Bent Backward")
else:
mylcd.Print("Stable")
Voltage = str(round(Voltage,2)) #limit to two digit after decimal
#display voltage
mylcd.setCursor(2,8)
mylcd.Print("V=")
mylcd.setCursor(2,10)
mylcd.Print(Voltage)
-
傳感器
+關(guān)注
關(guān)注
2550文章
51035瀏覽量
753070 -
lcd
+關(guān)注
關(guān)注
34文章
4424瀏覽量
167400 -
樹莓派
+關(guān)注
關(guān)注
116文章
1706瀏覽量
105607
發(fā)布評(píng)論請先 登錄
相關(guān)推薦
評(píng)論