传感器(一)简介和开关

介绍

传感器(sensor)是任何一种设备,它接受诸如光线强度、物体的位置、温度、湿度、物体速度等物理属性作为输入,并将其转换为电气属性,如电压、电流或电阻。

图片

比如在一个机器人项目中,传感器主要用于两个不同的目的:一是提供机器人自身状态的信息,例如关节角度;二是提供环境信息,例如空气的温度或湿度。

变换器

传感器可以说是另一类被称为执行器(Actuator)的对立面。执行器的输入是某种电气属性,而输出则是物理属性。

图片

直流电动机、伺服电动机和步进电动机都是执行器的例子。传感器和执行器共同组成了一个更大的设备类别,称为变换器(Transducer)。变换器这一术语指的是任何一种将一种能量转换为另一种能量的设备。在机器人技术中,我们最感兴趣的是那些在电气能量和其他类型的能量之间进行转换的变换器。这是因为我们可以使用微控制器测量电气属性或电气信号,然后在机器人控制算法中使用这些测量值。

传感器有时被称为输入变换器(Input Transducer),而执行器则被称为输出变换器(Output Tranducer)。这是因为我们完整的机器人系统通常是这样的:我们通过传感器获取物理属性,传感器将其转换为电气属性,我们进行一些计算,并使用这些计算来调整进入执行器的电气属性,进而影响物理世界。由于传感器处于系统的输入端,而执行器处于输出端,因此“输入变换器”和“输出变换器”这些术语是适用的。

障碍

在设计和构建项目时,你需要解决确定使用哪些传感器并实现其使用的任务。我发现,通常有三个主要障碍需要克服。首先是了解各种传感器选项的广泛性。如果你只了解一种适用于你应用的传感器,你可能会选择那种传感器,即使可能还有更好的传感器只是因为你不知道其他类型传感器的存在。因此,为了帮助你克服这个障碍,接下来的文章将简要介绍各种不同类型的传感器,概述它们的工作原理和用途。

第二个障碍是了解如何接线和读取传感器。有时,实际有效地使用传感器的最大障碍就是不知道如何开始。幸运的是,许多不同类型的传感器工作方式非常相似。如果你知道如何使用几种常见类型的传感器,你通常可以将这些知识推广到许多其他工作原理相同的传感器。例如,许多不同的传感器使用基本的可变电阻原理,换句话说,传感器的设计使得物理属性的变化引起电阻的变化。如果你知道如何接线和读取一种可变电阻传感器,你可以使用相同的方法接线和读取许多其他种类的可变电阻传感器。因此,在本节课程中,我们将学习如何接线和读取三种示例传感器:按钮开关(button switch)、可变电阻器(potentiometer)和霍尔编码器(hall encoder)。

第三个障碍是理解传感器制造商或零售商发布的信息。当你去寻找适用于你机器人的传感器时,传感器制造商或零售商会提到诸如非线性、滞后、范围、精度等术语。这些术语通常与传感器响应曲线等图表一起出现。了解这些术语和数字的含义可以大大帮助你有效选择适合你机器人的传感器。因此,在本节课程中,我们将讨论许多在传感器信息表中常见的术语,并练习从实际的传感器数据表中解读这些术语。

开关

开关是一种只能有两个状态的传感器:开或关。有许多不同类型的开关,它们使用不同的机制工作。例如,有机械开关,当它们被物理按下时,会在开和关之间切换,这可能是由用户、环境中的某个物体或机器人本身触发的。这些机械开关称为碰撞开关(bump switch)或有时称为限位开关。我展示的这种开关通常有三个接点,其中一个接点会标注为 “公共”(common)或 “COM”;另一个接点标注为 “NO”,表示“常开(Normally Open)”;第三个接点标注为 “NC”,表示“常闭(Normally Close)”。

图片

假设你将公共接点连接到控制电源,然后将常开接点连接到一个数字输入引脚,将常闭接点连接到另一个数字输入引脚。当开关未被按下时,常闭引脚会显示高电平,而常开引脚会显示低电平。当开关被按下时,状态会反转:常闭会显示低电平,常开会显示高电平。

按钮开关

按钮开关(button switch)是这种开关的简化版本,它只有两个引脚,一个是公共接点,另一个是常开接点。如果是四个引脚的版本,长边的两个引脚是接通的。

使用Arduino建立以下连线:开关的一个引脚接5V电源,另外一个引脚接到板子上2号引脚用来读取开关的高低电平,同时经过一个下拉电阻(pull-down resistor)接地。LED的引脚为3。下拉电阻的作用是确保当未按下按钮时,输入引脚读取明确的低位(0)状态。

图片

代码如下:

// constants won't change. They're used here to set pin numbers:
const int buttonPin = 2;  // the number of the pushbutton pin
const int ledPin = 3;    // the number of the LED pin

// variables will change:
int buttonState = 0;  // variable for reading the pushbutton status

void setup() {
  // initialize the LED pin as an output:
  pinMode(ledPin, OUTPUT);
  // initialize the pushbutton pin as an input:
  pinMode(buttonPin, INPUT);
}

void loop() {
  // read the state of the pushbutton value:
  buttonState = digitalRead(buttonPin);

  // check if the pushbutton is pressed. If it is, the buttonState is HIGH:
  if (buttonState == HIGH) {
    // turn LED on:
    digitalWrite(ledPin, HIGH);
  } else {
    // turn LED off:
    digitalWrite(ledPin, LOW);
  }
}

按下按钮时,Arduino读到开关输出的高电平,LED点亮。松开按钮,LED熄灭。

图片

其他类型

我们刚刚学习了如何接线和读取机械开关,但实际上还有许多其他类型的开关。其中一种常见类型是霍尔开关(hall switch),霍尔开关不是通过物理压力触发,而是通过磁场的存在来触发。碰撞开关和霍尔开关都常用于制造设备的归零过程中。机器通常会设置为朝一个方向移动,直到开关被触发,然后停止并将当前位置记为零位置。如果你使用霍尔开关,通常将它放在运动的一个侧面,而将磁铁放在运动的另一侧。

还有一种常见的开关叫做干簧管开关(reed switch),它的结构非常简单。干簧管开关由一个玻璃管和一块薄金属片组成,当磁铁靠近时,金属片会弯曲并触碰到另一端,关闭电路。干簧管开关曾经很常见,但它有一些问题,比如在金属片触碰到接点时会出现抖动,导致开关在最终关闭之前快速开关多次。随着时间的推移,干簧片可能会磨损或断裂,因此霍尔开关在新系统中变得更为普遍。