# 使用传感器和执行器与物理世界交互 ![本课的手绘笔记概览](../../../../../translated_images/lesson-3.cc3b7b4cd646de598698cce043c0393fd62ef42bac2eaf60e61272cd844250f4.zh.jpg) > 手绘笔记由 [Nitya Narasimhan](https://github.com/nitya) 提供。点击图片查看大图。 本课是 [Microsoft Reactor](https://developer.microsoft.com/reactor/?WT.mc_id=academic-17441-jabenn) 的 [Hello IoT 系列](https://youtube.com/playlist?list=PLmsFUfdnGr3xRts0TIwyaHyQuHaNQcb6-) 的一部分。课程分为两部分:一个小时的课程讲解和一个小时的答疑时间,深入探讨课程内容并解答问题。 [![课程 3:使用传感器和执行器与物理世界交互](https://img.youtube.com/vi/Lqalu1v6aF4/0.jpg)](https://youtu.be/Lqalu1v6aF4) [![课程 3:使用传感器和执行器与物理世界交互 - 答疑时间](https://img.youtube.com/vi/qR3ekcMlLWA/0.jpg)](https://youtu.be/qR3ekcMlLWA) > 🎥 点击上方图片观看视频 ## 课前测验 [课前测验](https://black-meadow-040d15503.1.azurestaticapps.net/quiz/5) ## 简介 本课介绍了 IoT 设备的两个重要概念——传感器和执行器。你将亲自动手操作,向你的 IoT 项目添加一个光传感器,然后根据光线强度控制一个 LED,构建一个简易的夜灯。 本课内容包括: * [什么是传感器?](../../../../../1-getting-started/lessons/3-sensors-and-actuators) * [如何使用传感器](../../../../../1-getting-started/lessons/3-sensors-and-actuators) * [传感器类型](../../../../../1-getting-started/lessons/3-sensors-and-actuators) * [什么是执行器?](../../../../../1-getting-started/lessons/3-sensors-and-actuators) * [如何使用执行器](../../../../../1-getting-started/lessons/3-sensors-and-actuators) * [执行器类型](../../../../../1-getting-started/lessons/3-sensors-and-actuators) ## 什么是传感器? 传感器是感知物理世界的硬件设备——它们测量周围的一个或多个属性,并将信息发送到 IoT 设备。传感器种类繁多,因为可以测量的东西非常多,从自然属性(如空气温度)到物理交互(如运动)。 一些常见的传感器包括: * 温度传感器 - 测量空气温度或其浸入物体的温度。对于爱好者和开发者,这些传感器通常与气压和湿度传感器集成在一起。 * 按钮 - 检测是否被按下。 * 光传感器 - 检测光线强度,可以是特定颜色、紫外线、红外线或普通可见光。 * 摄像头 - 通过拍摄照片或流式视频捕捉世界的视觉表示。 * 加速度计 - 检测多方向的运动。 * 麦克风 - 检测声音,可以是一般的声音强度或方向性声音。 ✅ 做一些研究。你的手机有哪些传感器? 所有传感器都有一个共同点——它们将感知到的内容转换为电信号,供 IoT 设备解读。如何解读这些电信号取决于传感器本身以及与 IoT 设备通信所使用的协议。 ## 如何使用传感器 根据以下相关指南,将传感器添加到你的 IoT 设备中: * [Arduino - Wio Terminal](wio-terminal-sensor.md) * [单板计算机 - Raspberry Pi](pi-sensor.md) * [单板计算机 - 虚拟设备](virtual-device-sensor.md) ## 传感器类型 传感器分为模拟传感器和数字传感器。 ### 模拟传感器 一些最基本的传感器是模拟传感器。这些传感器从 IoT 设备接收电压,传感器组件调整该电压,然后测量传感器返回的电压以获得传感器值。 > 🎓 电压是衡量电流从一个地方流向另一个地方的推动力。例如,标准 AA 电池的电压为 1.5V(V 是伏特的符号),可以以 1.5V 的力从正极推动电流到负极。不同的电子硬件需要不同的电压才能工作,例如,LED 可以在 2-3V 下点亮,而 100W 的灯泡需要 240V。你可以在 [维基百科的电压页面](https://wikipedia.org/wiki/Voltage) 上了解更多关于电压的信息。 一个例子是电位器。这是一个可以在两个位置之间旋转的旋钮,传感器测量旋转角度。 ![一个电位器设置在中间位置,输入 5 伏特,输出 3.8 伏特](../../../../../translated_images/potentiometer.35a348b9ce22f6ec1199ad37d68692d04185456ccbc2541a454bb6698be9f19c.zh.png) IoT 设备会向电位器发送一个电信号,例如 5 伏特(5V)。当调整电位器时,它会改变输出的电压。假设你有一个标有 0 到 [11](https://wikipedia.org/wiki/Up_to_eleven) 的电位器,比如放大器上的音量旋钮。当电位器处于完全关闭位置(0)时,输出为 0V(0 伏特)。当处于完全打开位置(11)时,输出为 5V(5 伏特)。 > 🎓 这是一个简化的描述,你可以在 [维基百科的电位器页面](https://wikipedia.org/wiki/Potentiometer) 上了解更多关于电位器和可变电阻的信息。 传感器输出的电压会被 IoT 设备读取,设备可以根据此值作出响应。根据传感器的不同,这个电压可以是任意值,也可以映射到标准单位。例如,基于 [热敏电阻](https://wikipedia.org/wiki/Thermistor) 的模拟温度传感器会根据温度变化其电阻。输出电压可以通过代码中的计算转换为开尔文温度,并相应地转换为摄氏度或华氏度。 ✅ 如果传感器返回的电压高于输入电压(例如来自外部电源),你认为会发生什么?⛔️ 切勿尝试测试。 #### 模拟到数字转换 IoT 设备是数字化的——它们无法处理模拟值,只能处理 0 和 1。这意味着模拟传感器的值需要在处理之前转换为数字信号。许多 IoT 设备配备了模拟到数字转换器(ADC),用于将模拟输入转换为其数字表示。传感器也可以通过连接板与 ADC 协作。例如,在 Seeed Grove 生态系统中,使用 Raspberry Pi 时,模拟传感器连接到 Pi 上的特定端口,这些端口位于连接到 Pi GPIO 引脚的 '帽子' 上,该帽子具有 ADC,可将电压转换为数字信号并通过 GPIO 引脚发送。 假设你有一个使用 3.3V 的模拟光传感器,返回值为 1V。这个 1V 在数字世界中没有意义,因此需要转换。电压将根据设备和传感器的比例转换为模拟值。例如,Seeed Grove 光传感器的输出值范围为 0 到 1,023。对于运行在 3.3V 的传感器,1V 的输出值为 300。IoT 设备无法处理 300 作为模拟值,因此 Grove '帽子' 会将其转换为 `0000000100101100`,即 300 的二进制表示。然后 IoT 设备会处理这个值。 ✅ 如果你不了解二进制,请做一些研究,学习数字如何用 0 和 1 表示。[BBC Bitesize 的二进制入门课程](https://www.bbc.co.uk/bitesize/guides/zwsbwmn/revision/1) 是一个很好的起点。 从编码的角度来看,这些通常由传感器附带的库处理,因此你不需要自己担心这些转换。例如,对于 Grove 光传感器,你可以使用 Python 库调用 `light` 属性,或者使用 Arduino 库调用 `analogRead` 来获取值 300。 ### 数字传感器 数字传感器与模拟传感器一样,通过电压变化检测周围环境。不同之处在于它们输出数字信号,要么只测量两种状态,要么使用内置的 ADC。为了避免在连接板或 IoT 设备上使用 ADC,数字传感器变得越来越普遍。 最简单的数字传感器是按钮或开关。这是一种只有两种状态的传感器:开或关。 ![一个按钮接收 5 伏特。当未按下时返回 0 伏特,当按下时返回 5 伏特](../../../../../translated_images/button.eadb560b77ac45e56f523d9d8876e40444f63b419e33eb820082d461fa79490b.zh.png) IoT 设备上的引脚(如 GPIO 引脚)可以直接测量此信号为 0 或 1。如果返回的电压与输入电压相同,则读取值为 1,否则读取值为 0。无需转换信号,它只能是 1 或 0。 > 💁 电压从来不是完全精确的,尤其是传感器中的组件会有一些电阻,因此通常会有一个容差。例如,Raspberry Pi 的 GPIO 引脚工作在 3.3V 上,读取高于 1.8V 的返回信号为 1,低于 1.8V 的返回信号为 0。 * 3.3V 输入按钮。按钮未按下,输出 0V,值为 0。 * 3.3V 输入按钮。按钮按下,输出 3.3V,值为 1。 更高级的数字传感器会读取模拟值,然后通过内置的 ADC 转换为数字信号。例如,数字温度传感器仍然会像模拟传感器一样使用热电偶,并测量当前温度下热电偶电阻引起的电压变化。不同的是,它不会返回模拟值,而是通过内置的 ADC 转换为数字信号,并以 0 和 1 的形式发送到 IoT 设备。这些 0 和 1 的发送方式与按钮的数字信号相同,1 表示全电压,0 表示 0V。 ![一个数字温度传感器将模拟读数转换为二进制数据,0 表示 0 伏特,1 表示 5 伏特,然后发送到 IoT 设备](../../../../../translated_images/temperature-as-digital.85004491b977bae1129707df107c0b19fe6fc6374210e9027e04acb34a640c78.zh.png) 发送数字数据使传感器可以变得更复杂,发送更详细的数据,甚至是加密数据以用于安全传感器。例如,摄像头是一种传感器,它捕捉图像并以包含该图像的数字数据形式发送,通常是压缩格式(如 JPEG),供 IoT 设备读取。它甚至可以通过捕捉图像并逐帧发送完整图像或压缩视频流来实现视频流传输。 ## 什么是执行器? 执行器与传感器相反——它们将 IoT 设备的电信号转换为与物理世界的交互,例如发光、发声或驱动电机。 一些常见的执行器包括: * LED - 打开时发光 * 扬声器 - 根据发送的信号发出声音,从简单的蜂鸣器到可以播放音乐的音频扬声器 * 步进电机 - 将信号转换为一定量的旋转,例如旋转 90° 的旋钮 * 继电器 - 通过电信号打开或关闭的开关。它们允许 IoT 设备的小电压控制更大的电压。 * 屏幕 - 更复杂的执行器,用于在多段显示器上显示信息。屏幕从简单的 LED 显示器到高分辨率视频显示器不等。 ✅ 做一些研究。你的手机有哪些执行器? ## 如何使用执行器 根据以下相关指南,将执行器添加到你的 IoT 设备中,并通过传感器控制它,构建一个 IoT 夜灯。它将从光传感器获取光线强度,并使用 LED 作为执行器,在检测到光线强度过低时发光。 ![作业流程图,显示读取和检查光线强度,并控制 LED](../../../../../translated_images/assignment-1-flow.7552a51acb1a5ec858dca6e855cdbb44206434006df8ba3799a25afcdab1665d.zh.png) * [Arduino - Wio Terminal](wio-terminal-actuator.md) * [单板计算机 - Raspberry Pi](pi-actuator.md) * [单板计算机 - 虚拟设备](virtual-device-actuator.md) ## 执行器类型 与传感器类似,执行器分为模拟执行器和数字执行器。 ### 模拟执行器 模拟执行器接收模拟信号并将其转换为某种交互,其中交互会根据提供的电压变化。 一个例子是可调光灯,例如你家中的灯。提供给灯的电压决定了它的亮度。 ![低电压时灯光较暗,高电压时灯光较亮](../../../../../translated_images/dimmable-light.9ceffeb195dec1a849da718b2d71b32c35171ff7dfea9c07bbf82646a67acf6b.zh.png) 与传感器类似,实际的物联网设备使用的是数字信号,而不是模拟信号。这意味着要发送模拟信号,物联网设备需要一个数字到模拟转换器(DAC),可以直接集成在物联网设备上,也可以在连接板上。这将把物联网设备的0和1转换为执行器可以使用的模拟电压。 ✅ 如果物联网设备发送的电压高于执行器能够承受的电压,会发生什么情况? ⛔️ 请勿尝试测试。 #### 脉宽调制 将物联网设备的数字信号转换为模拟信号的另一种方法是脉宽调制。这种方法通过发送大量短数字脉冲来模拟模拟信号的效果。 例如,可以使用PWM来控制电机的速度。 假设你用5V电源控制一个电机。你向电机发送一个短脉冲,将电压切换到高电平(5V)持续0.02秒。在这段时间内,电机可以旋转十分之一圈,或36°。然后信号暂停0.02秒,发送低电平信号(0V)。每个开和关的周期持续0.04秒。然后周期重复。 ![电机以150 RPM旋转的脉宽调制](../../../../../translated_images/pwm-motor-150rpm.83347ac04ca38482bd120939b133803963c9c15ca9d8d484712a4bd92820f6a4.zh.png) 这意味着在一秒钟内,你发送了25个0.02秒的5V脉冲,每个脉冲使电机旋转,随后是0.02秒的0V暂停,电机不旋转。每个脉冲使电机旋转十分之一圈,这意味着电机每秒完成2.5圈。你使用数字信号使电机以每秒2.5圈或150 [每分钟转速](https://wikipedia.org/wiki/Revolutions_per_minute)(一种非标准的旋转速度测量单位)旋转。 ```output 25 pulses per second x 0.1 rotations per pulse = 2.5 rotations per second 2.5 rotations per second x 60 seconds in a minute = 150rpm ``` > 🎓 当PWM信号开启时间和关闭时间各占一半时,这被称为[50%占空比](https://wikipedia.org/wiki/Duty_cycle)。占空比是信号处于开启状态的时间与关闭状态时间的百分比。 ![电机以75 RPM旋转的脉宽调制](../../../../../translated_images/pwm-motor-75rpm.a5e4c939934b6e14fd9e98e4f2c9539d723da2b18f490eae0948dd044d18ff7e.zh.png) 可以通过改变脉冲的大小来调整电机速度。例如,对于同一个电机,可以保持周期时间为0.04秒,将开启脉冲减半为0.01秒,关闭脉冲增加到0.03秒。每秒的脉冲数量(25个)保持不变,但每个开启脉冲的长度减半。一个半长度的脉冲只能使电机旋转二十分之一圈,而每秒25个脉冲将使电机完成1.25圈或75rpm。通过改变数字信号的脉冲速度,你将模拟电机的速度减半。 ```output 25 pulses per second x 0.05 rotations per pulse = 1.25 rotations per second 1.25 rotations per second x 60 seconds in a minute = 75rpm ``` ✅ 如何保持电机在低速时的平稳旋转?你会选择少量长脉冲和长暂停,还是大量非常短的脉冲和非常短的暂停? > 💁 一些传感器也使用PWM将模拟信号转换为数字信号。 > 🎓 你可以在[维基百科的脉宽调制页面](https://wikipedia.org/wiki/Pulse-width_modulation)上阅读更多关于脉宽调制的信息。 ### 数字执行器 数字执行器与数字传感器类似,要么通过高电压或低电压控制两种状态,要么内置DAC,可以将数字信号转换为模拟信号。 一个简单的数字执行器是LED。当设备发送数字信号1时,会发送高电压点亮LED。当发送数字信号0时,电压降至0V,LED熄灭。 ![LED在0伏时熄灭,在5伏时点亮](../../../../../translated_images/led.ec6d94f66676a174ad06d9fa9ea49c2ee89beb18b312d5c6476467c66375b07f.zh.png) ✅ 你能想到其他简单的两状态执行器吗?一个例子是电磁铁,它可以被激活来完成诸如移动门栓锁定/解锁门的任务。 更高级的数字执行器,例如屏幕,需要以特定格式发送数字数据。它们通常附带库,使发送正确数据以控制它们变得更容易。 --- ## 🚀 挑战 上一课的挑战是列出你家里、学校或工作场所中的尽可能多的物联网设备,并判断它们是基于微控制器还是单板计算机,或者两者的混合。 对于你列出的每个设备,它们连接了哪些传感器和执行器?这些设备连接的每个传感器和执行器的用途是什么? ## 课后测验 [课后测验](https://black-meadow-040d15503.1.azurestaticapps.net/quiz/6) ## 复习与自学 * 在 [ThingLearn](http://thinglearn.jenlooper.com/curriculum/) 上阅读关于电力和电路的内容。 * 在 [Seeed Studios 温度传感器指南](https://www.seeedstudio.com/blog/2019/10/14/temperature-sensors-for-arduino-projects/) 上阅读不同类型的温度传感器。 * 在 [维基百科 LED 页面](https://wikipedia.org/wiki/Light-emitting_diode) 上阅读关于LED的内容。 ## 作业 [研究传感器和执行器](assignment.md) **免责声明**: 本文档使用AI翻译服务 [Co-op Translator](https://github.com/Azure/co-op-translator) 进行翻译。尽管我们努力确保翻译的准确性,但请注意,自动翻译可能包含错误或不准确之处。应以原始语言的文档作为权威来源。对于关键信息,建议使用专业人工翻译。因使用本翻译而引起的任何误解或误读,我们概不负责。