第七届CUIT智能车竞赛(电磁循迹)

本文记录了作者参加第七届CUIT智能车竞赛的经历,重点介绍了硬件配置如STM32、电磁循迹、ADC采集、滤波算法和PID控制。在软件开发方面,详述了电磁杆的改进、ADC采集的实现以及PID算法的应用。此外,还讨论了环岛和三岔路口的检测方法以及干簧管在停车入库中的作用。作者强调了实践学习的重要性,并分享了比赛中的遗憾和教训。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

第七届CUIT智能车竞赛

 

        作为一名大一新生,我和几名队友一起组队参加了CUIT第七届智能车竞赛(四轮组),比赛一共花了大概一个多月的样子,再加上前期对一些东西的提前学习,也算是花了挺长时间的了,现在比赛结束了,我呢在这里对这次比赛及近期的学习做一些总结。

比赛的过程:

         硬件开发:STM32f103C8T6,舵机(MG996R),电机(普通的小黄电机),电机驱动模块(可以自己做,我们用的成品的L298N),电磁杆(可以某宝买,不过我们自己做的),干簧管,基础四轮车模,HC-05蓝牙模块,LM2986降压模块,电池(两节18650电池)

软件开发:

电磁杆循迹

        一辆智能车要跑起来,首先是车的眼睛,我这里呢因为能力有限加上比赛规则的限制,所以采用的是电磁循迹。我们的车的“眼睛”经历了几次改良,最开始是6路电磁循迹,从中间向两边依次是水平、竖直、水平,电磁杆安装完成之后,必须要将智能车摆放在水平道路上,电磁杆的中间位置对齐赛道,使得左右6个电感成对称分布,然后调节每个电感的滑动变阻器,使得左右电感的数据大致相同,这样做就可以在检测弯道的时候,由于对称的两个电感的数值差值不同(或正或负,或大或小),就可以给舵机输出对应的占空比控制舵机转向,从而使小车转弯。

        不过后面由于三岔和环岛的不理想,我们又在中间加了一路电感竖直用以检测,并且将外侧的水平电感换成了八字的,虽然真的很丑,不过很实用,我们的车最后能够实现上述功能,建议第一次做智能车(电磁循迹组)的友友一定要想好如何检测的问题,否则临时加真的很难受,而且还不怎么好看。

ADC采集

        我们用的是STM32F103C8T6板载的12位ADC采集,我们使用的是基于STM32cubemx的HAL库开发,直接配置好使用DMA循环模式采集电压即可,具体配置可见Z小璇的博客:ADC采集,讲解很详细(毕竟我这种菜鸟都能看懂)。然后在实际调车的过程中因为事先没有考虑到使用OLED,所以也就没有留接口,导致调车只能debug,最后在学长的指引下使用了VOFA+,不得不说真的香,两个HC-05蓝牙模块就能使用,还能看到变化是否稳定,所以十分推荐。

电感数值滤波

        对于这一环节我只能说很无奈,找了很久但是并没有找到什么适合的好的滤波算法,其实有个卡尔曼滤波,不过由于自己能力有限还不会,所以最后只能把几种滤波的优势集中在一起,也就是给连续多次采集回来的电压限制一下大小,然后去掉最大最小值,再求平均值。然后使用差比和差(也可以用差比和,只不过差比和差更加稳定)滤波,至于我的那几个参数,读者自行调整。(可以参考:差比和差

 PID算法

        因为比赛车速慢,所以电机并没有使用PID算法,只是对舵机转向使用了PD结合的算法,因为网上的原理很多讲的也比我更加详细所以呢我就不在这过多的赘述,直接上代码!

最后两句可以理解为两侧电机在转向时有一个速度差辅助转向,使转向更加丝滑!

环岛和三岔

        因为前面第一次的电磁杆存在问题,无法成功检测到环岛和三岔路口,所以后面加了一路中路电感,通过判断中路电感的值以及同一时刻八字电感的值共同实现监测,不过最后比赛的时候其实没有加环岛的程序,是智能车太智能了自己跑进去了。

        具体原理就是在环岛中央的时候水平电感的只是最大的,同时中路电感值也相对比较特殊,这时给定一个标志位,然后在环岛的边缘,两个八字电感的差值会变得十分大以此实现入环,出环的话因为缺失标志位,所以可以自动出环。上述方法的问题就是值需要现场测定,容易失误,更好的方法呢我也没有想出来,所以读者有好方法可以告诉一下。

干簧管

        我们用的模块,也有人直接用的干簧管,模块一般的有三条线路,一条VCC(用3.3V,5V皆可,我们用的3.3V),一条GND,还有一条信号线,用于检测电平变化。若没有检测到永磁铁时,处于高电平,检测到永磁铁后处于低电平。程序控制的方式是用一路ADC检测其传回来的值,判断其高低电平,进而执行的用户代码,控制智能车的停止与入库。

        说到这个就很遗憾呢,因为我们自己测试的时候都好好地,结果比赛的时候由于距离太远了,导致没有检测到东西也就没有正常的停车实在是有点遗憾。

总结

        我觉得学习知识最快的方法就是在实践中去学习,就比如这一次的比赛,其实呢这里面的很多东西我们在比赛之前就学习过了,但是因为没有系统的去学习一下,所以呢一直理解的不是特别的透彻,不过通过一个月左右的调车生活,并且经常都是十一点半才回寝室,还会挨宿舍阿姨的唠叨,但是学习东西是真的比枯燥的学习原理快很多,所以呢,如果真的是想学习一个东西并且学好的话,建议呢还是多动手去实践操作,这样子才能学习的更好。

        本文是我的个人理解,如果有不妥当之处,还请大神指点一二!

        

电磁循迹小车在遇到模拟环岛的情况下,主要是依靠传感器检测地面磁场的变化,并结合预先设定好的算法来实现自动绕行。下面是一个简化的思路说明和示例代码框架,帮助理解如何编写程序控制小车完成环岛操作。 --- ### 工作原理 1. **轨迹感知**:利用安装于小车底部的磁敏元件(例如霍尔传感器阵列),实时读取地面上铺设的黑色胶带或其他形式标记物所携带的磁场信号。 2. **决策判断**: - 当检测到单一侧偏离时调整方向回到既定路线; - 若发现连续多次未能获取有效参考值则触发“进入环岛模式”,此时切换至另一套逻辑继续前进直至找到明确指示点结束循环过程恢复常规巡线状态。 3. **速度调节**:为了保证平稳过渡期间避免剧烈晃动或者卡死现象发生,应当合理设置电机驱动功率参数使其适应复杂的动态变化需求。 --- ### 示例伪代码 ```python def follow_track(): while True: left_sensor = read_left_hall() # 获取左侧传感器数值 right_sensor = read_right_hall() # 获取右侧传感器数值 if is_entering_roundabout(left_sensor, right_sensor): handle_roundabout() elif on_course(left_sensor, right_sensor): # 正常巡线状态下 go_straight() else: # 偏离修正 adjust_direction() # 判断是否进入了虚拟环岛区域函数定义省略... def is_entering_roundabout(ls_val, rs_val): pass # 应对环岛内部特殊导航策略的具体实现细节待完善... def handle_roundabout(): print("Entering roundabout mode...") target_exit_found = False while not target_exit_found: move_forward_slowly() current_sensors_data = [read_all_sensors()] if detect_target_exit(current_sensors_data): prepare_to_leave_roundabout() break exit_roundabout_path() ``` 上述仅为基本构思展示并非可以直接运行的标准语法结构,请根据实际硬件配置进一步优化扩展功能模块内容! ---
评论 20
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值