前言 本着技术本身的原则,写了这篇博客,为尚未接触嵌入式C编程,和正在学习C编程的同学提供一套完整的智能小车方案和学习思路。 本篇介绍的是纯自主开发的单片机智能小车,不同于网上那些,本篇介绍的是集成了红外循迹,超声波测距,机械臂抓取,蓝牙控制,视频图传在内的一套综合应用方案,代码方案可应用于实际项目。 视频演示:【梦飞智能-多功能机械臂小车-哔哩哔哩】 https://b23.tv/2EvpPYa 1.硬件组成 (1)小车主控采用stm32F030c8t6,主频48M,RAM20KB,flash64KB,ARMcortex-M0内核,引出了3路舵机接口用于控制机械臂,4路PWM用于电机控制,4路GPIO用于循迹传感器连接,以及一个超声波传感器接口和一个串口,主板大小只有5cm x 3.5cm左右,非常小巧美观,四个安装孔设计的可直接安装在舵机云台底部,采用USB供电或者5V电源接口供电。 (2)小车驱动板是梦飞自主开发的双LM2596+RZ7889电源和电机驱动一体化设计,电压输入6-15V,5V输出能力达到3A,电机驱动能力达到5A,(注意这个数据,可查查一般驱动板是什么能力) (3)极简三自由度机械臂,说高级一点这个模块是个机械臂,说简单点就是一个两轴云台+一个爪子,之所以这样做的目的就是方便定位和快速抓取,不用空间逆运算定位物体坐标,对于MCU来讲就是三个PWM控制上下左右和夹取,因此代码实现难度上非常简单,适合初学者。 (4)基于ESP32的视频图传和蓝牙控制方案,这里所讲的是两个模块,ESP32图传模块,以及蓝牙控制模块,ESP32支持HTTP协议获取图传,以及RTSP协议获取图像(这对于学习网络协议非常有意义),蓝牙模块采用串口蓝牙,上位机给蓝牙发送数据,只需串口接收和处理即可 (5)循迹和超声波测距,循迹采用最简单的两路循迹原理,超声波采用市面上最常见的超声波模块,具体不做赘述。 2.软件实现 重点讲解软件实现原理,整套软件代码基于ucosii架构,采用多任务并行的方式实现,可以将上述硬件分成不同的软件模块进行实现。 (1)基础驱动模块 包括PWM驱动,GPIO,串口这些引脚功能配置,将引脚定义全部采用宏定义方式进行统一管理。更改引脚功能只需要修改宏即可,这种方案是单片机架构中最常用的一种引脚处理方式。 (2)多任务划分 将需要实时处理的模块划分成多个任务,目前设计了串口数据处理任务,超声波测距任务,红外循迹处理任务,按键检测任务,LED显示任务等多个并行任务,其中优先级最高的是串口数据处理任务; (3)串口数据处理 处理蓝牙发送的实时串口数据,从而执行对应得动作,由于蓝牙数据可能是持续得,我们不能接收一条处理一条,容易造成数据丢失和混乱,因此这里引入了队列得数据结构,将蓝牙数据保存在队列缓存中,通过中断数据接收存入队列,然后在串口数据处理任务中轮询读取队列和处理,保证数据准确和高效处理。 (4)手动控制自动控制实现 如何让不同得功能顺利切换是一套关键策略,本方案中默认采用手动控制模式,通过手机app操作进行小车前后左右控制和机械臂上下左右控制,然后通过app操作给小车下发自动控制指令进入自动控制模式。MCU接收到串口指令时,先保存当前小车控制状态,这里设计了一套小车控制状态得结构体数据,包括小车运动控制参数和状态控制参数,当状态控制参数处于手动控制模式时,小车响应app控制操作,当状态参数处于自动控制模式时,小车响应自动循迹,自动测距和自动抓取得动作,另外控制模式切换也兼容主板上得按键进行手动切换。 (5)自动循迹和自动抓取实现逻辑 自动循迹和自动抓取在同一任务中进行,使用超声波测距进行目标障碍物检测,若前方没有障碍物则正常循迹,若前方出现障碍物,距离达到可夹取范围时,循迹停止,并控制机械臂向下运动到指定位置,夹取目标后再放置到预定位置,放置完之后再继续循迹。从而实现了自动搬运障碍物得操作。 (6)视频图传和手机app控制 视频图传是基于ESP32-CAM实现,采用arduino编程,通过获取摄像头图像然后使用HTTP协议上传,手机端app开启会自动链接摄像头的ip地址从而获取到视频图像,目前使用VGA分辨率实时传输图像和显示可达到25fps,基本能做到实时显示,app配合蓝牙连接和下发指令可实现不同的功能控制。比如需要控制机械臂可以切换到机械臂控制模式,然后使用控制按钮进行控制。 功能应用场景: 1.视频图传和运动控制,以及手动搬运目标物体 2.自动循迹和自动控制搬运物体到指定位置 3.自动循迹和自动清理垃圾等
|