24年电赛——自动行驶小车(H题)完赛感受

前言:

        笔者大二,也算是第一次正式的打电赛省赛(大一电赛的时候还没接触32,校赛的时候就被刷下去了。。。)。经过一年的学习,三天两夜的校赛、两天一夜的七校联赛终于是挺到了省赛。比赛过程中真的是有太多感悟了。于是完赛第二天就赶出了这篇博客。

一、题目描述

        设计一个采用 TI MSPM0 系列 MCU 控制的自动行驶小车,能在指定路径 上自动行驶,行驶场地示意如图所示。场地面积不小于 220cm×120cm。图中 两个对称半圆弧线的半径为 40cm,弧线为黑色,线宽 1.8cm 左右,弧线的四个 顶点分别定义为 A、B、C 和 D 点。建议场地采用白色哑光喷绘布制作。场地除 两个半圆弧外,不得添加任何标记。

        要求 :

        (1)将小车放在位置 A 点,小车能自动行驶到 B 点停车,停车时有声光提 示。用时不大于 15 秒。

        (2)将小车放在位置 A 点,小车能自动行驶到 B 点后,沿半弧线行驶到 C 点,再由 C 点自动行驶到 D 点,最后沿半弧线行驶到 A 点停车,每经过一个点, 声光提示一次。完成一圈用时不大于 30 秒。

        (3)将小车放在位置 A 点,小车能自动行驶到 C 点后,沿半弧线行驶到 B 点,再由 B 点自动行驶到 D 点,最后沿半弧线行驶到 A 点停车。每经过一个点, 声光提示一次。完成一圈用时不大于 40 秒。

        (4)按要求 3 的路径自动行驶 4 圈停车,用时越少越好。

二、重点

        我们的基本思路是,使用 MSPM0G3507 控制小车,红外寻迹(没有灰度),陀螺仪控制方向。难点一个是跑直线,一个是转弯。

        (1)跑直线

        我们开始准备采用编码电机测速,配合 pid 算法调速,使两个轮子的速度维持在一个定值,或者计算两个轮子的差速,用 pid 算法去调节。最终发现,两个轮子的性能不一样,达到恒定速度的时间也不一样。所以我们改用陀螺仪的 yaw 值检测小车的偏航角,然后配合 pid 算法控制小车直行。

        (2)转弯

        转弯肯定是采用陀螺仪,使小车能转固定的角度。

        这两个难点的最终落脚点都停在了陀螺仪身上。

三、陀螺仪的选择

        我们首先想到的肯定是 mpu6050,一款便宜好用的陀螺仪,主要是我们备赛的时候就有移植好的 mpu6050 的代码。但便宜肯定有它便宜的道理,yaw 值的零飘问题十分严重。一秒偏 2°,我还以为有太阳磁暴了。

        幸亏我们实验室有往年学长留下来的财产。我们找到了实验室唯一一个 imu901。正好网上有一篇 imu901 的移植代码,正好它移植的芯片就是 MSPM0G3507 !!!因为它是十轴传感器,可以通过磁力计进行校准,就算是六轴的,它也自带了校准的算法,基本没有零飘问题,于是我们当天就把所有题跑了出来。可是,到了交作品那天早上一点,我们想着优化一下小车结构,最后不小心把 imu901 烧了。。。可以说是没了它我们所有的题都跑不出来了。这个比较冷门的陀螺仪基本别的实验室也没有,我买的要等完赛第二天才能回来。

        然后我们又试了问同学借来的磁力计模块,效果也不是很理想,而且我们没时间去学这个东西。于是我就试着移植我们七校联赛用的 jy60 模块。最终在早上6点多移植成功了,(最后发现是中断服务函数写错了)。虽然效果没 imu901 效果好,但是起码能跑。

四、思路

1、如何判断到达A、B、C、D点:

        开始巡线的点比较容易判断,我们可以以检测到黑线来判断结束直行,转为巡线;但出巡线的点就不能以检测不到黑线来判断了,因为我们用的是两个四路红外,间距比较大,在巡线中也会有很多次检测不到黑线。但我们备赛的时候发现我们跑定距离效果还不错,所以我们检测出巡线的点的方法就是跑过一定的距离并且检测不到黑线,就判断出巡线了。

2、如何跑斜线:

        因为靠陀螺仪很难跑到确定的点上,而且斜着跑不一定能寻到线,所以我们跑一个比较大的角度,跑固定的距离,然后跑直线。

五、 总结

        此次电赛可谓一波三折,先是烧了块 M0 的板子,又是烧了陀螺仪。好在最终是顺利完赛。要我觉得最大的感悟,就是所有东西都要有备份,最后阶段千万不要大改结构!!!

        最最最后,我还要感谢两位队友让我们整个比赛都很轻松快乐,以及我们的指导老师都在背后默默鼓励着我们。

        

根据引用\[1\]和引用\[3\]的内容,智能送药小车使用了5路灰度传感器进行巡线。以下是一个可能的巡线代码示例: ```python #include <PID.h> // 定义灰度传感器引脚 int sensorPin1 = A0; int sensorPin2 = A1; int sensorPin3 = A2; int sensorPin4 = A3; int sensorPin5 = A4; // 定义电机驱动引脚 int motorPin1 = 2; int motorPin2 = 3; int motorPin3 = 4; int motorPin4 = 5; // 定义PID参数 double Kp = 1.0; double Ki = 0.0; double Kd = 0.0; // 定义PID对象 PID pid(&sensorValue, &output, &setpoint, Kp, Ki, Kd, DIRECT); void setup() { // 初始化串口通信 Serial.begin(9600); // 设置灰度传感器引脚为输入模式 pinMode(sensorPin1, INPUT); pinMode(sensorPin2, INPUT); pinMode(sensorPin3, INPUT); pinMode(sensorPin4, INPUT); pinMode(sensorPin5, INPUT); // 设置电机驱动引脚为输出模式 pinMode(motorPin1, OUTPUT); pinMode(motorPin2, OUTPUT); pinMode(motorPin3, OUTPUT); pinMode(motorPin4, OUTPUT); // 设置PID参数 pid.SetMode(AUTOMATIC); pid.SetOutputLimits(-255, 255); // 设置输出范围 } void loop() { // 读取灰度传感器数值 int sensorValue1 = analogRead(sensorPin1); int sensorValue2 = analogRead(sensorPin2); int sensorValue3 = analogRead(sensorPin3); int sensorValue4 = analogRead(sensorPin4); int sensorValue5 = analogRead(sensorPin5); // 计算巡线偏差 int error = (sensorValue1 * 1 + sensorValue2 * 2 + sensorValue3 * 3 + sensorValue4 * 2 + sensorValue5 * 1) / 9; // 设置PID目标值 int setpoint = 0; // 更新PID计算 pid.Compute(); // 根据PID输出控制电机 if (output > 0) { // 左转 analogWrite(motorPin1, 0); analogWrite(motorPin2, abs(output)); analogWrite(motorPin3, 0); analogWrite(motorPin4, abs(output)); } else if (output < 0) { // 右转 analogWrite(motorPin1, abs(output)); analogWrite(motorPin2, 0); analogWrite(motorPin3, abs(output)); analogWrite(motorPin4, 0); } else { // 直行 analogWrite(motorPin1, 0); analogWrite(motorPin2, 0); analogWrite(motorPin3, 0); analogWrite(motorPin4, 0); } } ``` 这段代码使用了PID算法来根据灰度传感器的数值进行巡线控制。根据传感器数值的权重计算出巡线偏差,然后通过PID计算得到控制输出,最后根据输出控制电机的转动方向和速度。请注意,这只是一个示例代码,具体的实现可能需要根据实际情况进行调整和优化。 #### 引用[.reference_title] - *1* *2* *3* [四轮两驱小车(四):STM32驱动5路灰度传感器PID循迹](https://blog.csdn.net/weixin_51651698/article/details/128760449)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control_2,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值