Raspberry Pi是一款基于ARM架構處理器的主板,專為電子工程師和業余愛好者設計。PI是目前最值得信賴的項目開發平臺之一。憑借更高的處理器速度和 1 GB RAM,PI 可用于許多備受矚目的項目,如圖像處理和物聯網。PI可以做很多很酷的事情,但一個可悲的功能是它沒有內置的ADC模塊。
在這個項目中,我們將學習如何將柔性傳感器與樹莓派連接并在LCD屏幕上顯示其值。
所需材料:
樹莓派(任何型號)
16*2液晶顯示屏
柔性傳感器
面包板或性能板。
ADC0804 單通道 8 位 ADC 模塊:
在繼續之前,讓我們了解一下這款ADC0804 IC,以及如何將其與樹莓派配合使用。ADC0804是一款單通道8位IC,這意味著它可以讀取單個ADC值并將其映射到8位數字數據。這些 8 位數字數據可以被樹莓派讀取,因此值將是 0-255,因為 2^8 是 256。如下面IC的引腳排列所示,引腳DB0至DB7用于讀取這些數字值。
現在,另一個重要的事情是,ADC0804工作在5V,因此它提供5V邏輯信號輸出。在8引腳輸出(代表8位)中,每個引腳提供+5V輸出以表示邏輯“1”。所以問題是PI邏輯是+3.3V,所以你不能給PI的+3.3VGPIO引腳提供+5V邏輯。如果為PI的任何GPIO引腳提供+5V,電路板就會損壞。
因此,為了從+5V降壓邏輯電平,我們將使用分壓器電路。我們之前已經討論了分壓器電路,以進一步澄清。我們要做的是,我們使用兩個電阻將+5V邏輯分頻為2*2.5V邏輯。因此,除法后,我們將為樹莓派提供+2.5v邏輯。因此,每當ADC0804提供邏輯“1”時,PI GPIO引腳上都會看到+2.5V,而不是+5V。在此處了解有關ADC的更多信息:ADC0804簡介。
以下是我們在Perf板上構建的采用ADC0804的ADC模塊的圖片:
電路圖及說明:
柔性傳感器與樹莓派接口的完整電路圖如下所示。解釋如下。
這個樹莓派柔性傳感器電路可能看起來有點復雜,有很多電線,但如果你仔細觀察,大多數電線都直接從LCD和8位數據引腳連接到樹莓派。下表將幫助您建立和驗證連接。
引腳名稱 | 覆盆子別針編號 | 樹莓派 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 虛擬交流系統 | 引腳 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 |
您可以使用下圖來確定樹莓上的引腳編號。
與所有ADC模塊一樣,ADC0804 IC也需要時鐘信號才能工作,幸運的是該IC具有內部時鐘源,因此我們只需將RC電路添加到CLK輸入和CLK R引腳,如圖所示。我們使用了 10K 和 105pf 的值,但我們可以使用任何接近的值,例如 1uf、0.1uf、0.01uf 也應該有效。
然后,為了連接Flex傳感器,我們使用了一個使用100K電阻的分壓器電路。當 Flex 傳感器彎曲時,其兩端的電阻會發生變化,電阻兩端的電位降也會發生變化。該壓降由ADC0804 IC測量,并相應地生成8位數據。
對樹莓派進行編程:
完成連接后,我們應該使用 Raspberry Pi 讀取這些 8 位的狀態并將它們轉換為十進制,以便我們可以使用它們。本頁末尾給出了用于執行相同操作并在LCD屏幕上顯示結果值的程序。此外,代碼在下面解釋為小垃圾。
我們需要一個 LCD庫來將 LCD 與 Pi 連接。為此,我們使用 shubham 開發的庫,它將幫助我們在四線模式下將 16*2 LCD 顯示器與 Pi 連接。此外,我們還需要庫來利用時間和 Pi GPIO 引腳。
注意:lcd.py 應從此處下載,并放置在保存此程序的同一目錄中。只有這樣,代碼才會編譯。
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引腳定義分配給變量,如下所示。請注意,這些數字是 GPIO 引腳編號,而不是實際引腳編號。可以使用上表將 GPIO 編號與引腳編號進行比較。數組二進制文件將包括所有數據引腳編號,數組位將存儲所有 GPIO 引腳的結果值。
#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
現在,我們必須定義輸入和輸出引腳。七個數據引腳將是輸入引腳,觸發引腳(RST 和 INTR)將是輸出引腳。只有當我們根據數據表觸發輸出引腳在特定時間內為高電平時,我們才能從輸入引腳讀取 8 位數據值。由于我們已經在二進制數組中聲明了二進制引腳,因此可以使用 for 循環進行聲明,如下所示。
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
現在使用 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 循環中,我們開始讀取二進制值將它們轉換為十進制并在 LCD 上更新結果。如前所述,在讀取ADC值之前,我們應該使觸發引腳在特定時間內保持高電平,以激活ADC轉換。這是使用以下行完成的。
GPIO.output(22, 1) #Turn ON Trigger
time.sleep(0.1)
GPIO.output(22, 0) #Turn OFF Trigger
現在,我們應該讀取 8 個數據引腳并更新 bit 數組中的結果。為此,我們使用 for 循環將每個輸入引腳與 True 和 False 進行比較。如果為 true,則相應的位數組將設為 1,否則將設為 0。這是所有8位數據將被分別讀取的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 數組后,我們應該將此數組轉換為十進制值。這只不過是二進制到十進制的轉換。對于 8 位二進制數據,2^8 為 256。因此,我們將獲得從 0 到 255 的十進制數據。在python中,運算符“**”用于查找任何值的冪。由于位[0]以MSB開頭,我們將其乘以2^(7位)。這樣,我們可以將所有二進制值轉換為十進制數據,然后將其顯示在LCD上
#calculate the decimal value using bit array
for i in range(8):
decimal = decimal + (bits[i] * (2**(7-i)))
一旦我們知道十進制值,就很容易計算電壓值。我們只需要將其乘以 19.63。因為對于 8 位 5VADC,每個位都是 19.3 毫伏的類比。得到的電壓值是ADC0804 IC引腳Vin+和Vin-兩端出現的電壓值。
#calculate voltage value
Voltage = decimal * 19.63 *0.001 #one unit is 19.3mV
使用電壓值,我們可以確定柔性傳感器是如何彎曲的,以及它是如何彎曲的。在下面的幾行中,我剛剛將讀取的電壓值與預定的電壓值進行了比較,以指示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")
同樣,您可以使用電壓值來執行您希望樹莓派執行的任何任務。
使用樹莓派在液晶屏上顯示柔性傳感器值:
該項目的工作非常簡單。但請確保您已下載 lcd.py頭文件并將其放置在當前程序所在的同一目錄中。然后使用面包板或性能板在電路圖中顯示連接,并在Pi上運行以下程序,您應該開始工作。您的設置應如下所示。
如圖所示,LCD將顯示十進制值,電壓值和傳感器位置。只需向前或向后彎曲傳感器,您應該能夠看到電壓和十進制值發生變化,還會顯示狀態文本。您可以連接任何傳感器,并注意到其兩端的電壓發生變化。
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)
-
傳感器
+關注
關注
2548文章
50740瀏覽量
752138 -
lcd
+關注
關注
34文章
4414瀏覽量
167135 -
樹莓派
+關注
關注
116文章
1699瀏覽量
105536
發布評論請先 登錄
相關推薦
評論