Arduino案例实战(卷Ⅳ)
上QQ阅读APP看书,第一时间看更新

3.5 故障及问题分析

问题1:最开始使用L298N模块时,接线后Arduino开发板给出信号,但电机无法转动并且无任何反应。

解决方案:L298N有4个输入端口,2对电机输出端口,4个电压输入口,其中L298N的低电压应与Arduino开发板的低端相连作为参考地,这样Arduino开发板可实现有效控制。

问题2:舵机对红外反射模块的位置变化没有反应,但反射模块显示已经检测到信号,而且有正常的位置变化反馈。

解决方案:利用Arduino IDE自带的串口调试窗口接收红外反射模块的传感信息,调试发现,无法接收到对应传感器返回的数值。检查红外反射模块部分的代码发现是使用错误,应当先设置好各个接口的pinMode(3,INPUT),再设置对应端口读取num1=digitalRead(3),再次调试时获得了正确结果,问题得以解决。

问题3:电机沿线直行能力很差,总是走出黑线之外。

解决方案:在多次代码编译后发现,电机在给的电压较低时,利用PWM调速,如果值设置得比较小,左右两轮的微小不同导致速度的显著差异。因此,换成了大扭力360°舵机替代电机。它有自带的PWN调速端,而且在速度较低时也很稳定,差异性不大,能实现较稳定的循线。

问题4:循线时发现机器人总是处于调整的状态,走直线的效率很低。

解决方案:仔细观察后发现,在相同的值下,左轮的舵机比右轮的舵机速度快,因此适当提高右轮的PWN值、降低左轮的PWN值,问题得以解决。

问题5:机器人识别路口和对黑线的情况判断能力很差,总是判断出错。

解决方案:在上网查找资料和咨询后发现,若如图3-17左侧所示一字排开的布置方法,容易使各个传感器之间互相影响,从而可能会导致错误的值。因此在考虑后改成1、5传感器在前,而2、3、4传感器在后。这样巡线能力虽然提高了,但是之前设置的各种代码里的判断却又出现错误。因此,最终将各个传感器的布置改为如图3-17右侧所示的箭头结构,得到了改善,各个路口以及一定程度上的曲线都能很好地判断并跟随,因此结构的布置相当重要。

问题6:在机器人转弯后总是会触发倒车的判断,使得走出线外,降低效率。

解决方案:在代码中,一旦5个传感器均未检测到黑线就会触发倒车的判断,而理论上5个传感器不会同时出现未检测到的现象。经检查小车红外反射传感器后发现,由于小车的结构比较大,在布置传感器时,各个传感器之间的距离比较大,甚至可以容下黑线。因此,在转弯后由于角度比较大,使得各个传感器之间无法很好地衔接起来。但是由于小车的结构比较固定,改动传感器的位置不太现实。因此,加粗了黑线,由1条变为2条。重新烧录代码,略微调整位置后,成功实现功能,并且不会出现触发倒车的失误现象。

图3-17 箭头结构图

问题7:在未到达终点前就做出停止的判断,并且在死路的情况下,掉头不流畅。

解决方案:在代码中,做出路口判断的函数中有一个one_step的功能函数,意思是在1、5传感器探测到黑线后,向前走一小步,然后再进一步判断。因为在调整上个问题时把黑线的长度变粗了,one_step函数的时间设置短,因此,还没走过路口时就已经判断结束了。将时间适当调长后,对各种路口和终点判断成功,在死路的情况下,掉头流畅。

问题8:在编译ESP8266的代码时,总是提示函数无定义。

解决方案:仔细检查代码后发现,代码结构有问题,因为实现的功能中需要if结构和嵌套结构的地方很多,各种括号使用的次数比较多,结构有些复杂。写代码时错把状态判断函数写在了“{}”外,从而函数无声明。在调整位置后,编译通过。

问题9:想要通过远程控制机器人功能的切换,但是在遥控时却无法成功。

解决方案:因为实现巡线功能的代码需要在loop()函数中实现,但WiFi模块切换功能的代码却是在外声明的一个函数,而且每接收一次信号只工作一次。因此,设置了一个全局变量,在loop()函数中加入一个if结构,当接收到切换功能的命令时将全局变量改为1,使得巡线功能正确实现。

问题10:在使用ESP8266进行透传设置时,再输入指令后经常无反馈。

解决方案:操作时忘记勾选发送新行,勾选之后,可正常发送指令。

问题11:代码编译错误,提示找不到端口。

解决方案:在Arduino IDE的工具中有相应选项,不同的开发板往往有不同的接口。需要手动切换,否则会报错,更改后,代码正常,编译通过。