风筝
发表于: 2022-11-10 12:40:05 | 显示全部楼层

如果您想要检测某个物体何时移动、倾斜或摇晃,而且不想要使用复杂的加速度计,那么刚球倾斜开关传感器可能是最便宜的选择。


概述

刚球倾斜开关传感器更像是一个可以检测基本运动、方向或倾斜度的开关。这些开关的设计方式使得足够的倾斜度可以建立或断开电气连接。这样的信号既可以用作指示器,也可以用于打开或关闭某些东西。


它们体积小、价格便宜、易于使用且永不磨损。它们的简单性使它们在玩具、小工具、机器人和其他功能取决于倾斜度的设备中广受欢迎。这就是为什么它们有时被称为“穷人的加速度计”。

Ball-Tilt-Switch-Sensor.jpg


尽管所有倾斜传感器的工作原理几乎相同,但它们的尺寸和规格可能略有不同。虽然不如加速度计准确或灵活,但倾斜传感器可以很好地检测运动或方向。使用倾斜传感器的另一个优点是它可以用作独立传感器。另一方面,加速度计输出数字或模拟电压,必须使用附加电路对其进行分析。


钢球倾斜传感器如何工作?

钢球倾斜传感器通常由一个金属管和一个在其中滚动的小金属球组成。空腔的一端有两个导电元件(极)。传感器的设计方式使得足够的倾斜水平允许球滚动,建立或断开电气连接。

Ball-Tilt-Switch-Sensor-Working-Illustration.jpg

当传感器直立时,球接触两极并建立电气连接。当传感器倾斜时,球会从杆子上滚下来,连接就会断开。


测试刚球倾斜传感器

测试刚球倾斜传感器的方法非常简单。将万用表置于通断档模式,并将探针接触两条引线。然后倾斜它以确定开关打开和关闭的角度。


指向上方时,开关闭合。

Testing-Ball-Tilt-Switch-Sensor-with-Multimeter-Upright-Position.jpg

指向下方时,开关打开(无连续性)。

Testing-Ball-Tilt-Switch-Sensor-with-Multimeter-Tilted-Position.jpg


将刚球倾斜传感器连接到Arduino

将倾斜传感器连接到您的Arduino开发板非常简单。您需要做的就是将一个引脚连接到Arduino的任何数字引脚,另一个连接到GND。


如果以这种方式连接传感器,则需要激活Arduino的内置输入引脚上拉电阻。否则,您必须在电路中使用外部10K上拉电阻。


下图显示了接线。

Arduino-Wiring-with-Ball-Tilt-Switch-Sensor.jpg


Arduino代码 - 读取刚球倾斜传感器

下面是一个非常基本的Arduino草图,当倾斜传感器向一个方向倾斜时,它会点亮内置的LED(连接到引脚13),而当它向另一个方向倾斜时会熄灭LED灯。

  1. const int tiltPin = 2;                // tilt sensor pin is connected to pin 2
  2. const int ledPin = 13;                // built-in LED is connected to pin 13

  3. void setup() {
  4.         pinMode(tiltPin, INPUT);                // set sensor pin as an INPUT pin
  5.         digitalWrite(tiltPin, HIGH);        // turn on the built in pull-up resistor
  6.         pinMode(ledPin, OUTPUT);                // set LED pin as an OUTPUT pin
  7. }

  8. void loop() {
  9.         if (digitalRead(tiltPin)) { // check if the pin is high
  10.                 digitalWrite(ledPin, HIGH);        // turn on the LED
  11.         }
  12.         else { // if it isn't
  13.                 digitalWrite(ledPin, LOW);        // do the opposite
  14.         }
  15. }
复制代码

该代码非常简单。首先定义了两个常量,声明倾斜传感器和内置LED灯连接到的Arduino引脚。在setup()函数中,传感器引脚配置为输入,而LED引脚配置为输出。传感器引脚也启用了内部上拉电阻。在loop()函数中,如果传感器引脚为高电平,则内置LED点亮,否则熄灭。


这是一个很短的草图,效果很好,但是有一个问题。如果您在倾斜传感器时查看LED,您可能已经注意到它在闪烁。那是因为所谓的“开关弹跳(switch bounce)”。


什么是开关弹跳以及如何处理?

当传感器指向上方时,刚球滚到两极上并使它们短路,充当开关投掷。在理想情况下,如果我们将其连接到信号分析仪,我们应该会得到如下所示的信号:

Ball-Tilt-Switch-Sensor-Debounce-Ideal-Signal.jpg

这就是刚倾斜传感器的工作方式,也是大多数人的想法。然而,实际上它看起来更像这样:

Ball-Tilt-Switch-Sensor-Debounce-Bounce-Signal.jpg

理想情况下,接触应该是立即的。实际上,刚球会反弹一点,使触点打开、关闭、打开、关闭等。这是一种称为“开关反弹”的机械现象,就像丢球一样 - 它在最终落地之前反弹。


所以信号在最终稳定之前上升和下降了几次。它在一段时间 (t) 内执行此操作。虽然这段时间非常快,对我们来说似乎几乎是瞬间的,但对于Arduino来说,这是一段非常长的时间。它可以在那个时间段内执行多条指令。


消除开关弹跳的过程称为去抖(Debouncing),可以通过编程方式实现。通常开关弹跳发生在50毫秒的窗口内。因此,检测到开关变化后的50mS延迟足以消除它。


Arduino代码 - 读取球倾斜传感器(更可靠)

这是一个重写的新草图,用于演示如何对输入进行去抖。在这个草图中,我们在短时间内读取了倾斜传感器两次,以确保它绝对倾斜。


继续并将其上传到您的Arduino。现在您可以看到当您倾斜传感器时LED不再闪烁(如果问题仍然存在,请尝试增加去抖动时间)。

  1. const int tiltPin = 2;                // tilt sensor pin is connected to pin 2
  2. const int ledPin = 13;                // built-in LED is connected to pin 13

  3. int ledState = HIGH;                // the current state of the LED
  4. int tiltState;                                // the current reading from the sensor
  5. int lastTiltState = LOW;        // the previous reading from the sensor

  6. unsigned long time = 0;                // the last time the output pin was toggled
  7. unsigned long debounceDelay = 50;        // the debounce time, increase if the output flickers

  8. void setup() {
  9.         pinMode(tiltPin, INPUT);                // Set sensor pin as an INPUT pin
  10.         digitalWrite(tiltPin, HIGH);        // turn on the built in pull-up resistor
  11.         pinMode(ledPin, OUTPUT);                // Set LED pin as an OUTPUT pin
  12. }

  13. void loop() {
  14.         // read the state of the tilt sensor
  15.         tiltState = digitalRead(tiltPin);

  16.         // If the sensor really tilted?
  17.         if (tiltState != lastTiltState) {
  18.                 // reset the debouncing timer
  19.                 time = millis();
  20.         }

  21.         if ((millis() - time) > debounceDelay) {
  22.                 // whatever the switch is at, its been there for a long time
  23.                 // so lets settle on it!
  24.                 ledState = tiltState;
  25.         }
  26.         digitalWrite(ledPin, ledState);

  27.         // Save the last tiltState so we keep a running tally
  28.         lastTiltState = tiltState;
  29. }
复制代码

代码说明

草图首先声明倾斜传感器和内置LED连接到的Arduino引脚编号。

  1. const int tiltPin = 2;
  2. const int ledPin = 13;
复制代码

定义了三个整形变量,即ledState、tiltState 和 lastTiltState 分别用于存储LED的当前状态、传感器的当前读数和传感器的先前读数。

  1. int ledState = HIGH;
  2. int tiltState;
  3. int lastTiltState = LOW;
复制代码

在同一个全局区域中,定义了两个变量来存储最后倾斜事件和去抖动时间。请注意,这些变量是无符号长整数,因为时间(以毫秒为单位)很快就会变成一个更大的数字并溢出一个整数。

  1. unsigned long time = 0;
  2. unsigned long debounceDelay = 50;
复制代码

setup()函数部分与之前的代码相同,我们将传感器引脚配置为输入,将LED引脚配置为输出;并启用传感器引脚的内部上拉电阻。

  1. void setup() {
  2.         pinMode(tiltPin, INPUT);
  3.         digitalWrite(tiltPin, HIGH);
  4.         pinMode(ledPin, OUTPUT);
  5. }
复制代码

在loop()中,我们首先读取倾斜传感器的状态并检查该状态是否与上一个倾斜状态不同(由于倾斜或噪声)。如果不同,我们通过存储当前时间记录这个状态改变事件。为此,我们使用 millis() 函数来跟踪自Arduino开发板开始运行当前程序以来经过的时间。

  1. tiltState = digitalRead(tiltPin);

  2. if (tiltState != lastTiltState) {
  3.         time = millis();
  4. }
复制代码

接下来,我们看看传感器是否在50毫秒(debounceDelay)窗口内改变了它的状态,如果没有,这意味着传感器确实倾斜了(而不是由于开关反弹)。然后我们切换LED并保存最后的倾斜状态,以便我们可以保持运行计数。

  1. if ((millis() - time) > debounceDelay) {
  2.         ledState = tiltState;
  3. }
  4. digitalWrite(ledPin, ledState);

  5. lastTiltState = tiltState;
复制代码

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

本版积分规则

主题 700 | 回复: 1480



手机版|

GMT+8, 2024-4-25 23:55 , Processed in 0.046681 second(s), 8 queries , Gzip On, MemCache On. Powered by Discuz! X3.5

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

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