树莓派测量压力,详细步骤记录树莓派使用压力传感器

在本篇树莓Pi压力测量教程中,我详细记录了如何将压敏电阻连接到Pi上,测量压力变化,还将使用电容器或模数转换器(ADC)来接收模拟信号。

Raspberry-Pi-Pressure-Pad-v2.jpg

压力垫的用途有很多,比如检测有人坐下来或对物体的特定部位施加压力。这是一个相当不错的传感器,可以在物联网项目等方面加以利用。

第一个设计方案,是最简单的,只会告诉你是否有压力。

第二个设计方案和LDR教程一样,利用了电容。使用这种方法,可以测量压垫的电阻。 如果没有压力,自然就不会得到值,只要施加一些压力,就会得到从100,000+到5,000的不同数值。

第三个设计方案使用了一个ADC,能够从压力垫上获得可变的数值。

设备清单

下面是我使用的所有的设备清单,点击链接直达优惠购买。

建议

可选

电路

电路比较简单,开始之前先了解下基础组件

压力传感器

压力垫是电路中最重要的部分,没有它就无法工作。我使用了一个FlexiForce压力垫传感器,但你能够使用更便宜的替代品。

当不施加压力时,FlexiForce传感器的电阻将接近无限大。如果你施加很大的压力,它将下降到25k欧姆以下。

它很像一个光传感器,但它使用的不是周围的光,而是压力。

电阻器

除了电容电路外,所有的电路中都需要用到这个电阻。这个电阻将作为一个分压器,并将压垫和电阻之间的3v3分离开。当施加压力时,它将提供足够的电压,使引脚达到高电平。

下面是一个公式,可以用它来计算出GPIO引脚的电压。例如,如果我们的压力垫是最大电阻,它将是(1,000,000 / (1,000,000 + 10,000,000)) *3.3=0.3伏。 这个电压还不足以让该引脚达到高电平。

反过来说,如果施加的压力很大,压力垫的阻力只有50,000,那么公式将是(1,000,000 / (1,000,000 + 50,000)) *3.3=3.14伏。 这个电压足以让该引脚达到高电平。

Voltage-Divider-Main-Equation-2.png

要了解更多关于分压器的信息,我建议查看我们关于它们的指南。

由于Raspberry Pi没有模拟引脚,所以它永远只能是高或低。可以通过使用电容或模数转换器来解决这个问题,见下文。

电容器

电容可以在不使用模数转换器的情况下得到可变的结果。虽然结果没有那么精确,但仍然非常方便,因为你可以看到施加在压力垫上的不同压力。

电容会像电池一样,在接受电力时充电,当它充满或停止接受电力时,就会放电。通过与压力垫串联使用,可以计算出压力垫的电阻。电阻越大,说明施加的压力越小。

模拟数字转换器

ADC将模拟传感器和设备连接到Raspberry Pi。它有更多的布线,但可以获得一个可变的值,而不是一个简单的开或关。

一个可变的值可以做更多的事情,比如检查正在施加多少压力,并根据结果执行不同的功能。如果需要关注特定区域的压力,那更合适了。

我不会在本教程中对ADC做太多的介绍,所以如果你想了解更多,那么一定要查看我的关于使用Raspberry Pi的ADC的教程

使用电阻电路图

这个电路非常简单,搭建起来不会花费很多时间。

  • 将压垫的一端连接到3v3。
  • 将一个1M欧姆的电阻放到面包板上,让其一端接GND,另一端接7号针。
  • 最后,让与7号针脚相连的电阻端也走到压垫的另一端。

下图告诉你它应该是怎样的。

Raspberry-Pi-Pressure-Pad-Resistor.png

使用电容的电路图

可以用一个电容来测量压垫的电阻。如果需要知道大概有多少压力施加在传感器上,这个电路比较合适。

  • 将压垫的一端连接到3v3。
  • 将一个1uf的电容放在面包板上,让负极接GND,另一个接7号引脚和压垫。

如果需要更多信息,那么请参考下图。

Raspberry-Pi-Pressure-Pad-Capacitor-Diagram.png

使用模数转换器的电路

最后一个电路是利用一个模数转换器。这可以从压垫上获得比较精确的数值。还利用了电阻,并将其用作分压器。

  • VDD(引脚16)将此线接入3.3V。
  • VREF(15脚)将此线接至3.3V。
  • AGND(14号针)将此线连接到地。
  • CLK(引脚13)将此线连接到GPIO11(引脚23/SCLK)。
  • DOUT (引脚12)将此线连接到GPIO9 (引脚21/MISO)。
  • DIN(引脚11)将此线连接到GPIO10(引脚19/MOSI)。
  • CS(引脚10)将此线连接到GPIO8(引脚24/CE0)。
  • DGND(9号脚)将此线接至地线。
  • 将压力垫连接到3v3
  • 将一个1.0k欧姆的电阻从GROUND连接到CH0。
  • 另外,将CH0连接到压力垫上。

下面的电路图更直观一些。

Raspberry-Pi-Pressure-Pad-ADC-Diagram.png

对压力垫进行编码

每一种电路设置都需要自己独特的代码。最简单的是使用电阻,而最复杂的是使用模数转换器。

为了更好地理解Python,我建议查看Python语法指南和Python介绍。

使用电阻的代码

和这个电路一样,电阻的代码也很简单,只需要寻找引脚升到高电平的时候。

在代码中,导入所需的包RPi.GPIO,用于与GPIO引脚的交互和暂停脚本的时间。

import RPi.GPIO as GPIO
import time

现在首先设置GPIO,使其在BCM模式下运行,并设置GPIO引脚4作为输入。

GPIO.setmode(GPIO.BCM)
GPIO.setup(4,GPIO.IN)

接下来,进入一个无限循环,读取GPIO引脚。如果它是高电平,而之前的读数是低电平,就打印一条信息。然后在循环之前,休眠一段时间。

while True:
    #take a reading
    input = GPIO.input(4)
    #if the last reading was low and this one high, alert us
    if ((not prev_input) and input):
        print("Under Pressure")
    #update previous input
    prev_input = input
    #slight pause
    time.sleep(0.10)

可以在下面得到使用电阻的完整代码。

import RPi.GPIO as GPIO
import time

GPIO.setmode(GPIO.BCM)
GPIO.setup(4,GPIO.IN)

#initialise a previous input variable to 0 (Assume no pressure applied)
prev_input = 0
try:
    while True:
        #take a reading
        input = GPIO.input(4)
        #if the last reading was low and this one high, alert us
        if ((not prev_input) and input):
            print("Under Pressure")
        #update previous input
        prev_input = input
        #slight pause
        time.sleep(0.10)
except KeyboardInterrupt:
    pass
finally:
    GPIO.cleanup()

使用电容器的代码

就像电阻代码一样,这并不是太复杂,是基于之前的教程中使用的LDR代码。

首先,必须插入所有需要的包来正确工作,时间和GPIO。

import RPi.GPIO as GPIO
import time

剩下的代码非常简单,有一个叫做rc_time的函数,这个函数需要一个参数。在这个函数中,等待引脚变高,然后返回计数,其中 “count “是变高的时间。

一旦返回了计数,把引脚切换为输出,并将其设置为低电平,然后等待100ms,之后将其切换回输入。然后它会计数,直到引脚变高。

可以用计数值来判断对压垫施加了多大的压力。如果数值很高,如50k以上,那么几乎没有施加压力。低于10k意味着压垫上有相当大的压力。

完整的代码就在下面。

#!/usr/local/bin/python

import RPi.GPIO as GPIO
import time

GPIO.setmode(GPIO.BCM)

#define the pin that goes to the circuit
pin_to_circuit = 4

def rc_time (pin_to_circuit):
    count = 0

    #Output on the pin for
    GPIO.setup(pin_to_circuit, GPIO.OUT)
    GPIO.output(pin_to_circuit, GPIO.LOW)
    time.sleep(0.1)

    #Change the pin back to input
    GPIO.setup(pin_to_circuit, GPIO.IN)

    #Count until the pin goes high
    while (GPIO.input(pin_to_circuit) == GPIO.LOW):
        count += 1

    return count

#Catch when script is interrupted, cleanup correctly
try:
    # Main loop
    while True:
        print(rc_time(pin_to_circuit))
except KeyboardInterrupt:
    pass
finally:
    GPIO.cleanup()

使用模数转换器(ADC)的代码

模数转换器的代码非常简单,棘手的部分是接收MCP3008芯片的值。如果想了解更多关于这段代码的信息,请查看模数转换器教程

以下是使用MCP3008的完整代码。

#!/usr/bin/python

import spidev
import time

#Define Variables
delay = 0.5
pad_channel = 0

#Create SPI
spi = spidev.SpiDev()
spi.open(0, 0)
spi.max_speed_hz=1000000

def readadc(adcnum):
    # read SPI data from the MCP3008, 8 channels in total
    if adcnum > 7 or adcnum < 0:
        return -1
    r = spi.xfer2([1, 8 + adcnum << 4, 0])
    data = ((r[1] & 3) << 8) + r[2]
    return data

try:
    while True:
        pad_value = readadc(pad_channel)
        print("---------------------------------------")
        print("Pressure Pad Value: %d" % pad_value)
        time.sleep(delay)
except KeyboardInterrupt:
    pass

如果不想做任何编码,也可以利用像Raspberry Pi Cayenne这样的东西。

希望到这里,你已经将力感电阻连接到你的树莓派上。

如果您有什么问题,欢迎在下面留言讨论。

平均: 5 / 5. votes: 1

到目前为止还没有投票!成为第一位评论此文章。

欢迎转载,请留下出处链接:Labno3 » 树莓派测量压力,详细步骤记录树莓派使用压力传感器

赞 (1)

评论

9+5=