主页 > 互联网 > 内容页

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

2022-12-31 10:11:31 来源:circuitdigest

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用于读取这些数字值。

现在,另一个重要的事情是,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引脚 38GPIO 20
液晶显示器 RW引脚 39
液晶显示器 E引脚 40GPIO 21
液晶屏 D4引脚 3GPIO 2
液晶屏 D5引脚 5GPIO 3
液晶屏 D6引脚 7GPIO 4
液晶屏 D7引脚 11GPIO 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引脚 15GPIO 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.comimport time #Import timeimport RPi.GPIO as GPIO #GPIO will be reffered as GPIO onlyLCD引脚定义分配给变量,如下所示。请注意,这些数字是 GPIO 引脚编号,而不是实际引脚编号。可以使用上表将 GPIO 编号与引脚编号进行比较。数组二进制文件将包括所有数据引脚编号,数组位将存储所有 GPIO 引脚的结果值。#LCD pin definitionsD4=2D5=3D6=4D7=17RS=20EN=21binarys = (10,9,11,5,6,13,19,26) #Array of pin numbers connect to DB0-DB7bits = [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 pinGPIO.setup(22, GPIO.OUT) #WR and INTR pins are output现在使用 LCD 库命令,我们可以初始化 LCD 模块并显示一条小的介绍消息,如下所示。mylcd=lcd.lcd()mylcd.begin(D4,D5,D6,D7,RS,EN)#Intro Messagemylcd.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 Triggertime.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 arrayfor i in range(8):if(GPIO.input(binarys[i]) == True):bits[i] = 1if(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 arrayfor i in range(8):decimal = decimal + (bits[i] * (2**(7-i)))一旦我们知道十进制值,就很容易计算电压值。我们只需要将其乘以 19.63。因为对于 8 位 5VADC,每个位都是 19.3 毫伏的类比。得到的电压值是ADC0804 IC引脚Vin+和Vin-两端出现的电压值。#calculate voltage valueVoltage = decimal * 19.63 *0.001 #one unit is 19.3mV使用电压值,我们可以确定柔性传感器是如何弯曲的,以及它是如何弯曲的。在下面的几行中,我刚刚将读取的电压值与预定的电压值进行了比较,以指示Flex传感器在LCD屏幕上的位置。#compare voltage and display status of sensormylcd.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-passionindiaimport time #Import timeimport RPi.GPIO as GPIO #GPIO will be referred as GPIO onlyGPIO.setmode(GPIO.BCM)GPIO.setwarnings(False)#LCD pin definitionsD4=2D5=3D6=4D7=17RS=20EN=21binarys = (10,9,11,5,6,13,19,26) #Array of pin numbers connect to DB0-DB7bits = [0,0,0,0,0,0,0,0] #resulting values of 8-bit datafor binary in binarys:GPIO.setup(binary, GPIO.IN) #All binary pins are input pins#Trigger pinGPIO.setup(22, GPIO.OUT) #WR and INTR pins are outputmylcd=lcd.lcd()mylcd.begin(D4,D5,D6,D7,RS,EN)#Intro Messagemylcd.Print("Flex Sensor with")mylcd.setCursor(2,1)mylcd.Print("Raspberry Pi")time.sleep(2)mylcd.clear()while 1:decimal = Voltage = 0 #intitialize to zeroGPIO.output(22, 1) #Turn ON Triggertime.sleep(0.1)GPIO.output(22, 0) #Turn OFF Triggermylcd.clear()#Read the input pins and update result in bit arrayfor i in range(8):if(GPIO.input(binarys[i]) == True):bits[i] = 1if(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 arrayfor i in range(8):decimal = decimal + (bits[i] * (2**(7-i)))#Display decimal valuemylcd.setCursor(2,1)mylcd.Print("D=")mylcd.setCursor(2,3)mylcd.Print(decimal)#calculate voltage valueVoltage = decimal * 19.63 *0.001 #one unit is 19.3mV#compare voltage and display status of sensormylcd.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 voltagemylcd.setCursor(2,8)mylcd.Print("V=")mylcd.setCursor(2,10)mylcd.Print(Voltage)

标签: 发生变化 液晶显示器

上一篇:
下一篇: