风筝
发表于: 2022-11-14 09:56:44 | 显示全部楼层

压力传感器(Force Sensing Resistor,FSR)也称为力敏电阻或力感测电阻。这种传感器成本低廉,且易于使用,专门设计用于检测物理形式的压力、挤压和重力。


您会在电子鼓、手机、手持游戏设备和更多便携式电子设备中找到它们。


压力传感器概述

压力传感器中使用的技术已被自1985年成立的Interlink电子产品申请专利。您将很容易找到的最常见的FSR类型是InterLink FSR-402和FSR-406。


物理构造

FSR实际上是一个可变电阻器,随着压力施加到传感区域,相应的电阻值会发生变化。


它由几个薄的柔性层组成。按下越多,电阻碳元件越触及导电迹线,这会降低电阻。

How-FSRs-Made.jpg


形状和外形尺寸

市场上FSR的种类繁多选项,包含一些关键功能,例如尺寸、形状和传感范围,可以使它们与众不同。


大多数FSR具有圆形或矩形感应区域。正方形FSR非常适合广泛的区域传感,而小圆形传感器可以为传感场提供更高的准确性。

Types-of-FSR-Sensors.jpg


感应范围

FSR的另一个关键特征是其额定传感范围,该范围定义了传感器可以区分的最小压力和最大压力。


力额定值越低,FSR越敏感。传感器最大范围以外的任何压力都是无法衡量的(这也可能损坏传感器)。例如,较小的1公斤级FSR可能会提供更灵敏的读数,从0到1kg,但无法分辨2kg和5kg重量之间的差异。


FSR如何工作?

正如我们已经说过的,FSR实际上是一种电阻,它根据压力的程度而改变其电阻值。

FSR-Working-Animation.gif

当没有施加压力时,传感器看起来像无穷大的电阻(开路)。您在传感器头部施加的力越大,两个端子之间的电阻越低,但是当您取消压力时,它将返回其原始值。


下图显示了FSR402传感器的不同力测量值的传感器电阻。请注意,数据绘制在对数尺度上。

FSR-402-Resistance-vs-Force-curve.jpg


请注意,该图通常是从50克及向上线性线性的,但不低于50克。这意味着每当我们对其施加压力时,其电阻会迅速从无穷大降低到100k,然后变得更加线性。


读取FSR数据的方法

读取FSR的最简单方法是将FSR与固定值电阻(通常为10kΩ)连接起来,以形成一个分压器。为此,您将FSR的一端连接到电源,而另一端将其连接到下拉电阻器。然后,固定值下拉电阻和变量FSR电阻之间的点连接到Arduino的ADC输入。


这样,您可以创建一个可变电压输出,可以通过微控制器的ADC输入读取该输出。

FSR-Voltage-Divider.jpg


请注意,您测量的输出电压是施加在下拉电阻的电压,而不是FSR之间的电压。


分压器的输出由等式描述:

FSR1.jpg


根据该等式可以得出,输出电压随着力增加而增加。例如,使用5V电源和10K下拉电阻,当没有压力时,FSR电阻非常高(约10MΩ)。这将导致以下输出电压:

FSR2.jpg

如果在FSR上施加最大力,电阻将下降到大约250Ω。这将导致以下输出电压:

FSR3.jpg

如您所见,取决于施加到传感器的力量,输出电压从0到5V不等。


FSR压力传感器与Arduino Uno的硬件连接

将FSR连接到Arduino非常容易。


您需要与FSR连接10kΩ下拉电阻,以形成一个分压器。然后,下拉电阻和FSR之间的点连接到Arduino的ADC输入A0。

Wiring-FSR-To-Arduino.jpg


请注意,FSR实际上是一个电阻。这意味着您可以将它们连接到任何一种方式,工作都可以正常。


Arduino代码 - 简单的模拟读取FSR测量值

对于我们的第一个实验,将从Arduino的ADC引脚中读取传感器数据,并在串口显示器上显示输出。

代码非常简单。 它只是以定性的方式打印出压力值。 对于大多数项目,能满足需求。

  1. int fsrPin = 0;     // the FSR and 10K pulldown are connected to a0
  2. int fsrReading;     // the analog reading from the FSR resistor divider

  3. void setup(void) {
  4.   Serial.begin(9600);   
  5. }

  6. void loop(void) {
  7.   fsrReading = analogRead(fsrPin);  

  8.   Serial.print("Analog reading = ");
  9.   Serial.print(fsrReading);     // print the raw analog reading

  10.   if (fsrReading < 10) {
  11.     Serial.println(" - No pressure");
  12.   } else if (fsrReading < 200) {
  13.     Serial.println(" - Light touch");
  14.   } else if (fsrReading < 500) {
  15.     Serial.println(" - Light squeeze");
  16.   } else if (fsrReading < 800) {
  17.     Serial.println(" - Medium squeeze");
  18.   } else {
  19.     Serial.println(" - Big squeeze");
  20.   }
  21.   delay(1000);
  22. }
复制代码

如果工作正常,则应在串口显示器上看到下面的输出。

FSR-Analog-Output.jpg


代码说明

首先声明FSR和10K下拉电阻连接的Arduino引脚。我们还定义了变量fsrReading,该变量可保存FSR的原始模拟读数。

  1. int fsrPin = 0;
  2. int fsrReading;
复制代码

在setup()函数中,我们将初始化串口通信。

  1. void setup(void) {
  2.   Serial.begin(9600);   
  3. }
复制代码

在loop()函数中,我们从FSR分压器中获取模拟读数,并将其显示在串口显示器上。


如前所述,传感器的输出电压为0V(无压力)和大约5V(最大压力)。当Arduino将此模拟电压转换为数字时,它实际上将其转换为范围0到1023的10位数量。因此,根据挤压力程度,您将在串口显示器中看到0到1023之间的值。

  1. fsrReading = analogRead(fsrPin);  

  2. Serial.print("Analog reading = ");
  3. Serial.print(fsrReading);
复制代码

最后,我们打印了测量的压力量。

  1. if (fsrReading < 10) {
  2.         Serial.println(" - No pressure");
  3. } else if (fsrReading < 200) {
  4.         Serial.println(" - Light touch");
  5. } else if (fsrReading < 500) {
  6.         Serial.println(" - Light squeeze");
  7. } else if (fsrReading < 800) {
  8.         Serial.println(" - Medium squeeze");
  9. } else {
  10.         Serial.println(" - Big squeeze");
  11. }
复制代码

Arduino代码 - 高级模拟FSR测量

我们接下来的Arduino代码非常先进。它测量了FSR测量的近似牛顿力。这对于校准您认为FSR会体验到的力非常有用。

  1. int fsrPin = 0;     // the FSR and 10K pulldown are connected to a0
  2. int fsrReading;     // the analog reading from the FSR resistor divider
  3. int fsrVoltage;     // the analog reading converted to voltage
  4. unsigned long fsrResistance;  // The voltage converted to resistance
  5. unsigned long fsrConductance;
  6. long fsrForce;       // Finally, the resistance converted to force

  7. void setup(void) {
  8.   Serial.begin(9600);   // We'll send debugging information via the Serial monitor
  9. }

  10. void loop(void) {
  11.   fsrReading = analogRead(fsrPin);  
  12.   Serial.print("Analog reading = ");
  13.   Serial.println(fsrReading);

  14.   // analog voltage reading ranges from about 0 to 1023 which maps to 0V to 5V (= 5000mV)
  15.   fsrVoltage = map(fsrReading, 0, 1023, 0, 5000);
  16.   Serial.print("Voltage reading in mV = ");
  17.   Serial.println(fsrVoltage);  

  18.   if (fsrVoltage == 0) {
  19.     Serial.println("No pressure");  
  20.   } else {
  21.     // The voltage = Vcc * R / (R + FSR) where R = 10K and Vcc = 5V
  22.     // so FSR = ((Vcc - V) * R) / V        yay math!
  23.     fsrResistance = 5000 - fsrVoltage;     // fsrVoltage is in millivolts so 5V = 5000mV
  24.     fsrResistance *= 10000;                // 10K resistor
  25.     fsrResistance /= fsrVoltage;
  26.     Serial.print("FSR resistance in ohms = ");
  27.     Serial.println(fsrResistance);

  28.     fsrConductance = 1000000;           // we measure in micromhos so
  29.     fsrConductance /= fsrResistance;
  30.     Serial.print("Conductance in microMhos: ");
  31.     Serial.println(fsrConductance);

  32.     // Use the two FSR guide graphs to approximate the force
  33.     if (fsrConductance <= 1000) {
  34.       fsrForce = fsrConductance / 80;
  35.       Serial.print("Force in Newtons: ");
  36.       Serial.println(fsrForce);      
  37.     } else {
  38.       fsrForce = fsrConductance - 1000;
  39.       fsrForce /= 30;
  40.       Serial.print("Force in Newtons: ");
  41.       Serial.println(fsrForce);            
  42.     }
  43.   }
  44.   Serial.println("--------------------");
  45.   delay(1000);
  46. }
复制代码

以下是串口显示器中输出的样子。

FSR-Analog-Output2.jpg

跳转到指定楼层
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

主题 705 | 回复: 1492



手机版|

GMT+8, 2024-11-8 07:39 , Processed in 0.060569 second(s), 6 queries , Gzip On, MemCache On. Powered by Discuz! X3.5

YiBoard一板网 © 2015-2022 地址:河北省石家庄市长安区高营大街 ( 冀ICP备18020117号 )

快速回复 返回顶部 返回列表