|
压力传感器(Force Sensing Resistor,FSR)也称为力敏电阻或力感测电阻。这种传感器成本低廉,且易于使用,专门设计用于检测物理形式的压力、挤压和重力。
您会在电子鼓、手机、手持游戏设备和更多便携式电子设备中找到它们。
压力传感器概述 压力传感器中使用的技术已被自1985年成立的Interlink电子产品申请专利。您将很容易找到的最常见的FSR类型是InterLink FSR-402和FSR-406。
物理构造 FSR实际上是一个可变电阻器,随着压力施加到传感区域,相应的电阻值会发生变化。
它由几个薄的柔性层组成。按下越多,电阻碳元件越触及导电迹线,这会降低电阻。
形状和外形尺寸 市场上FSR的种类繁多选项,包含一些关键功能,例如尺寸、形状和传感范围,可以使它们与众不同。
大多数FSR具有圆形或矩形感应区域。正方形FSR非常适合广泛的区域传感,而小圆形传感器可以为传感场提供更高的准确性。
感应范围 FSR的另一个关键特征是其额定传感范围,该范围定义了传感器可以区分的最小压力和最大压力。
力额定值越低,FSR越敏感。传感器最大范围以外的任何压力都是无法衡量的(这也可能损坏传感器)。例如,较小的1公斤级FSR可能会提供更灵敏的读数,从0到1kg,但无法分辨2kg和5kg重量之间的差异。
FSR如何工作? 正如我们已经说过的,FSR实际上是一种电阻,它根据压力的程度而改变其电阻值。
当没有施加压力时,传感器看起来像无穷大的电阻(开路)。您在传感器头部施加的力越大,两个端子之间的电阻越低,但是当您取消压力时,它将返回其原始值。
下图显示了FSR402传感器的不同力测量值的传感器电阻。请注意,数据绘制在对数尺度上。
请注意,该图通常是从50克及向上线性线性的,但不低于50克。这意味着每当我们对其施加压力时,其电阻会迅速从无穷大降低到100k,然后变得更加线性。
读取FSR数据的方法 读取FSR的最简单方法是将FSR与固定值电阻(通常为10kΩ)连接起来,以形成一个分压器。为此,您将FSR的一端连接到电源,而另一端将其连接到下拉电阻器。然后,固定值下拉电阻和变量FSR电阻之间的点连接到Arduino的ADC输入。
这样,您可以创建一个可变电压输出,可以通过微控制器的ADC输入读取该输出。
请注意,您测量的输出电压是施加在下拉电阻的电压,而不是FSR之间的电压。
分压器的输出由等式描述:
根据该等式可以得出,输出电压随着力增加而增加。例如,使用5V电源和10K下拉电阻,当没有压力时,FSR电阻非常高(约10MΩ)。这将导致以下输出电压:
如果在FSR上施加最大力,电阻将下降到大约250Ω。这将导致以下输出电压:
如您所见,取决于施加到传感器的力量,输出电压从0到5V不等。
FSR压力传感器与Arduino Uno的硬件连接 将FSR连接到Arduino非常容易。
您需要与FSR连接10kΩ下拉电阻,以形成一个分压器。然后,下拉电阻和FSR之间的点连接到Arduino的ADC输入A0。
请注意,FSR实际上是一个电阻。这意味着您可以将它们连接到任何一种方式,工作都可以正常。
Arduino代码 - 简单的模拟读取FSR测量值 对于我们的第一个实验,将从Arduino的ADC引脚中读取传感器数据,并在串口显示器上显示输出。 代码非常简单。 它只是以定性的方式打印出压力值。 对于大多数项目,能满足需求。 - int fsrPin = 0; // the FSR and 10K pulldown are connected to a0
- int fsrReading; // the analog reading from the FSR resistor divider
-
- void setup(void) {
- Serial.begin(9600);
- }
-
- void loop(void) {
- fsrReading = analogRead(fsrPin);
-
- Serial.print("Analog reading = ");
- Serial.print(fsrReading); // print the raw analog reading
-
- if (fsrReading < 10) {
- Serial.println(" - No pressure");
- } else if (fsrReading < 200) {
- Serial.println(" - Light touch");
- } else if (fsrReading < 500) {
- Serial.println(" - Light squeeze");
- } else if (fsrReading < 800) {
- Serial.println(" - Medium squeeze");
- } else {
- Serial.println(" - Big squeeze");
- }
- delay(1000);
- }
复制代码如果工作正常,则应在串口显示器上看到下面的输出。
代码说明 首先声明FSR和10K下拉电阻连接的Arduino引脚。我们还定义了变量fsrReading,该变量可保存FSR的原始模拟读数。 - int fsrPin = 0;
- int fsrReading;
复制代码在setup()函数中,我们将初始化串口通信。 - void setup(void) {
- Serial.begin(9600);
- }
复制代码在loop()函数中,我们从FSR分压器中获取模拟读数,并将其显示在串口显示器上。
如前所述,传感器的输出电压为0V(无压力)和大约5V(最大压力)。当Arduino将此模拟电压转换为数字时,它实际上将其转换为范围0到1023的10位数量。因此,根据挤压力程度,您将在串口显示器中看到0到1023之间的值。 - fsrReading = analogRead(fsrPin);
-
- Serial.print("Analog reading = ");
- Serial.print(fsrReading);
复制代码最后,我们打印了测量的压力量。 - if (fsrReading < 10) {
- Serial.println(" - No pressure");
- } else if (fsrReading < 200) {
- Serial.println(" - Light touch");
- } else if (fsrReading < 500) {
- Serial.println(" - Light squeeze");
- } else if (fsrReading < 800) {
- Serial.println(" - Medium squeeze");
- } else {
- Serial.println(" - Big squeeze");
- }
复制代码
Arduino代码 - 高级模拟FSR测量 我们接下来的Arduino代码非常先进。它测量了FSR测量的近似牛顿力。这对于校准您认为FSR会体验到的力非常有用。 - int fsrPin = 0; // the FSR and 10K pulldown are connected to a0
- int fsrReading; // the analog reading from the FSR resistor divider
- int fsrVoltage; // the analog reading converted to voltage
- unsigned long fsrResistance; // The voltage converted to resistance
- unsigned long fsrConductance;
- long fsrForce; // Finally, the resistance converted to force
-
- void setup(void) {
- Serial.begin(9600); // We'll send debugging information via the Serial monitor
- }
-
- void loop(void) {
- fsrReading = analogRead(fsrPin);
- Serial.print("Analog reading = ");
- Serial.println(fsrReading);
-
- // analog voltage reading ranges from about 0 to 1023 which maps to 0V to 5V (= 5000mV)
- fsrVoltage = map(fsrReading, 0, 1023, 0, 5000);
- Serial.print("Voltage reading in mV = ");
- Serial.println(fsrVoltage);
-
- if (fsrVoltage == 0) {
- Serial.println("No pressure");
- } else {
- // The voltage = Vcc * R / (R + FSR) where R = 10K and Vcc = 5V
- // so FSR = ((Vcc - V) * R) / V yay math!
- fsrResistance = 5000 - fsrVoltage; // fsrVoltage is in millivolts so 5V = 5000mV
- fsrResistance *= 10000; // 10K resistor
- fsrResistance /= fsrVoltage;
- Serial.print("FSR resistance in ohms = ");
- Serial.println(fsrResistance);
-
- fsrConductance = 1000000; // we measure in micromhos so
- fsrConductance /= fsrResistance;
- Serial.print("Conductance in microMhos: ");
- Serial.println(fsrConductance);
-
- // Use the two FSR guide graphs to approximate the force
- if (fsrConductance <= 1000) {
- fsrForce = fsrConductance / 80;
- Serial.print("Force in Newtons: ");
- Serial.println(fsrForce);
- } else {
- fsrForce = fsrConductance - 1000;
- fsrForce /= 30;
- Serial.print("Force in Newtons: ");
- Serial.println(fsrForce);
- }
- }
- Serial.println("--------------------");
- delay(1000);
- }
复制代码以下是串口显示器中输出的样子。
|