ARTICLE DETAIL

资讯详情

深耕编程入门与网站建设的一线实战洞察。

IoT-For-Beginners 第3课精讲:传感器与执行器——为物联网设备打通物理世界并构建智能夜灯

IoT-For-Beginners 第3课精讲:传感器与执行器——为物联网设备打通物理世界并构建智能夜灯 IoT-For-Beginners 第3课精讲传感器与执行器——为物联网设备打通物理世界并构建智能夜灯【免费下载链接】IoT-For-Beginners12 Weeks, 24 Lessons, IoT for All!项目地址: https://gitcode.com/GitHub_Trending/io/IoT-For-Beginners本课是微软开源课程 IoT-For-Beginners12 周、24 课第 1 周的第 3 课围绕物联网设备的两个核心概念——**传感器Sensor与执行器Actuator**展开传感器负责感知物理世界并转化为电信号执行器则把电信号转化回物理动作。课程不仅讲解模拟/数字信号、ADC/DAC、PWM 等底层原理还会引导你动手把光传感器接入 IoT 设备再用 LED 依据环境光强自动亮灭最终组装出一台完整的智能夜灯。课程背景与动手目标本课属于 IoT-For-Beginners 课程体系中的1-getting-started入门模块其主文档位于 1-getting-started/lessons/3-sensors-and-actuators/README.md。本课将介绍两个对 IoT 设备至关重要的概念传感器Sensors感知物理世界的硬件将温度、光照、运动等物理量转换为 IoT 设备可解释的电信号执行器Actuators与传感器相反把来自 IoT 设备的电信号转化为与物理世界的交互如发光、发声、驱动电机。动手部分分两步走给 IoT 设备加装一个光传感器再加装一个由光强控制的LED环境光线过暗时 LED 自动点亮——这就是一个完整的智能夜灯nightlight。什么是传感器传感器是感知物理世界的硬件设备——它们测量周围环境的一种或多种属性并将信息发送给 IoT 设备。由于可测量的物理量种类繁多传感器的品类也极为丰富从空气温度这类自然属性到运动这类物理交互无所不包。常见的传感器包括温度传感器感知空气温度或所浸入物体的温度。对爱好者和开发者而言温度传感器常与气压、湿度传感器集成在同一器件中按钮Button感知何时被按下光传感器检测光照水平可针对特定颜色、紫外光UV、红外光IR或通用可见光相机通过拍照或流式传输视频感知世界的视觉表征加速度计感知多个方向上的运动麦克风感知声音既可以是通用的声级也可以是定向声音。所有传感器都有一个共同点把它们感知到的物理量转换为一种能被 IoT 设备解释的电信号。这个电信号如何被解释取决于传感器本身以及它与 IoT 设备通信所使用的通信协议。动手思考不妨调研一下你的手机里都内置了哪些传感器使用传感器接入光传感器的三种硬件路径要上手体验传感器课程针对三类主流 IoT 硬件提供了三条可选的实操路径分别对应三个独立的分步指南硬件平台指南Arduino — Wio Terminalwio-terminal-sensor.md单板计算机 — Raspberry Pipi-sensor.md单板计算机 — 虚拟设备CounterFitvirtual-device-sensor.md三条路径的核心硬件都是光传感器在真实设备中它通常是一颗将光能转换为电信号的光电二极管photodiode。这是一个模拟传感器输出一个表示相对光强的整数值该数值不映射到 lux 之类的任何标准计量单位。Raspberry Pi 路径硬件连接以 Raspberry Pi 为例详见 pi-sensor.md将 Grove 线缆的一端插入光传感器模块的插座只有一种插入方向在 Raspberry Pi断电状态下将 Grove 线缆另一端连接到 Pi 上 Grove Base hat 的模拟插座 A0GPIO 引脚相邻一排插座中右数第二个。编程读取光强仓库在code-sensor目录下为三种平台提供了完整可运行的示例代码。Raspberry Pi / 虚拟设备Python见 code-sensor/pi/nightlight/app.py 与 code-sensor/virtual-device/nightlight/app.pyimport time from grove.grove_light_sensor_v1_2 import GroveLightSensor light_sensor GroveLightSensor(0) while True: light light_sensor.light print(Light level:, light) time.sleep(1)GroveLightSensor(0)创建光传感器实例参数0表示传感器所连接的 Grove 引脚Pi 上是A0虚拟设备中是 CounterFit 的 Pin 0light_sensor.light属性从引脚读取模拟量在 Pi 上其取值范围为01,023循环末尾的time.sleep(1)让设备每秒采样一次——光强无需连续轮询休眠还能降低设备功耗。在虚拟设备路径virtual-device-sensor.md中还需要在 CounterFit 应用中手工创建一个Light类型、Pin为 0 的传感器然后通过Set按钮设定具体Value或勾选Random并设定Min/Max来模拟随机光照。运行python3 app.py后控制台会持续打印光强(.venv) ➜ GroveTest python3 app.py Light level: 143 Light level: 244 Light level: 246 Light level: 253Wio TerminalArduino C见 code-sensor/wio-terminal/nightlight/src/main.cpp#include Arduino.h void setup() { Serial.begin(9600); while (!Serial) ; // Wait for Serial to be ready delay(1000); pinMode(WIO_LIGHT, INPUT); } void loop() { int light analogRead(WIO_LIGHT); Serial.print(Light value: ); Serial.println(light); delay(1000); }这里用pinMode(WIO_LIGHT, INPUT)把板载光敏电阻引脚配置为输入并在loop()中通过analogRead(WIO_LIGHT)读取模拟值——这正是文档中提到的 Arduino 侧analogRead调用的真实落地。对应工程配置见 code-sensor/wio-terminal/nightlight/platformio.ini基于 PlatformIO 的seeed_wio_terminal板卡与 Arduino 框架。传感器类型模拟与数字传感器按输出信号可分为模拟传感器和数字传感器两大类两者的信号链路完全不同。模拟传感器最基本的传感器多为模拟传感器它们从 IoT 设备获得一个电压传感器内部元器件对这个电压进行调整IoT 设备再测量传感器返回的电压从而得到传感器读数。背景知识——电压电压衡量的是把电能从一个地方推到另一个地方的推力大小例如从电池正极推到负极。一节标准 AA 电池为 1.5VV 是伏特的符号不同电气硬件需要不同电压工作例如 LED 在 23V 即可点亮而一只 100W 白炽灯泡则需要 240V。最典型的例子是电位器potentiometer——一种可在两个位置之间旋转的旋钮式可变电阻传感器读取的就是旋转量。IoT 设备向电位器发送一个固定电压信号如 5V。当旋钮转动时电位器会改变另一侧输出的电压如果把电位器想象成一台功放上从 0 到 11 的音量旋钮那么完全关闭0时输出 0V完全打开11时输出 5V。传感器输出的电压被 IoT 设备读取后设备即可据此响应。具体到不同传感器该电压可能是一个任意值也可能映射到标准物理单位。例如基于**热敏电阻thermistor**的模拟温度传感器其电阻会随温度变化输出电压经过代码中的计算即可换算为开尔文温度再对应转换为 °C 或 °F。模数转换ADCIoT 设备本质上是数字设备——只能处理 0 和 1无法直接处理模拟值。因此模拟传感器的值在参与运算前必须先转换为数字信号。许多 IoT 设备内置**模数转换器ADC, Analog-to-Digital Converter来完成这一转换传感器也可以通过连接板connector board**上的 ADC 接入。例如在 Seeed Grove 生态与 Raspberry Pi 的组合中模拟传感器接到 Raspberry Pi 上方 Grove Base hat 的指定端口该 hat 自带 ADC把电压转换为可由 Pi 的 GPIO 引脚读出的数字信号。书中给出了一个非常直观的计算实例假设一个工作电压为 3.3V 的 IoT 设备上接了一只模拟光传感器它返回 1V 电压。1V 在数字世界里没有意义需要被换算以 Seeed Grove 光传感器为例它输出的模拟值范围为01,023在 3.3V 供电下1V 输出对应数值300。IoT 设备同样无法直接处理 300 这个模拟值于是 Grove hat 会把它转换成 300 的二进制表示0000000100101100再交由 IoT 设备处理。从编程视角看这类转换通常由传感器自带的库完成开发者不必手工处理。比如 Grove 光传感器Python 侧调用light属性即可Arduino 侧调用analogRead即可拿到 300 这个数值——这正是上文两个示例程序所展示的真实用法。数字传感器数字传感器与模拟传感器一样通过电压变化探测周围世界区别在于它们直接输出数字信号要么只测量开/关两种状态要么内置 ADC 完成转换。为了避免在连接板或设备上额外使用 ADC数字传感器正变得越来越普及。最简单的数字传感器是按钮或开关——一个只有开、关两种状态的传感器。GPIO 之类的引脚可以直接把该信号读为 0 或 1发送电压与返回电压相同时读到 1否则读到 0无需任何信号转换。提示电压永远不会绝对精确传感器内部元器件总有电阻因此通常存在容差。例如 Raspberry Pi 的 GPIO 引脚工作在 3.3V返回信号高于 1.8V 时读作 1低于 1.8V 时读作 0。对照验证3.3V 进入按钮按钮断开 → 输出 0V → 读值 03.3V 进入按钮按钮接通 → 输出 3.3V → 读值 1。更高级的数字传感器则先读取模拟值再通过板载 ADC转换为数字信号。例如数字温度传感器依然使用与模拟传感器相同的热电偶并测量热电偶在当前温度下因电阻变化引起的电压变化不同的是它不再返回模拟值交由设备或连接板转换而是由传感器内置的 ADC 直接完成转换再以一串 0 和 1 发送给 IoT 设备——其发送方式与按钮的数字信号一致1 代表满电压0 代表 0V。输出数字数据还让传感器能够变得更复杂、发送更详细的信息甚至为安全敏感场景发送加密数据。例如相机就是一种传感器它捕获图像并以数字数据通常是 JPEG 之类的压缩格式发送给 IoT 设备读取它甚至可以逐帧发送完整图像或压缩视频流实现视频直播。什么是执行器执行器与传感器正好相反它们把来自 IoT 设备的电信号转化为与物理世界的交互例如发光、发声或驱动电机。常见的执行器包括LED通电即发光扬声器根据收到的信号发声从简单的蜂鸣器到能播放音乐的音频扬声器步进电机把信号转换为确定角度的旋转例如把旋钮转动 90°继电器Relay可由电信号控制通断的开关允许 IoT 设备的小电压去控制更大的电压回路屏幕更复杂的执行器在多段显示器上展示信息从简单的 LED 显示屏到高分辨率视频显示器不等。动手思考你的手机里又有哪些执行器使用执行器完成智能夜灯本课的执行器部分是传感器部分的自然延伸用光传感器采集光强再用LED作为执行器在检测到环境光过暗时自动发光构成完整的智能夜灯。控制逻辑的伪代码如下检查光照水平 如果光照 300 点亮 LED 否则 熄灭 LED在 pi-actuator.md 等指南中LED 作为数字执行器接入发送数字值 1 即点亮发送 0 即熄灭。接线时有几个要点LED 是发光二极管只能单向导通必须按正确方向插入——LED 略扁平的一侧是负极端安装时圆边对应模块外侧标有的孔位模块上的旋钮可调节亮度先用小号十字螺丝刀逆时针拧到最大将 Grove 线缆另一端接入 Grove Base hat 的数字插座 D5GPIO 引脚相邻一排左数第二个补充说明所有插座都有唯一引脚编号其中 0、2、4、6 为模拟引脚5、16、18、22、24、26 为数字引脚。夜灯代码实现Raspberry Pi / 虚拟设备Python见 code-actuator/pi/nightlight/app.py 与 code-actuator/virtual-device/nightlight/app.pyimport time from grove.grove_light_sensor_v1_2 import GroveLightSensor from grove.grove_led import GroveLed light_sensor GroveLightSensor(0) led GroveLed(5) while True: light light_sensor.light print(Light level:, light) if light 300: led.on() else: led.off() time.sleep(1)led GroveLed(5)创建连接到数字引脚D5的 LED 实例循环内先读取light值若小于 300调用led.on()向 LED 发送数字值 1点亮否则调用led.off()发送数字值 0熄灭注意if/else必须与print(...)处于同一缩进层级以确保位于while循环内部关于数字值对应关系发送给执行器的数字值 0 即 0V数字值 1 即该设备的最大电压在搭配 Grove 外设的 Raspberry Pi 上这个 1 对应3.3V。虚拟设备版本code-actuator/virtual-device/nightlight/app.py仅把 Grove 库替换为counterfit_shims_grove同名模块并先调用CounterFitConnection.init(127.0.0.1, 5000)连接 CounterFit 服务其余逻辑完全一致。Wio TerminalArduino C见 code-actuator/wio-terminal/nightlight/src/main.cpp#include Arduino.h void setup() { Serial.begin(9600); while (!Serial) ; // Wait for Serial to be ready delay(1000); pinMode(WIO_LIGHT, INPUT); pinMode(D0, OUTPUT); } void loop() { int light analogRead(WIO_LIGHT); Serial.print(Light value: ); Serial.println(light); if (light 300) { digitalWrite(D0, HIGH); } else { digitalWrite(D0, LOW); } delay(1000); }这里把D0配置为OUTPUT用digitalWrite(D0, HIGH/LOW)完成与 Python 版led.on()/off()等价的开关动作——数字执行器在 Arduino 侧的最小实现。运行后遮挡/暴露光传感器即可验证效果光强 ≤ 300 时 LED 点亮光强 300 时 LED 熄灭。如果 LED 不亮请检查其插入方向是否正确、亮度旋钮是否拧到最大。执行器类型模拟与数字与传感器一样执行器也分为模拟执行器和数字执行器。模拟执行器与 DAC模拟执行器接收模拟信号并将其转化为某种交互交互强度随供给电压变化。典型的例子是可调光灯例如家中常见的调光灯具——供给灯泡的电压大小直接决定亮度。与传感器的情况类似IoT 设备本身只处理数字信号而非模拟信号。因此要输出模拟信号IoT 设备需要数模转换器DAC, Digital-to-Analog Converter——要么直接集成在设备上要么位于连接板上——它把设备输出的 0 和 1 转换成执行器可用的模拟电压。脉冲宽度调制PWM把数字信号转化为模拟信号的另一种方案是脉冲宽度调制Pulse-Width ModulationPWM发送大量短促的数字脉冲使其整体效果等效于一个模拟信号。最典型的应用就是电机调速。以 5V 供电的电机为例先向电机发送一个 0.02s 的 5V 高电平脉冲这段时间内电机可转过十分之一圈36°随后 0.02s 发送低电平0V暂停每个开-关周期共 0.04s如此循环。这样每秒就有 25 个 0.02s 的 5V 脉冲驱动电机、随后各跟一个不转动的 0.02s 0V 暂停。每个脉冲让电机转十分之一圈即每秒 2.5 圈。换算公式如下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即用数字信号驱动电机以150 转/分钟rpm旋转。术语卡当 PWM 信号一半时间开启、一半时间关闭时称为50% 占空比duty cycle。占空比按信号处于开启状态的时间占比相对关闭状态来度量。改变脉冲宽度即可改变电机转速仍保持 0.04s 的周期不变把开启脉冲缩短为 0.01s、关闭脉冲拉长到 0.03s每秒脉冲数仍为 25但每个开启脉冲时长减半。半长脉冲只能让电机转二十分之一圈每秒合计 1.25 圈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 把模拟信号反向转换为数字信号双向互通。思考题如何在低转速下保持电机转动平滑你会选用少量长脉冲 长暂停还是大量极短脉冲 极短暂停数字执行器与数字传感器类似数字执行器要么由高/低电压控制两种状态要么内置 DAC 把数字信号转换为模拟信号。最简单的数字执行器就是LED设备发送数字信号 1 时输出高电压点亮 LED发送 0 时电压降到 0V、LED 熄灭。思考题还能想到哪些简单的两态执行器例如电磁阀solenoid——一种可被激活的电磁铁能推动门闩实现门的锁定/解锁。更高级的数字执行器如屏幕要求以特定格式发送数字数据通常都配套有库方便开发者发送正确格式的数据进行控制。课后挑战与作业 挑战前两课的挑战是尽可能多地列出家里、学校或工作场所中的 IoT 设备并判断它们基于微控制器还是单板计算机或两者混合。本课在此基础上更进一步对列出的每一台设备思考它们连接了哪些传感器和执行器每个传感器和执行器的用途是什么。 作业详见 1-getting-started/lessons/3-sensors-and-actuators/assignment.md——分别调研并描述一种可与 IoT 开发套件配合使用的传感器和一种执行器内容包括它做什么、内部使用的电子/硬件、是模拟还是数字、输入或测量的单位与范围。作业附带详细的评价标准Rubric按覆盖完整度分为优秀/合格/待改进三档可作为自查清单。小结本课从物理信号链的底层出发把传感器与执行器讲透传感器把物理世界转为电信号按输出分为模拟如光敏电阻、热敏电阻、电位器与数字如按钮、内置 ADC 的温度传感器、相机模拟值必须经ADC转换如 Grove hat 把 01,023 的读数转为二进制才能被数字设备处理执行器把电信号转回物理动作同样分模拟与数字模拟输出需要DAC或用PWM以脉冲串等效模拟信号如电机 150rpm ↔ 75rpm 调速动手项目智能夜灯把两者串成完整闭环light 300时点亮 LED否则熄灭三种硬件平台Wio Terminal、Raspberry Pi、CounterFit 虚拟设备均有可直接运行的源码与分步指南。要深入实践可直接对照仓库中的 code-sensor 与 code-actuator 目录下的完整代码以及 pi-sensor.md、pi-actuator.md、virtual-device-sensor.md、virtual-device-actuator.md、wio-terminal-sensor.md、wio-terminal-actuator.md 等分平台指南亲手完成你的第一台传感器-执行器闭环 IoT 应用。【免费下载链接】IoT-For-Beginners12 Weeks, 24 Lessons, IoT for All!项目地址: https://gitcode.com/GitHub_Trending/io/IoT-For-Beginners创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表