版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
初中八年级信息技术《Arduino智能控制——巡线小车的设计与实现(上)》教学设计一、教学素材分析本课依据《义务教育信息科技课程标准(2022年版)》中“信息系统与社会”及“计算思维”核心概念,定位于八年级下学期“开源硬件项目设计”模块第六单元“智能控制系统初探”。教材以ArduinoUno为核心控制器,红外巡线模块为感知单元,L298N驱动直流减速电机为执行单元,构建典型的“感知决策执行”闭环控制系统。素材不仅涵盖模拟量与数字量信号转换、PWM调速原理、差速转向运动学等硬核知识,更蕴含比例控制(P控制)算法的雏形,是连接初中基础编程与高中人工智能、自动控制原理的关键桥梁。从知识体系看,本课向前承接七年级“开源硬件初体验”中的数字读写、模拟读写、库函数调用,向后引领九年级“智能机器人综合实践”中的PID算法完整实现与多传感器融合。教材安排“(上)”“(下)”两课时,“上”课时聚焦硬件拓扑搭建、传感器阈值标定、基础逻辑巡线(非比例控制)与三路/四路红外传感器状态机设计;“下”课时深入比例控制算法、参数整定与弯道优化。拆分意图在于降低认知负荷,让学生在“跑通流程”中建立系统观,再在“优化算法”中深化算法思维。二、学情分析八年级学生已具备C/C++基础语法(变量、循环、判断、函数)、面包板原型搭建经验及基本焊锡操作规范。但针对本课呈现的三大认知障碍需精准施策:1.并行思维缺失:学生习惯单线程顺序执行代码,难以理解“传感器读取逻辑判断电机驱动”在loop()中高频循环并行运行的实时性特征,常导致逻辑阻塞或响应滞后。2.物理量映射模糊:红外接收管输出电压与反射率的非线性关系、PWM占空比与电机转速/扭矩的非线性耦合、车体几何尺寸与差速转弯半径的运动学模型,均为不可见抽象量,学生易陷入“调参玄学”而非“模型推演”。3.工程容错意识薄弱:面对电池电压跌落导致基准电压漂移、车轮打滑、传感器安装高度偏差等物理世界噪声,学生倾向于怪罪代码或硬件损坏,缺乏“软硬件协同调试、冗余设计、异常处理”的工程素养。针对性策略:引入“系统时序图”可视化并行流程;设计“传感器响应曲线实测”环节量化物理映射;设置“故障注入挑战赛”强化工程思维。三、教学目标|维度|目标编码|具体表述|核心素养映射|四、教学重难点重点:三路红外传感器状态编码与对应运动控制逻辑的映射关系;PWM频率与分辨率对低速扭矩的影响;模拟量滤波算法在工程落地中的代码实现。难点:基于误差信号的比例控制(P控制)思想萌芽——从“离散状态硬切换”向“连续误差平滑修正”的认知跨越;多传感器融合时序下的抗干扰逻辑设计(如十字路口、急弯、断线的状态优先级仲裁)。五、教学策略与环境准备策略组合:项目式学习(PBL)驱动全流程,以“设计一辆能稳定通过复杂赛道的巡线小车”为驱动性任务;分组合作学习(4人/组,角色轮换制);支架式教学——提供半成品底盘、接线参考图、核心库函数封装,聚焦算法逻辑与系统集成。软硬件环境:1.硬件:ArduinoUnoR3×1、L298N驱动板×1、TT马达+车轮×2、万向轮×1、四路红外巡线模块(TCRT5000)×1、18650锂电池盒(带开关/电压显示)×1、亚克力底盘、杜邦线、扎带、双面胶。2.软件:ArduinoIDE2.3.2、串口绘图器、自制“巡线调试助手”上位机(Processing编写,支持波形显示、参数动态下发、日志导出)。3.赛道:宽2.5cm黑色胶带铺设的标准赛道(含直道、R=15cm圆弧、直角弯、十字路口、断路段),赛道边缘留白≥30cm。4.评价工具:分析评价量表(含过程性观察指标与终结性作品指标)、学生调试日志模板、小组复盘报告框架。六、教学过程(共4课时,每课时40分钟)第一课时:系统拓扑构建与感知子系统标定【情境导入:从“遥控”到“自主”的跨越】(5分钟)播放30秒视频:工业AGV小车在仓库穿梭、家庭扫地机器人规划路径。提问:“它们与我们上学期做的蓝牙遥控小车本质区别在哪?”引导学生提炼关键词:传感器、自主决策、闭环控制。抛出本单元驱动任务:“设计一辆能自主完成‘八字绕桩+十字路口左转+断路重寻’复合赛道的巡线小车”。展示赛道实物,明确验收标准:单圈≤25秒、零脱线、零人工干预。【硬件拓扑搭建:标准化与容错性】(20分钟)1.拓扑设计讲解(投影展示系统框图):电源域:两节18650串联(7.4V)→L298NVIN/GND→L298N5V输出→ArduinoVin/GND(共地!)。强调:严禁USB供电驱动电机,演示电流不足导致单片机复位现象。控制域:ArduinoD5/D6(PWM)→L298NENA/ENB;D7/D8/D9/D10→L298NIN1IN4;A0A3→四路巡线模块OUT1OUT4;模块VCC/GND接5V/GND。机械域:传感器安装高度1015mm(关键参数),间距略大于赛道宽度(约30mm),前伸出车头20mm(提前量)。2.分组实操:角色分工:硬件工程师主接线,算法工程师核对引脚定义表,测试工程师准备万用表测通断,项目经理计时记录问题。教师巡回重点查验:共地可靠性、PWM引脚对应性(D5/D6为Timer0关联引脚,避免影响delay/millis,建议改用D9/D10即Timer1)、电机极性(先不接码盘,上电观察转向,反则交换OUT1/OUT2)。3.最小系统验证代码(上传观察串口监视器):```cpp//核心引脚定义集中管理,便于移植constuint8_tPIN_IR[4]={A0,A1,A2,A3};//左外、左内、右内、右外constuint8_tPIN_ENA=9,PIN_ENB=10;//PWM引脚(Timer1)constuint8_tPIN_IN1=7,PIN_IN2=8;//左电机constuint8_tPIN_IN3=12,PIN_IN4=13;//右电机(避开D11SPI)voidsetup(){Serial.begin(115200);for(uint8_ti=0;i<4;i++)pinMode(PIN_IR[i],INPUT);pinMode(PIN_ENA,OUTPUT);pinMode(PIN_ENB,OUTPUT);pinMode(PIN_IN1,OUTPUT);pinMode(PIN_IN2,OUTPUT);pinMode(PIN_IN3,OUTPUT);pinMode(PIN_IN4,OUTPUT);motorStop();Serial.println(F("SystemInitOK.ReadingSensors..."));}voidloop(){for(uint8_ti=0;i<4;i++){Serial.print(analogRead(PIN_IR[i]));Serial.print('\t');}Serial.println();delay(50);//20Hz采样,观察稳定性}voidmotorStop(){digitalWrite(PIN_IN1,LOW);digitalWrite(PIN_IN2,LOW);digitalWrite(PIN_IN3,LOW);digitalWrite(PIN_IN4,LOW);analogWrite(PIN_ENA,0);analogWrite(PIN_ENB,0);}```引导学生观察串口绘图器波形:悬空/白纸上数值≈1023(高电平/模拟量高),黑线上数值≈50200。确认硬件通路正常。【感知建模:阈值不是常量,是动态分布】(15分钟)4.现象冲突:让学生把小车放在赛道边缘,观察数值跳变。提问:“用固定阈值500能行吗?”演示环境光变化(手电筒照射/阴影遮挡)导致阈值失效。5.数学建模:引入“动态阈值=(最大值+最小值)/2”概念。讲解启动自标定流程:上电后3秒内,小车原地慢速旋转(左轮后退右轮前进),扫描全视野,记录每路传感器的max/min,计算阈值并存入数组。6.滤波算法导入:原始模拟量抖动±1020。讲解滑动窗口中位值滤波(窗口宽度N=5):•原理:排序取中值,抑制脉冲干扰(如电机电刷火花耦合噪声),相较均值滤波相位滞后更小,更适合边沿检测。•代码实现(环形缓冲区,O(1)插入,O(N)排序,N=5开销可接受):```cppdefineFILTER_N5uint16_tirBuffer[4][FILTER_N];uint8_tirIndex=0;uint16_treadIRFiltered(uint8_tch){irBuffer[ch][irIndex]=analogRead(PIN_IR[ch]);//简单插入排序取中值(N=5极小,无需快排)uint16_tsorted[FILTER_N];memcpy(sorted,irBuffer[ch],sizeof(sorted));for(uint8_ti=1;i<FILTER_N;i++){uint16_tkey=sorted[i];int8_tj=i1;while(j>=0&&sorted[j]>key){sorted[j+1]=sorted[j];j;}sorted[j+1]=key;}returnsorted[FILTER_N/2];//返回中值}voidupdateAllSensors(){for(uint8_ti=0;i<4;i++)filteredVal[i]=readIRFiltered(i);irIndex=(irIndex+1)%FILTER_N;}```7.课堂练习:修改代码,加入自标定逻辑(setup中执行旋转扫描),在loop中调用updateAllSensors,串口输出“原始值滤波值阈值状态(0/1)”,验证滤波效果与阈值自适应能力。第二课时:执行子系统建模与状态机逻辑构建【运动学建模:差速转向的数学本质】(10分钟)在白板推导(学生同步记录笔记):设轮距=L,轮半径=r,左/右轮角速度=ωL/ωR,线速度=vL/vR。质心线速度v=(vL+vR)/2质心角速度ω=(vRvL)/L转弯半径R=v/ω=L×(vR+vL)/(vRvL)工程启示:•直行:vL=vR→ω=0,R=∞•原地旋转:vL=vR→v=0,R=0•差速转弯:vL≠vR且同号→连续曲线,平滑过渡。•PWM映射:analogWrite(0255)并非线性对应转速。低占空比(<60)电机堵转,需测量“启动最小PWM”(PWM_min)。定义速度结构体:```cppstructMotorCmd{int16_tpwmL;int16_tpwmR;};//255~255,负号表示反转constuint8_tPWM_MIN=65;//实测得出voidsetMotor(MotorCmdcmd){//左电机if(cmd.pwmL>=0){digitalWrite(PIN_IN1,HIGH);digitalWrite(PIN_IN2,LOW);}else{digitalWrite(PIN_IN1,LOW);digitalWrite(PIN_IN2,HIGH);cmd.pwmL=cmd.pwmL;}analogWrite(PIN_ENA,constrain(cmd.pwmL,PWM_MIN,255));//右电机(同理)if(cmd.pwmR>=0){digitalWrite(PIN_IN3,HIGH);digitalWrite(PIN_IN4,LOW);}else{digitalWrite(PIN_IN3,LOW);digitalWrite(PIN_IN4,HIGH);cmd.pwmR=cmd.pwmR;}analogWrite(PIN_ENB,constrain(cmd.pwmR,PWM_MIN,255));}```【状态机设计:从“如果…那么…”到“状态动作表”】(20分钟)8.状态抽象:四路传感器组合共16种状态(2^4)。引导学生分组讨论,合并等效状态,绘制状态转移图。重点讨论:•核心状态:`0110`(中间两路压线直行)、`0010/0011`(偏左右转)、`0100/1100`(偏右左转)。•特殊状态:`0000`(全白脱线/十字/断路)、`1111`(全黑十字/终点/横线)。9.动作定义:每个状态对应一个MotorCmd基础动作。引入“基础速度BASE_SPEED=150”,“转向增量TURN_DELTA=50”。10.优先级仲裁:当多状态同时满足(如十字路口瞬间既满足直行又满足转向),谁生效?建立优先级表:P1(最高):`1111`全黑→停车/标记十字/直行通过P2:`0000`全白→脱线处理(依据上一状态反向找线)P3:`1000`/`1100`/`0100`右偏→左转修正P4:`0001`/`0011`/`0010`左偏→右转修正P5(最低):`0110`居中→直行11.代码实现——查表法(StateActionTable):避免冗长ifelse,提升可维护性。```cppenumStateID{S_CENTER=0,S_LEFT1,S_LEFT2,S_LEFT3,S_RIGHT1,S_RIGHT2,S_RIGHT3,S_CROSS,S_LOST,S_NUM};structStateAction{uint8_tpattern;//传感器模式掩码uint8_tmask;//关注位掩码MotorCmdaction;//对应动作uint8_tpriority;//优先级};//状态表核心数据驱动逻辑constStateActionstateTable[S_NUM]={{0b0110,0b1111,{BASE_SPEED,BASE_SPEED},5},//居中{0b0111,0b1111,{BASE_SPEED,BASE_SPEEDTURN_DELTA},4},//微左偏{0b0011,0b1111,{BASE_SPEED+TURN_DELTA,BASE_SPEEDTURN_DELTA},3},//中左偏{0b0001,0b1111,{BASE_SPEED+TURN_DELTA2,BASE_SPEEDTURN_DELTA2},2},//大左偏{0b1110,0b1111,{BASE_SPEEDTURN_DELTA,BASE_SPEED},4},//微右偏{0b1100,0b1111,{BASE_SPEEDTURN_DELTA,BASE_SPEED+TURN_DELTA},3},//中右偏{0b1000,0b1111,{BASE_SPEEDTURN_DELTA2,BASE_SPEED+TURN_DELTA2},2},//大右偏{0b1111,0b1111,{BASE_SPEED,BASE_SPEED},1},//十字/全黑优先级最高强行直行{0b0000,0b1111,{0,0},0}//脱线特殊处理不查表};MotorCmddecideAction(uint8_tsensorState){MotorCmdbestCmd={0,0};uint8_tbestPri=255;for(uint8_ti=0;i<S_NUM;i++){if((sensorState&stateTable[i].mask)==stateTable[i].pattern){if(stateTable[i].priority<bestPri){bestPri=stateTable[i].priority;bestCmd=stateTable[i].action;}}}returnbestCmd;}```12.脱线重寻逻辑(工程难点):引入`lastValidState`变量。正常巡线时更新该变量。进入`0000`状态时,根据`lastValidState`判断线在左还是在右,执行原地大角度旋转找线,设置超时保护(500ms)防止死循环。【集成调试:第一版上车实测】(10分钟)学生烧录完整代码,上赛道测试。预期现象:直道能跑,弯道甩尾或切线,十字路口乱钻,直角弯必翻车。教师不直接给答案,引导填写“调试日志”:现象描述、涉及状态、疑似原因(速度过快/延迟/状态覆盖不全)、尝试修改、结果。第三课时:从离散逻辑到连续控制——比例控制(P控制)思想萌芽【认知冲突:为什么状态机跑不好急弯?】(5分钟)播放高速摄像慢动作:状态机小车进入直角弯,传感器状态`0110`→`0011`→`0001`→`0000`(脱线)。分析:离散状态跳变导致控制量突变,车体惯性未消除已进入下一状态,积累偏差最终脱线。引出核心问题:误差是连续变化的,控制量理应连续变化。【误差定义与计算:把“哪路压线”量化为“偏离中心多少”】(15分钟)13.加权位置算法:赋予四路传感器位置权重:左外=3,左内=1,右内=+1,右外=+3。中心位置为0。误差Error=Σ(权重_i×状态_i)/Σ(状态_i)(状态_i:0或1,压黑线为1)例:`0110`→(1×1+1×1)/2=0(完美居中)`0011`→(1×1+3×1)/2=2(偏右,需左转)`0100`→(1×1)/1=1(偏左,需右转)`1110`→(31+1)/3=1(左外压线,大偏左)14.代码实现:```cppconstint8_tWEIGHT[4]={3,1,1,3};floatcalculateError(uint8_tsensorState){int16_tsumWeight=0;uint8_tcount=0;for(uint8_ti=0;i<4;i++){if(sensorState&(1<<i)){//第i位为1(假设LSB对应左外,需按实际接线调整位序)sumWeight+=WEIGHT[i];count++;}}if(count==0)returnNAN;//脱线标记return(float)sumWeight/count;//归一化误差范围约3.0~+3.0}```15.可视化验证:上位机实时绘制Error曲线。学生观察:直道Error≈0,弯道Error平滑变化,无阶跃跳变。这是P控制的基础。【比例控制器设计:PWM=Base+Kp×Error】(15分钟)16.原理讲解:左轮PWM=BaseSpeed+Kp×Error右轮PWM=BaseSpeedKp×ErrorError>0(线在右侧)→左轮加速、右轮减速→左转修正。符号逻辑自洽。17.参数整定实战(手动整定法/ZieglerNichols简化版):•步骤1:Kp=0,调BaseSpeed使小车能直线跑完全程(约120140)。•步骤2:增大Kp,直到小车在直道上出现持续振荡(左右摆动),记录临界增益Ku,振荡周期Tu。•步骤3:工程经验公式Kp=0.5×Ku(保守稳健)。典型值Ku≈30→Kp≈15。•步骤4:实测弯道,若切线→增大Kp;若振荡/甩尾→减小Kp。18.输出限幅与死区:PWM输出必须限幅在[PWM_MIN,255]。引入死区:|Error|<0.15时Error=0,抑制直道微抖。19.P控制核心代码:```cppfloatKp=15.0;//比例增益,需反复调试int16_tBaseSpeed=130;floatDEAD_ZONE=0.15;voidputePID(floaterror){if(isnan(error)){handleLostLine();return;}if(abs(error)<DEAD_ZONE)error=0;floatcorrection=Kperror;int16_tpwmL=BaseSpeed+correction;int16_tpwmR=BaseSpeedcorrection;setMotor({pwmL,pwmR});}```20.对比实测:同一赛道、同一BaseSpeed,分别跑状态机版与P控制版。记录单圈时间、脱线次数、摆动幅度。学生直观感受:P控制转弯丝滑、无突兀甩头、直道稳如磐石。第四课时:工程化封装、异常处理与项目复盘【模块化重构:面向对象的工程范式】(15分钟)讲解将上述逻辑封装为`LineFollower`类,实现关注点分离。```cppclassLineFollower{private://引脚、缓冲区、阈值、权重、Kp、BaseSpeed、lastError、lastValidState...uint16_treadRaw(uint8_tch);uint16_tfilter(uint8_tch,uint16_tval);voidautoCalibrate();floatputeError();voidhandleLostLine();public:LineFollower(/引脚配置结构体/);voidbegin();//初始化+自标定voidloop();//主循环调用:读传感器>滤波>算误差>PID>驱动电机voidsetParams(floatkp,int16_tbase);//动态调参接口voidemergencyStop();};//主程序极简LineFollowercar(pinsConfig);voidsetup(){car.begin();}voidloop(){car.loop();}```学生动手重构自己的代码,体会“高内聚、低耦合”、配置与逻辑分离带来的可维护性提升。【故障注入挑战赛:工程鲁棒性验证】(15分钟)设置四个“地狱级”测试关卡,每组轮流上阵,其他组观察记录失效模式:21.电压跌落测试:用可调稳压电源给小车供电,从7.4V慢慢降至6.0V(模拟电池亏电),观察基准电压漂移是否导致阈值失效、电机扭矩不足爬不上坡道。考察:电池监测报警、低压补偿逻辑。22.强光干扰测试:高亮手电筒正对传感器照射/侧向扫射。考察:滤波算法有效性、模块遮光罩物理设计。23.赛道破坏测试:胶带翘起、缺口2cm、油污污染。考察:脱线重寻逻辑、状态机容错。24.负载变化测试:小车背负200g砝码跑赛道。考察:PID参数自适应或多套参数切换。教师引导:失败不可怕,关键是能否在日志中定位是“感知失效”、“决策错误”还是“执行无力”,并给出硬件或软件改进方案。【项目复盘与技术文档撰写】(10分钟)每组提交《巡线小车工程档案》(电子版),包含:25.系统框图、原理图、PCB布线图(手绘或立创EDA)。26.核心算法流程图(状态机版vsP控制版对比)。27.关键参数表(阈值分布、PWM_min、BaseSpeed、Kp、滤波窗口)。28.调试日志精华(至少3个典型故障的定位过程)。29.个人心得:从“调参”到“建模”的思维转变、团队协作冲突与解决。教师依据分析评价量表现场打分,重点评价“问题解决过程的证据链”而非仅看最终成绩。七、教学反思与拓展反思要点:1.时间分配:硬件搭建环节易超时,下届预制“快速接线框”减少机械劳动,聚焦逻辑调试。2.P控制讲授深度:部分学生仍将Kp视为“魔法数字”,未建立“修正量=增益×误差”的物理图像。需增加“纸笔模拟计算”环节:给定Error序列,手算PWM输出,绘制修正曲线。3.分层教学:基础薄弱组只跑通状态机即达标;强化组必须实现P控制并完成故障注入挑战;拔尖组尝试引入积分项(I)解决稳态偏差,或微分项(D)抑制超调,预习PID完整形态。拓展延伸:4.学科融合:物理课联动“光电效应、电机原理、圆周运动”;数学课联动“加权平均、分段函数、比例函数图像”;数学建模活动“最优赛道线规划”。5.竞赛衔接:引入“智能汽车竞赛”电磁组/摄像头组规则,展示从红外巡线到电磁巡线、视觉巡线的技术演进路线。6.开源共建:优秀代码上传GitHub/Gitee班级组织,编写README、版本迭代日志,体验开源协作流程。八、附件:核心代码库完整版(供教师参考/学生差异化发放)```cpp/•LineFollowerPro教学版核心库•功能:四路红外自标定、中位值滤波、加权误差计算、P控制、脱线保护、串口调试协议•适用:ArduinoUno/Nano/Mega/include<Arduino.h>//==========用户配置区==========structPinConfig{uint8_tirPins[4]={A0,A1,A2,A3};uint8_tpwmL=9,pwmR=10;uint8_tin1=7,in2=8,in3=12,in4=13;uint8_tledPin=LED_BUILTIN;//状态指示灯};structPIDConfig{floatKp=15.0;int16_tbaseSpeed=130;uint8_tpwmMin=65;floatdeadZone=0.15;uint16_tlostTimeout=500;//ms};//==========核心类==========classLineFollower{private:PinConfigpins;PIDConfigpid;//滤波staticconstuint8_tFILTER_N=5;uint16_tirBuffer[4][FILTER_N];uint8_tbufIdx=0;uint16_tthreshold[4]={512,512,512,512};uint16_tmaxVal[4]={0,0,0,0};uint16_tminVal[4]={1023,1023,1023,1023};boolcalibrated=false;//状态floatlastError=0;int8_tlastValidDir=0;//1左,1右uint32_tlostLineTime=0;//权重表(可按安装位置微调)constint8_tWEIGHT[4]={3,1,1,3};//内部方法uint16_treadRaw(uint8_tch){returnanalogRead(pins.irPins[ch]);}uint16_tmedianFilter(uint8_tch,uint16_tval){irBuffer[ch][bufIdx]=val;uint16_tsorted[FILTER_N];memcpy(sorted,irBuffer[ch],sizeof(sorted));//插入排序for(uint8_ti=1;i<FILTER_N;i++){uint16_tkey=sorted[i];int8_tj=i1;while(j>=0&&sorted[j]>key){sorted[j+1]=sorted[j];j;}sorted[j+1]=key;}returnsorted[FILTER_N/2];}voidreadAllFiltered(uint16_tdst){for(uint8_ti=0;i<4;i++)dst[i]=medianFilter(i,readRaw(i));bufIdx=(bufIdx+1)%FILTER_N;}uint8_tgetSensorState(constuint16_tvals){uint8_tstate=0;for(uint8_ti=0;i<4;i++){if(vals[i]<threshold[i])state|=(1<<i);//黑线为低电平/低数值>置1}returnstate;}floatputeError(uint8_tstate){if(state==0)returnNAN;int16_tsumW=0;uint8_tcnt=0;for(uint8_ti=0;i<4;i++){if(state&(1<<i)){sumW+=WEIGHT[i];cnt++;}}lastValidDir=(sumW>=0)?1:1;//记录最后偏向return(float)sumW/cnt;}voiddrive(int16_tpwmL,int16_tpwmR){autosetOne=[](uint8_tinA,uint8_tinB,uint8_tpwmPin,int16_tval){if(val>=0){digitalWrite(inA,HIGH);digitalWrite(inB,LOW);}else{digitalWrite(inA,LOW);digitalWrite(inB,HIGH);val=val;}analogWrite(pwmPin,constrain(val,pid.pwmMin,255));};setOne(pins.in1,pins.in2,pins.pwmL,pwmL);setOne(pins.in3,pins.in4,pins.pwmR,pwmR);}voidautoCalibrate(){digitalWrite(pins.ledPin,HIGH);//标定指示:快闪uint32_tstart=millis();//原地旋转扫描drive(80,80);while(millis()start<3000){uint16_traw[4];readAllFiltered(raw);for(uint8_ti=0;i<4;i++){if(raw[i]>maxVal[i])maxVal[i]=raw[i];if(raw[i]<minVal[i])minVal[i]=raw[i];}delay(10);}drive(0,0);for(uint8_ti=0;i<4;i++){threshold[i]=(maxVal[i]+minVal[i])>>1;//取中值}calibrated=true;digitalWrite(pins.ledPin,LOW);//串口打印标定报告Serial.println(F("===CalibrationDone==="));for(uint8_ti=0;i<4;i++){Serial.print(F("CH"));Serial.print(i);Serial.print(F(":Min="));Serial.print(minVal[i]);Serial.print(F("Max="));Serial.print(maxVal[i]);Serial.print(F("Thresh="));Serial.println(threshold[i]);}}voidhandleLostLine(){if(millis()lostLineTime>pid.lostTimeout){//超时保护:原地大角度扫描drive(lastValidDir120,lastValidDir120);}else{//短时丢线:按最后方向小幅修正drive(pid.baseSpeed0.5lastValidDir,pid.baseSpeed0.5lastValidDir);}}public:LineFollower(PinConfigp,PIDConfigc):pins(p),pid(c){}voidbegin(){pinMode(pins.ledPin,OUTPUT);for(uint8_t
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025-2026学年动力小车大班说课稿
- 脑干疾病的护理常规
- 2025-2026学年单词讲解说课稿
- 2026及未来5年中国汽车4S分销管理系统软件数据监测研究报告
- 开展国际理解教育增进跨文化素养
- 2026年北师大版高中物理光学单元同步练习题及答案
- 2026事业单位工勤技能-天津-天津土建施工人员五级(初级工)历年参考题库含答案详解
- 2026事业单位工勤技能-四川-四川计算机文字录入处理员二级(技师)历年参考题库含答案详解
- 2026事业单位工勤技能-四川-四川印刷工四级(中级工)历年参考题库含答案详解
- 2026事业单位工勤技能-吉林-吉林计算机操作员三级(高级工)历年参考题库含答案详解
- 广东省深圳市宝安区2025-2026学年六年级上学期语文期中学业中段复习试卷(含答案)
- 2026年新高考I卷数学真题
- 硝化企业安全风险隐患排查表(2026年版)
- 销售中的幽默感运用与氛围营造
- 老年人多重用药评估与管理专家共识2026
- 产品质量问题重复出现处理意见建议
- 多伦县北磁科技高性能软磁材料试验线项目环境影响报告书
- 公司财务管理制度及内控流程
- 护士执业注册健康体检表
- 管理学选择题及参考答案要点
- 水利水电工程移民安置验收规程(2025版)
评论
0/150
提交评论