如何将柔性传感器与树莓派连接并在LCD屏幕上显示其值

描述

Raspberry Pi是一款基于ARM架构处理器的主板,专为电子工程师和业余爱好者设计。PI是目前最值得信赖的项目开发平台之一。凭借更高的处理器速度和 1 GB RAM,PI 可用于许多备受瞩目的项目,如图像处理和物联网。PI可以做很多很酷的事情,但一个可悲的功能是它没有内置的ADC模块。

在这个项目中,我们将学习如何将柔性传感器与树莓派连接并在LCD屏幕上显示其值。

所需材料:

树莓派(任何型号)

ADC0804 集成电路

16*2液晶显示屏

柔性传感器

电阻器和电容器

面包板或性能板。

ADC0804 单通道 8 位 ADC 模块:

在继续之前,让我们了解一下这款ADC0804 IC,以及如何将其与树莓派配合使用。ADC0804是一款单通道8位IC,这意味着它可以读取单个ADC值并将其映射到8位数字数据。这些 8 位数字数据可以被树莓派读取,因此值将是 0-255,因为 2^8 是 256。如下面IC的引脚排列所示,引脚DB0至DB7用于读取这些数字值。

lcd

现在,另一个重要的事情是,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

电路图及说明:

柔性传感器与树莓派接口的完整电路图如下所示。解释如下。

lcd

这个树莓派柔性传感器电路可能看起来有点复杂,有很多电线,但如果你仔细观察,大多数电线都直接从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

 

您可以使用下图来确定树莓上的引脚编号。

lcd

与所有ADC模块一样,ADC0804 IC也需要时钟信号才能工作,幸运的是该IC具有内部时钟源,因此我们只需将RC电路添加到CLK输入和CLK R引脚,如图所示。我们使用了 10K 和 105pf 的值,但我们可以使用任何接近的值,例如 1uf、0.1uf、0.01uf 也应该有效。

然后,为了连接Flex传感器,我们使用了一个使用100K电阻的分压器电路。当 Flex 传感器弯曲时,其两端的电阻会发生变化,电阻两端的电位降也会发生变化。该压降由ADC0804 IC测量,并相应地生成8位数据。

lcd

对树莓派进行编程:

完成连接后,我们应该使用 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

如图所示,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)


 

打开APP阅读更多精彩内容
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉

全部0条评论

快来发表一下你的评论吧 !

×
20
完善资料,
赚取积分