记录一下自己在Pixhawk上添加超声波模块进行定高的过程:
硬件:Pixhawk2.4.8(APM3.5固件)、STM32开发板、几块钱一个的超声波模块
软件:Mission Planner、Keil(STM32编程用)
过程:
1.分析官方给出的各种RangFinder的添加方案和源码,确定使用STM32单片机读取超声波数据,然后以串口方式发送给Pixhawk飞控。
相关源码链接:https://github.com/ArduPilot/ardupilot/tree/master/libraries/AP_RangeFinder
官方给出的传感器添加方式:http://ardupilot.org/copter/docs/common-rangefinder-maxbotixi2c.html
对AP_RangeFinder_LightWareSerial.cpp进行分析:
通过阅读以上代码,可以得出两点信息:
a. 数据以字符串形式发送(单位为m),以回车符‘\r‘结尾;
b.两次数据发送的时间间隔要小于200ms;
2.在Mission Planner中进行相关配置(以下图片为盗用):
首先配置串口,这里我们配置串口4,波特率为115200,协议选择9:Lidar
这里要特别注意,要保证其他的串口协议不为9,否则程序在运行时可能会在其他串口处找数据!
其次对RNGFND相关变量进行配置:
RNGFND_TYPE设为8,因为我们参考的是LightWareSerial的数据包格式;
RNGFND_MIN_CM和RNGFND_MAX_CM是设置超声波的距离范围;
其他几项如下图:
配置完之后,点击右侧Write Param;
3.STM32单片机编程
这里就不再详述,就是配置一个STM32的定时器,输入捕获获取超声波距离值,然后配置一个串口,波特率115200,以字符串形式向外发送数据;
4.接线,测试:
把两个板子的串口连接起来,打开Mission Planner,就可以在State中的sonarrange处看到我们发过去的距离信息
总结:
以上为串口通信方式添加,如果以IIC或AD方式,只要查看源码对应部分的信息即可,IIC方式是把距离值分成高八位和第八位发出去;
网上有人用Arduino连接超声波,然后以IIC方式发出去,也是一样的道理;
(以上图片均为盗用,但自己确实实现了,只是不想再去接线)