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 | 引脚 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)
全部0条评论
快来发表一下你的评论吧 !