物联网技术开发实战-ESP32+Arduino-MicroPython 课件 第2章 赋予智能节点“五官”与“手脚”基础感知与控制_第1页
物联网技术开发实战-ESP32+Arduino-MicroPython 课件 第2章 赋予智能节点“五官”与“手脚”基础感知与控制_第2页
物联网技术开发实战-ESP32+Arduino-MicroPython 课件 第2章 赋予智能节点“五官”与“手脚”基础感知与控制_第3页
物联网技术开发实战-ESP32+Arduino-MicroPython 课件 第2章 赋予智能节点“五官”与“手脚”基础感知与控制_第4页
物联网技术开发实战-ESP32+Arduino-MicroPython 课件 第2章 赋予智能节点“五官”与“手脚”基础感知与控制_第5页
已阅读5页,还剩46页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

AloT系统设计与实践

——从感知到边缘智能1第二章赋予智能节点“五官”与“手脚”——基础感知与控制2今天我们要学点啥?302传感器应用开发给设备装上“五官”,探索温度、湿度等环境感知的奥秘。03执行器应用开发从PWM到OLED显示屏,执行器应用实战GPIO控制与PWM电子世界的“开关”与“调光器”,掌握输入输出控制的核心逻辑。0104常见问题及解决方法Q&A:这些坑你可能会踩GPIO:ESP32的“万能手”输入(INPUT):感知外界的“感觉手”负责“拿”取信息,如读取温度、湿度、光线等传感器数据。输出(OUTPUT):执行指令的“行动手”负责“放”出指令,控制LED亮灭、电机转动或继电器开关。进阶变身:多才多艺的“万能手”支持PWM调光、ADC模拟信号读取,以及I2C/SPI等多种通信协议。4

GPIO口:具体怎么用?5数字引脚VS模拟引脚🔢数字引脚像电灯开关(只有开/关),模拟引脚像调光旋钮(可以调节亮度)。用“水龙头”和“调光开关”的类比,3分钟区分清楚。

引脚复用:一专多能的秘密🎭ESP32的GPIO口能“兼职”!同一个引脚既可以当普通I/O接口,又能当I2C/SPI接口,本节将教你查看引脚图,避免“引脚冲突”这个新手坑PWM:像拧水龙头一样控制电流直观类比:智能水龙头普通开关只有全开全关,而PWM如同极快的自动开关,通过高频反复通断来模拟连续调节。核心原理:占空比控制调节一个周期内“开”的时间比例(占空比)。占空比越高,平均电流越大,反之则越小。实际应用:数字模拟连续利用数字信号模拟模拟信号效果,广泛用于调节LED亮度、控制电机转速等场景。6传感器应用开发:光敏电阻核心功能:感知光线的“眼睛”光敏电阻能够实时感知环境光线的强弱变化,就像设备的视觉器官一样,为系统提供视觉输入。工作原理:阻值随光照变化光线越强,电阻越小;光线越弱,电阻越大。ESP32通过检测这个电阻值的变化,即可精准判断环境亮度。实际应用场景自动路灯控制、手机屏幕亮度自动调节、相机自动对焦辅助系统。7光敏数值打印关键代码解析传感器应用开发:光敏电阻光敏传感器.ino#defineD033voidsetup(){//初始化串口通信,设置波特率为9600Serial.begin(9600);//将引脚D0设置为输入模式,并启用内部上拉电阻pinMode(D0,INPUT_PULLUP);}voidloop(){//读取引脚D0的数字输入值,并通过串口打印出来,换行Serial.printf("%d\n",digitalRead(D0));}关键代码解析初始化串口通信初始化串口通信并设置波特率为9600,是通过串口输出数据的基础前提。配置引脚输入模式将D0(33号)引脚配置为输入模式并启用内部上拉电阻,保证引脚电平读取稳定。读取并打印引脚电平读取D0引脚的数字电平值(1/0),并通过串口以整数形式换行打印出来。8传感器应用开发:光敏电阻光敏传感器运行效果Thonny终端输出电路链接示意9传感器应用开发:温湿度传感器核心功能:设备的“皮肤”如同人体皮肤般灵敏,能够同时精准测量环境的温度和湿度,实时反馈环境变化。工作原理:双传感器集成内置热敏电阻(测温度)和电容式传感器(测湿度),将数据打包后通过单总线发送给主控板。典型应用场景广泛应用于家庭天气预报站、智能家居温湿度监控系统以及工业仓库的环境监测。10传感器应用开发:温湿度传感器11安装DHT库管理库搜索并安装温湿度传感器数值读取关键代码解析传感器应用开发:温湿度传感器温湿度传感器.ino#include<DHT.h>#defineDHTPIN22//传感器引脚#defineDHTTYPEDHT11DHTdht(DHTPIN,DHTTYPE);voidsetup(){Serial.begin(115200);//串口初始化dht.begin();//传感器初始化 }voidloop(){floath=dht.readHumidity(),t=dht.readTemperature();if(isnan(h)||isnan(t)){Serial.println("读取失败");delay(3000);return; }Serial.printf("湿度:%.1f%%温度:%.1f°C\n",h,t);delay(3000);//延时控制读取频率}关键代码解析初始化传感器与串口初始化DHT11传感器,完成硬件通信配置。读取温湿度核心逻辑调用DHT库函数分别读取湿度和摄氏度温度,返回浮点型数值。输出数据并延时将温湿度数据通过串口输出。12传感器应用开发:温湿度传感器温湿度传感器运行效果Thonny终端输出电路链接示意13传感器应用开发:超声波传感器核心功能:仿生测距通过发射和接收超声波,模拟蝙蝠的回声定位系统,精确测量与前方障碍物的距离。工作原理:时差计算拥有发射和接收两个“喇叭”。ESP32计算超声波从发射到反射接收的时间差,结合声速(约340m/s),即可算出距离。典型应用场景广泛应用于移动机器人避障、汽车倒车雷达辅助系统,以及手机端的便捷测距APP。14超声波传感器:测距原理深度解析01.发射(Transmit)发射器发出40kHz高频超声波,人耳无法听见。02.传播(Travel)声波以固定速度在空气中传播,约340米/秒(受温度影响)。03.反射(Reflect)遇到障碍物时,声波被反射回来,形成回波。04.接收(Receive)接收器捕捉回波,主控板记录发射到接收的时间差。核心计算逻辑:测时间,算距离距离(d)=(声速(v)×时间差(Δt))/2为什么要除以2?因为超声波从发射到接收走了一个“来回”的路程,计算出的距离需要除以2才能得到实际单程距离。15超声波传感器数值读取关键代码解析超声波传感器:测距原理深度解析超声波传感器.ino#include<SPI.h>#defineTRIG15//触发引脚 #defineECHO2//接收引脚voidsetup(){Serial.begin(9600);pinMode(TRIG,OUTPUT);pinMode(ECHO,INPUT); }voidloop(){//触发超声波发射digitalWrite(TRIG,LOW);delayMicroseconds(2);digitalWrite(TRIG,HIGH);delayMicroseconds(10);digitalWrite(TRIG,LOW);unsignedlongtime=pulseIn(ECHO,HIGH);//计算距离串口输出floatdistance=time*0.034/2;Serial.println(distance); delay(100); }}关键代码解析硬件初始化配置TRIG为输出(发射触发信号)、ECHO为输入(接收回波信号),是测距的硬件基础。触发超声波发射向TRIG引脚发送10微秒高电平脉冲,触发超声波模块发射超声波。计算并输出距离读取回波时间→套用声速公式算距离→串口输出。16传感器应用开发:超声波传感器超声波传感器运行效果Thonny终端输出电路链接示意17传感器应用开发:加速度与陀螺仪传感器18加速度计:感知“推背感”与倾斜原理:模拟弹簧铅锤的惯性偏移,测量线性加速度。应用:手机屏幕自动旋转、计步器、赛车游戏重力感应。陀螺仪:感知“旋转”与角速度原理:利用科里奥利力检测振动质量块偏移,捕捉转动。应用:VR/AR头部追踪、相机光学防抖、无人机姿态稳定。典型应用场景广泛应用于无人机平衡、机器人导航、智能手机体感交互及VR/AR沉浸式体验。MPU6050ADXL345传感器对比:MPU6050vsADXL345MPU6050:全能姿态感知6轴IMU(加速度+陀螺仪)+内置DMP接口:仅I2C|功耗:中等场景:无人机、平衡车、VR头部追踪ADXL345:低功耗加速度计仅3轴加速度计|无内置处理器接口:I2C/SPI|功耗:极低(25μA)场景:计步器、屏幕旋转、低功耗IoT节点选型建议:需完整姿态解算选MPU6050;仅需加速度/倾斜检测且追求低功耗选ADXL345。19姿态解算:互补滤波核心思想:频率互补与信号拼图陀螺仪(Gyro):捕捉高频动态(如快速转动),但低频漂移大。加速度计(Accel):提供低频静态参考(如倾斜角度),但高频易受干扰。三步融合流程1.预测(Predict):利用陀螺仪角速度积分预测姿态。2.修正(Correct):利用加速度计重力方向修正基准。3.融合(Fuse):通过权重系数α加权平均得到最终结果。核心公式与参数α融合角度=α×预测值+(1-α)×参考值α≈1:信任陀螺仪(动态响应快)α≈0:信任加速度计(静态稳定性好)优缺点总结优点:实现简单,计算量极小,实时性高,适合资源受限设备。缺点:参数α固定,无法动态调整,在剧烈运动场景适应性有限。20姿态解算:卡尔曼滤波核心思想:系统状态的最优估计基于系统运动模型(先验知识)与传感器测量值(后验信息),通过概率推断融合,获得最小均方误差的真实状态。工作流程:预测-更新循环1.预测(Predict)利用系统模型预测当前状态(先验估计),并计算预测的不确定性(协方差)。2.更新(Update)计算卡尔曼增益,权衡预测与测量的置信度,修正状态得到最优估计。核心优势理论最优:在高斯噪声下提供最小均方误差估计。自适应强:自动调整增益,适应环境变化。输出丰富:可估计漂移等内部状态。局限性与挑战实现复杂:涉及矩阵运算,对数学基础要求高。计算量大:对硬件性能有一定要求。依赖模型:模型失配会导致滤波发散。典型应用场景适用于对精度要求极高的场合,如工业级无人机定位、机器人SLAM导航、自动驾驶车辆状态估计等。21算法对比:互补滤波vs卡尔曼滤波互补滤波:信号拼图大师计算与实现:复杂度极低,仅需加减乘除,代码量少,易于调试。参数与适应性:仅需调整单一权重系数α,适合资源受限的MCU。典型场景:平衡小车、玩具无人机等入门级项目。卡尔曼滤波:系统观测专家计算与实现:涉及矩阵运算,复杂度高,需理解状态空间模型。参数与适应性:需调优Q/R矩阵,理论最优估计,自适应能力强。典型场景:工业无人机、自动驾驶等高精度专业系统。选型决策建议初学者/算力受限➔选择互补滤波高精度/强适应性➔选择卡尔曼滤波22传感器应用开发:加速度与陀螺仪传感器23安装MPU6050库管理库搜索并安装读取6轴数据.ino读取6轴数据代码示例传感器应用开发:加速度与陀螺仪传感器读取6轴数据.ino#include<Wire.h>//引入Wire库,用于实现I²C通信协议#include<MPU6050.h>//引入MPU6050库MPU6050mpu;//创建MPU6050类的实例voidsetup(){Serial.begin(115200);//初始化串口通信,设置波特率为115200Wire.begin();//初始化I²C通信mpu.initialize();//初始化MPU6050传感器配置if(!mpu.testConnection()){ //检查MPU6050是否成功连接Serial.println("MPU6050连接失败");//如果连接失败,输出错误信息while(true);//进入无限循环,停止程序执行}Serial.println("MPU6050初始化成功");//如果连接成功,输出初始化成功信息}24voidloop(){//合并定义原始数据变量int16_tax,ay,az,gx,gy,gz;mpu.getMotion6(&ax,&ay,&az,&gx,&gy,&gz);//读取MPU6050原始数据//合并转换数据计算(保留中间变量,易读)floataccelX=ax/16384.0,accelY=ay/16384.0,accelZ=az/16384.0;floatgyroX=gx/131.0,gyroY=gy/131.0,gyroZ=gz/131.0;//合并串口打印(1行输出所有数据,格式更简洁)Serial.printf("加速度X:%.2f|加速度Y:%.2f|加速度Z:%.2f|角速度X:%.2f|角速度Y:%.2f|角速度Z:%.2f\n",accelX,accelY,accelZ,gyroX,gyroY,gyroZ);delay(100);//控制输出频率}传感器应用开发:加速度与陀螺仪传感器25加速度与陀螺仪传感器运行效果Thonny终端输出电路链接示意使用互补滤波进行姿态解析.ino使用互补滤波进行姿态解析关键代码示例传感器应用开发:加速度与陀螺仪传感器使用互补滤波进行姿态解析.ino#include<Wire.h>#include<MPU6050.h>MPU6050mpu;constfloatalpha=0.98;//互补滤波器核心参数constfloatdt=0.01;floatanglePitch=0,angleRoll=0;//角度变量voidsetup(){Serial.begin(115200);Wire.begin();mpu.initialize();//【省略:传感器连接检测提示语】if(!mpu.testConnection()){Serial.println("连接失败"); while(true);}//【省略:初始化成功提示语】}26voidloop(){//1.读取并转换传感器数据(核心保留)int16_tax,ay,az,gx,gy,gz;mpu.getMotion6(&ax,&ay,&az,&gx,&gy,&gz);floataccelX=ax/16384.0,accelY=ay/16384.0,accelZ=az/16384.0;floatgyroX=gx/131.0,gyroY=gy/131.0;//2.互补滤波解算角度(核心算法)floatpitchAcc=atan2(accelY,accelZ)*(180/PI);floatrollAcc=atan2(-accelX,sqrt(accelY*accelY+accelZ*accelZ))*(180/PI);anglePitch+=gyroX*dt;angleRoll+=gyroY*dt;anglePitch=alpha*anglePitch+(1-alpha)*pitchAcc;angleRoll=alpha*angleRoll+(1-alpha)*rollAcc;//【省略:多句print拆分,合并为1行格式化输出】Serial.printf("俯仰角:%.2f|滚转角:%.2f\n",anglePitch,angleRoll);delay(dt*1000); }执行器应用开发:PWM呼吸灯什么是PWMPWM(PulseWidthModulation)简称脉宽调制,是利用微处理器的数字输出来对模拟电路进行控制的一种非常有效的技术,广泛应用在测量、通信、工控等方面。利用数字信号快速开关电路,通过改变高/低电平的时间比例,控制输出的“平均”电压。27执行器应用开发:PWM呼吸灯周期(Period)&频率一个完整开关循环的时间。频率为周期的倒数(Hz)。例如:50Hz对应20ms周期。28执行器应用开发:PWM呼吸灯占空比高电平时间占总周期的比例。公式:(高电平时间/周期)×100%。是控制功率的核心指标。29PWM呼吸灯.inoPWM呼吸灯代码示例执行器应用开发:PWM呼吸灯PWM呼吸灯.inoconstintledPin=2;//设置PWM属性//1/20秒,50Hz的频率,20ms的周期,该变量用来存储时钟基准constintfreq=50;//通道(高速通道(0~7)由80MHz时钟驱动,低速通道(8~15)由1MHz时钟驱动。)constintledChannel=0;//分辨率设置为8,就是2的8次方,用256的数值来映射角度。

constintresolution=8;voidsetup(){//配置LEDPWM功能ledcSetup(ledChannel,freq,resolution);//将LEDC通道绑定到指定的GPIO引脚ledcAttachPin(ledPin,ledChannel);}30voidloop(){//逐渐增加LED亮度for(intdutyCycle=0;dutyCycle<=255;dutyCycle++){//通过PWM改变LED亮度ledcWrite(ledChannel,dutyCycle);delay(15);//等待15毫秒}//逐渐减少LED亮度for(intdutyCycle=255;dutyCycle>=0;dutyCycle--){//通过PWM改变LED亮度ledcWrite(ledChannel,dutyCycle);delay(15);//等待15毫秒}}通过改变PWM信号占空比,控制LED亮度循环变化,模拟“呼吸”效果。执行器应用开发:PWM呼吸灯占空比为50占空比为10031注:开发板自带LED灯所连接引脚为D2引脚执行器应用开发:PWM舵机32舵机舵机,也叫伺服电机,在嵌入式开发中,舵机作为一种常见的运动控制组件,具有广泛的应用。其中,SG90舵机以其高效、稳定的性能特点,成为了许多工程师和爱好者的首选,无论是航模、云台、机器人、智能小车中都有它的身影。执行器应用开发:PWM舵机舵机工作原理舵机的控制需要MCU产生一个周期为20ms的脉冲信号,以0.5ms到2.5ms的高电平来控制舵机转动的角度。33舵机.ino舵机转动代码示例执行器应用开发:PWM舵机舵机.ino//PWM核心参数(舵机50Hz频率,8位分辨率,22号引脚)constintpwmFreq=50,pwmChannel=0,pwmResolution=8,servoPin=22;//计算舵机角度对应的PWM占空比intcalculatePwmDuty(intangle){//限制角度范围0-180°angle=constrain(angle,0,180);//0.5ms/2.5ms对应占空比(20ms周期,8位分辨率)floatminDuty=0.5/20*256,maxDuty=2.5/20*256;//计算对应角度的占空比intduty=(int)((maxDuty-minDuty)/180*angle+minDuty);//精简打印输出Serial.printf("Angle:%d,Duty:%d\n",angle,duty);returnduty;}34voidsetup(){Serial.begin(115200);//初始化LEDC通道+绑定引脚ledcSetup(pwmChannel,pwmFreq,pwmResolution);ledcAttachPin(servoPin,pwmChannel);}voidloop(){//舵机从0°到180°,每次转动10°,延时1秒for(intangle=0;angle<=180;angle+=10){ledcWrite(pwmChannel,calculatePwmDuty(angle));delay(1000);}}35PWM舵机运行效果ArduinoIDE终端输出电路链接示意执行器应用开发:PWM舵机技术原理执行器应用开发:OLED显示屏36核心差异:OLEDvsLCD发光方式自发光(独立像素)无需背光模组背光发光(过滤)依赖背光板与液晶层画质表现高对比度/广视角黑色纯净,无拖影对比度低/视角窄黑色不纯,易偏色功耗特性极低功耗黑画面几乎不耗电功耗较高背光常亮,耗电恒定核心驱动:SSD1306芯片分辨率:128x64或128x32像素,点阵式显示通信接口:支持I2C(2线)与SPI(高速)双协议低功耗设计:专为电池供电的便携式设备优化显示工作流程1.初始化配置屏幕参数2.传输数据写入显存(Byte)3.刷新显示控制像素亮灭OLED与ESP32的连接方式执行器应用开发:OLED显示屏37接口选择:I2C协议相比SPI,I2C接口仅需4根线(电源+地+2根信号线),连接更简洁,是本次实验首选方案。核心引脚定义VCC:接3.3V(OLED通常不支持5V)GND:接地SDA:I2C串行数据线SCL:I2C串行时钟线英文字母显示关键代码解析执行器应用开发:OLED显示屏显示HelloWorld.ino#include<Wire.h>#include"SSD1306.h"intoledAddress=0x3C;//定义OLED显示屏的I²C地址intsclPin=22;//定义连接到OLED的SCL引脚intsdaPin=21;//定义连接到OLED的SDA引脚

SSD1306display(oledAddress,sdaPin,sclPin);

voidsetup(){

display.init();//初始化显示屏

display.setFont(ArialMT_Plain_24);//设置字体

//在显示屏上绘制字符串"HelloWorld",从坐标(0,0)开始

display.drawString(0,0,"HelloWorld");

display.display();//将绘制的内容显示到屏幕上}关键代码解析创建OLED对象实例化SSD1306对象,这是后续控制屏幕绘制的核心句柄。屏幕初始化初始化OLED屏幕的硬件和通信参数,是使用屏幕前必须执行的准备步骤。刷新显示内容将缓存中绘制的内容刷新到OLED屏幕上,是让内容真正显示出来的关键步骤。38执行器应用开发:OLED显示屏39OLED显示屏显示效果电路链接示意显示圆圈关键代码解析执行器应用开发:OLED显示屏显示圆圈.inovoidsetup(){//初始化显示屏display.init();//清屏display.clear();//绘制圆圈int16_tcircleX=display.getWidth()/2;int16_tcircleY=display.getHeight()/2;int16_tcircleRadius=20;display.drawCircle(circleX,circleY,circleRadius);//将绘制的内容显示到屏幕上display.display();}关键代码解析屏幕初始化初始化OLED屏幕的硬件和通信参数,是所有屏幕操作的前置必要步骤。绘制居中圆圈基于屏幕宽高计算出的中心点,绘制指定半径的空心圆形轮廓。刷新显示内容将缓存中绘制的圆圈数据同步到物理屏幕,实现图形可视化。40Arduino利用U8g2库实现中文字符显示执行器应用开发:OLED显示屏41内置字模数据U8g2库内置ASCII及GB2312中文字模点阵,无需额外下载。自动点阵转换调用drawStr()函数自动解析字符,底层驱动与屏幕通信透明化。编译自动集成字模数据随代码一起编译进固件,直接下载至ESP32单片机运行。极致开发效率屏蔽底层细节,开发者可专注于业务逻辑实现,快速上手。执行器应用开发:OLED显示屏42安装u8g2库管理库搜索并安装显示汉字.ino显示汉字关键代码示例执行器应用开发:OLED显示屏显示汉字.ino#include<Arduino.h>//引入Arduino核心库#include<U8g2lib.h>//引入U8g2图形库#include<Wire.h>//引入I²C通信库#defineBOARD_I2C_SCL22//定义I²C通信的SCL引脚为22#defineBOARD_I2C_SDA21//定义I²C通信的SDA引脚为21//声明显示欢迎信息的函数voiddisplayWelcome();//创建U8g2对象用于控制OLED显示屏U8G2_SSD1306_128X64_NONAME_F_SW_I2Cu8g2(U8G2_R0,//显示方向为0度/*clock=*/BOARD_I2C_SCL,//时钟线连接到SCL引脚/*data=*/BOARD_I2C_SDA,//数据线连接到SDA引脚/*reset=*/U8X8_PIN_NONE//不使用复位引脚);43//定义显示函数voiddisplayWelcome(){char*str="你好!";//定义要显示的字符串u8g2.clearBuffer();//清除显示屏的缓冲区u8g2.drawUTF8(//将字符串显示在屏幕中央u8g2.getDisplayWidth()/2-u8g2.getUTF8Width(str)/2,//X坐标居中u8g2.getDisplayHeight()/2+u8g2.getMaxCharHeight()/2,//Y坐标居中str//显示的字符串);u8g2.sendBuffer();//发送缓冲区内容到显示屏}voidsetup(){u8g2.setFont(u8g2_font_wqy12_t_gb2312b);//设置字体为中文字体u8g2.begin();//初始化显示屏u8g2.enableUTF8Print();//启用UTF-8打印功能displayWelcome();//调用函数显示}执行器应用开发:OLED显示屏44OLED显示屏显示效果电路链接示意执行器应用开发:OLED显示屏45图像设置上传需要显示的图像显示自定义图像访问https://javl.github.io/image2cpp/,转换图像为字节数组。执行器应用开发

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论