1. 前言
最近使用esp8266进行远程遥控时, 但是在驱动舵机servo库的过程中出现了esp8266 自动重启问题, 具体表现为串口助手不断输出错误信息,如下。
--------------- CUT HERE FOR EXCEPTION DECODER --------------- Soft WDT reset >>>stack>>> ctx: cont sp: 3ffffce0 end: 3fffffc0 offset: 01a0 3ffffe80: 00000002 40105a43 00000001 60000200 3ffffe90: 00000002 4000410f 00001001 00000205 3ffffea0: 3fffc718 40004a3c 000003fb 00000001
2. 分析问题
2.1 长时间没有喂狗
显然是由于长时间没有喂狗导致的看门狗复位, 原因是在loop函数中长时间执行函数,没有延时函数delay,
2.2 delayMicroseconds 函数触发
注意的是 delay 函数和 delayMicroseconds 函数之间的区别, 长时间执行 delay 函数不会出现复位, 但是长时间执行 delayMicroseconds 函数则会导致复位
delayMicroseconds(1000); servo.write(90);//舵机驱动自带delayMicroseconds操作
由于远程控制中含有Ticker定时器与`delayMicroseconds``冲突
Ticker是ESP32 arduino的自带库,可以设置以固定时间间隔反复执行某个任务,特别适合以固定频率从传感器收集数据。
官方解释:Arduino Ticker 库允许您轻松创建 Ticker 回调,这些回调可以在预定的时间间隔内调用函数。您可以更改回调的重复次数,如果重复为 0,则代码以无限模式运行。工作方式类似于“线程”,必要时将运行辅助函数。该库不使用硬件计时器的中断,并使用micros() / millis()函数。您(实际上)不受股票代码数量的限制。
3. 解决问题
3.1 解决长时间没有喂狗
所以添加了喂狗函数或者delay函数,如下
ESP.wdtFeed(); delay(100);//延时100ms
3.2 解决delayMicroseconds 函数触发
解决delayMicroseconds 函数问题关键在于替代方法,delay 函数内部有喂狗机制, 而 delayMicroseconds 没有这个机制,自己写一个servo驱动函数,具体可见Arduino与SG90舵机握手
/* int servopin 是端口号 int myangle 目标位置0~180度,此函数不精确,只有4分度-90 -45 45 90 int loops 循环次数,响应时间 */ void servopulse(int servopin, int myangle, int loops) /*定义一个脉冲函数,用来模拟方式产生PWM值*/ { for (int i = 0; i <= loops; i++) //给予舵机足够的时间让它转到指定角度 { int pulsewidth = (myangle * 11) + 500; //将角度转化为500-2480 的脉宽值 digitalWrite(servopin, HIGH); //将舵机接口电平置高 delay(pulsewidth / 1000); //延时脉宽值的微秒数 digitalWrite(servopin, LOW); //将舵机接口电平置低 delay(20 - pulsewidth / 1000); //延时周期内剩余时间 } delay(1); }
3.3 设置定义域
采用舵机的attach函数定义时,设定范围就可解决
servo_R.attach(D5,500,2500);
4. 小结
🥳🥳🥳通过对这篇文章我们掌握了关于eps8266自动重启 Soft WDT reset问题解决,接下来会有许多有趣的实验,尝试与Arduino通讯做语音小车,进而丰富我们的生活。🛹🛹🛹从而实现对外部世界进行感知,充分认识这个有机与无机的环境,🥳🥳🥳科学地合理地进行创作和发挥效益,然后为人类社会发展贡献一点微薄之力。🤣🤣🤣