当前位置:   article > 正文

21年电赛F题送药小车_2021年电赛送药小车地图下载

2021年电赛送药小车地图下载

硬件设计

8路灰度循迹模块

记录一下调试期间,遇到的问题,调试的思路先是屏蔽循迹部分,先让程序中的位置环和速度环的串级pid达到一定的pwm,然后再去调循迹的,循迹部分就是根据8个灰度,如果最左边的三个,检测到,就给一个负的tempout(巡线补偿量),程序中+表示左电机减,右电机加;其他的情况,同理。能巡线即可。在实际中遇到的问题是有一个灰度循迹的灯,无法正常读取,就是实际去测的时候,灯是检测到红线是灭,白的时候是亮,但是单片机就是得不到正常的0,1状态,(用oled显示对应读取引脚即可),在此,希望之后一定要检查传感器能正常工作之后,再去实现逻辑的功能。(后面发现不是传感器的问题)

编码器电机

底层的输出要与原理图上的一一对应,如编码器电机的引脚,TB6612的逻辑引脚(方向),左右PWM的引脚,这是一共(4+4+2),一共10个引脚,在调试过程中,发现,自己使用的板子上集成的左右PWM引脚,与程序中设置的相反(即左逻辑电平,对应右PWM的这种错误的接法),程序是在网上找的一位大佬写的。省去不少的时间。

软件设计

摄像头编程

maixpy,需要用到python的一些知识。
list列表,数据可变,用中括号,逗号隔开数据
tuple,数据不变,用小括号,逗号隔开。只有一个数,需要多加逗号如(1,),与数学运算中的小括号区分。
定义一个函数要使用 def 语句
def power(x):
return x * x
L[0:3] 表示, 从索引 0 开始取, 直到索引 3 为止, 但不包括索引3.即索引0, 1, 2, 正好是3个元素.

FPIOA:引脚映射函数

from fpioa_manager import fm    # 导入库
fm.register(28, fm.fpioa.GPIO0)

  • 1
  • 2
  • 3

点亮一个led(引脚映射,相应的函数调用)

from fpioa_manager import fm
from Maix import GPIO

io_led_red = 13
fm.register(io_led_red, fm.fpioa.GPIO0)

led_r=GPIO(GPIO.GPIO0, GPIO.OUT)
led_r.value(0)

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9

在这里插入图片描述

主函数

用keil编程,主要的思路是1.将底层驱动,gpio初始化,主要是使用定时器3的中断,10ms为周期,触发一次,中断里面有:更新编码器计数脉冲,更新距离;
循迹部分的逻辑;巡线启动执行逻辑;转弯判别逻辑;输出pwm给电机;在主函数里面先判断摄像头接收到的信息,进行匹配;单片机确定数字之后,再判断药物是否装载上了,之后执行路线的主逻辑。

问题总结

遇到的问题一:循迹不能正常,通过oled显示读取的八个循迹灯的状态,发现,第二个灯的状态检测不到,即显示的时钟为0.这会影响单片机里的逻辑执行,导致刚开始的时候始终无法巡线,一直转圈,解决办法:因为程序中是采用了串级pid,我是参考别人的程序,一是巡线补偿量与逻辑上不对,即当左侧检测到黑线时,左电机应减去循迹补偿量,右电机应加上循迹补偿量,使之左转。在实际去检查时,我先是将循迹模块的初始化屏蔽了,但是在中断里面依然会执行循迹的部分,中断里面是直接用readinput函数直接读取,可能屏蔽初始化依然可以读取到状态,于是我在中断里面直接屏蔽所有循迹部分,只留下串级pid给电机的初始量,现在我还不太明白,位置环和速度环串级,当期望值为0时,为啥这个速度依然保持不变,我还在想,假如我不用pid,直接给一个基础量,效果是不是一样,但是后来又发现,在car_tracking和car_spin的函数里面要改变这个期望值,编码器读取到的值即实际值也在变化,这个pid也是起作用了,就是通过pid,这个输出量始终不变,负反馈调节,主要是我是直接拿别人调好的程序,不知道pid是否真的起了左右。在发现仅有pid的调节下,左右电机的输出量一致之后,就发现有一个灯无法检测,刚开始我以为是循迹模块出了问题,结果是板子上有个引脚有问题,因为我通过只连接2号循迹灯,发现在原来的引脚下,确实检测不到,当我换了一个引脚之后,发现就可以正常了,这个问题是我没有想到的,我是直接买的某宝一家平衡车的板子,我问客服,有没有可能虚焊了,但是这个人家也给你说不准,只是说了这个引脚对应在32芯片的那个地方,我只是说有能虚焊,又不是没焊上的问题。
当发现有一个引脚不能用时,于是我只用了六路,因为板子上的引脚不够了,就只能这样子,六路也是可以的。
问题二: 可以循迹,但是距离,延迟时间的参数需要改一下,我是在咸鱼上买的一个方案资料,在我没买这个资料之前,我已经买了一定的元器件,发现这个跟我目前买的最为符合,灰度循迹,摄像头识别,这样子。但不知道这个参数为什么会有如此的差别。基本上是原来的一半,左右转这个时间没有什么差别。现在我对于就是编码器转多少圈,对应多少的速度还没有一个清楚的认识,就是跑远了,距离调小,跑断了,距离调大。
问题三: 1号,2号药房可以实现了(设置好距离思路差不多正确即可实现),中端药房3,4思路不是很清晰,一是小车停车等待的位置,摄像头能否识别到数字,这个是主要的问题。还有思路上的逻辑。
问题四:对于轮子转一圈,编码器应该有多少个脉冲,这个我刚开始是没有亲自去显示看一下的,方法就是主程序里面:将编码器输出的脉冲值(调用定时器的计数函数),用一个变量存储下来,用printf用串口显示(实际操作是,在轮子上选好一个标志,用手转动轮子转一圈,观察一下串口显示的值,与计算值是否相同或相近)。如果相同的话,可以得到速度值,即将编码器的值(需要强行改为浮点型)除以一圈的脉冲数,这个是在定时器周期下得到的速度,如果要求每秒钟的话,需要再转化一下即可。这个是最终得到的是每秒多少圈,一圈根据轮子的半径得到周长。计算公式:假如定时器是10ms为周期,speed=编码器的计数值100一圈的距离/一圈的脉冲数。
问题五:串口显示问题,之前可能学习的时候由于设备短缺,刚学串口的时候,就总是出现各种问题,如出现乱码,一直接收到的为0;这次也是,但是串口显示数据显然是调试过程中非常好的办法,由于我也要用vofa+去调参,而这个也是需要串口的,记得当时用了一天吧,才找出问题来,我由于串口1被占用,用的串口2,串口1和串口2的初始化其实都大差不差,时钟挂载在不同的总线上,这一点我知道,因为代码我现在基本上都是直接是复制,大致扫一眼没有什么问题,就跳过了,结果问题还是出在时钟这里。下面这个图第二行后面写对了,但前面我因为是直接复制串口1的,前面还是APB2PeriphClockCmd
串口2的时钟配置
在这里插入图片描述
串口1的时钟配置
在这里插入图片描述
问题六:对于pid参数的整定方法,其实我之前都是采用很笨的办法,就是改一个值,编译,再下载到板子上。这种很耗时间,而且效果也不好,问题五就是希望使用串口来解决这个问题六,在b站上看到有一种方法,Json格式数据解析。Json是一种人们规定的数据交换格式。在现实生活中,我们需要进行数据交换的情景非常多,但是许多情况下,由于各个设备所采用的语言、架构不同,因此一个设备内部的数据、变量、结构体、对象等不能被其他设备所识别。
JSON首先是一个纯的文本(字符串)。因为JSON是需要在各个编程语言中都能存在的,因此JSON的本质就是一堆文本。只不过因为这种文本为了方便打包和解析,我们定义了具体的写法和结构,因此我们可以给出定义:用于数据交换的、采用这种写法的、字符串、就叫JSON。
Json在C语言中的使用存在一个问题,那就是C语言是一种面向过程的语言,和其他语言不同,因此C语言中没有对象等定义。那么Json在C语言的平台的使用过程中,就需要进行一些独属于C语言的解析和打包方法,这种基于C语言的JSON的处理方法我们称之为cJson。
看的视频是基于HAL库编写的程序,由于电赛马上就要到了,没时间转变去学HAL库了,平时用的还是标准库写的程序。等之后比完了有时间再学这个cJSON串口调参吧。

本文内容由网友自发贡献,转载请注明出处:【wpsshop博客】
推荐阅读
相关标签
  

闽ICP备14008679号