一直想实现无人的避障功能,但是px4源生代码又不支持避障,所以只能自己动手写。避障的基础条件还是获取距离数据,超声波模块就是最熟悉也是最简单的模块了。px4源生代码也支持了几种超声波模块,但是好像支持的几种又比较贵,而且都是用来当做高度使用的,不同的超声波型号都只支持一个模块的连接。总结一下,我写超声波驱动的原因就是1、想实现避障功能;2、现有的支持的超声波模块太贵;3、当前支持的超声波模块不能同时连接多个相同的模块,所以不能实现多个方向的距离探测功能。
在淘宝上买了hc-sr04超声波模块,3块钱一个,贼便宜了。同时还支持pwm,iic和uart三种通信方式,可以顺手练练几种不同通信方式的驱动编写了。
这次先写了基于pwm的驱动程序,相对来说比较简单些,正好可以学习一下怎么单独控制pixhawk飞控的aux引脚。
这里超声波模块的pwm通信方式的原理我就不说了,网上一大堆资料,而且模块的时候卖家也会给详细的资料。
如果写过STM32裸机程序,那么原理就非常简单了。只是在初始化的时候配置引脚为输出模式,然后通过控制引脚电平的高低来实现脉冲的输出。但是由于这是基于操作系统的开发,所以没有裸机开发来得那么直接,需要调用指定的函数实现这两个功能。这两个函数如下所示:
px4_arch_configgpio(gpio);//配置函数
px4_arch_gpiowrite(gpio, false);//写入函数
其中配置函数的的参数gpio是通过gpio = io_timer_channel_get_gpio_output(5);函数获取的。该函数封装了AUX引脚号到对应的stm32引脚的对应关系。
附录一下pixhawk2.4.8的aux引脚到stm32的引脚的对应关系,我觉得这个很有用:
aux_pin stm32_pin timer_ch
fmu_aux1 E14 TIM1_CH4
fmu_aux2 E13 TIM1_CH3
fmu_aux3 E11 TIM1_CH2
fmu_aux4 E9 TIM1_CH1
fmu_aux5 D13 TIM4_CH2
fmu_aux6 D14 TIM4_CH3
io_timer_channel_get_gpio_output(5);函数中的参数是输入的aux_pin的引脚号,但是需要用引脚号减一。这就很鸡肋既然已经封装了,为什么不更直接点,搞了好几天才发现这个问题,改了这个地方才成功。
现在能发送脉冲了,下面就得获取返回的pwm波的宽度了。以前写裸机程序的时候都是用中断来做,然后用计时器来计数。还是因为操作系统的限制,不能直接这么操作。还好,src/driver/pwm_input已经实现了pwm脉冲的计数,所以 只要运行它,就可以直接获取脉冲宽度,不好的是它是固定获取fmu_aux5引脚,通过定时器4来获取脉冲宽度,所以有一定的限制,但是也留下了可操作的空间。
现在发送和接受脉冲都有了,只要通电运行就行了。这里我还遇到了问题,直接将超声波模块的vcc和gnd接到了aux引脚的+和-引脚,没反应,一直以为是程序错误,后来用iic引脚的供电vcc和gnd进行供电,终于成功了。遇到相似情况的注意一下供电问题,应该是电压不够。
下面附上我写的代码:主要是借用了src/drivers/distance_sensor/ll40ls_pwm的框架
//这是sr04头文件sr04.h
#pragma once
#include <px4_platform_common/px4_work_queue/ScheduledWorkItem.hpp>
#include <uORB/topics/pwm_input.h>
#include <uORB/Subscription.hpp>
#include <board_config.h>
#include <drivers/device/device.h>
#include <lib/drivers/rangefinder/PX4Rangefinder.hpp>
#include <perf/perf_counter.h>
#include <px4_platform_common/px4_config.h>//添加引脚
using namespace time_literals;
// Device limits
static constexpr float SR04_MIN_DISTANCE{0.05f};
static constexpr float SR04_MAX_DISTANCE{25.00f};
static constexpr float SR04_MAX_DISTANCE_V2{35.00f};
// Normal conversion wait time.
static constexpr uint32_t SR04_CONVERSION_INTERVAL{200_ms};//由于添加了脉冲,所以一点间隔时间
// Maximum time to wait for a conversion to complete.
static constexpr uint32_t SR04_CONVERSION_TIMEOUT{300_ms};//同时调大最大间隔时间
#define DIRECT_PWM_OUTPUT_CHANNELS 6
#if DIRECT_PWM_OUTPUT_CHANNELS >= 6
#define GPIO_VDD_RANGEFINDER_EN_CHAN 5 // use pin 6
#define LIDAR_LITE_PWM_SUPPORTED
class SR04 : public px4::ScheduledWorkItem
{
public:
SR04(const uint8_t rotation = distance_sensor_s::ROTATION_DOWNWARD_FACING);
virtual ~SR04();
int ini
自制PX4超声波避障系统

本文介绍了一种基于PX4飞控平台的超声波避障系统实现方案,作者利用廉价的HC-SR04超声波模块及PWM通信方式,成功实现了近距离障碍物检测功能。
最低0.47元/天 解锁文章
1861

被折叠的 条评论
为什么被折叠?



