基于MSP432P401R爬坡小车【2020年电赛C题】

news2024/9/29 21:27:04

文章目录

  • 一、任务清单
    • 1. 硬件部分
    • 2. 软件部分
  • 二、OpenMV巡线
  • 三、舵机转向
  • 四、停止线识别
  • 五、技术交流


一、任务清单

1. 硬件部分

  • 主控板: MSP432P401R
  • 数据显示: OLED
  • 电机: 霍尔编码器电机
  • 电池: 7.3V航模电池
  • 巡线: OpenMV H7 Plus
  • 警报: 蜂鸣器
  • 电机驱动: TB6612
  • 仪器: 3D打印机
  • 视觉云台: 3D建模打印
  • 转向: 数字舵机
  • 其他: 铜柱、螺丝螺母、开关、面包板等。
    在这里插入图片描述

2. 软件部分

  • 编译器: Keil、OpenMV IDE
  • 建模软件: SketchUp Pro 2022
  • 切片软件: Cura
  • 编程方式: 库函数
  • 编程语言: C、Python

二、OpenMV巡线

这里巡线不用红外探头的原因是考虑到市面上大多红外对该虚线采集的信号并不是很准确,存在偶然因素,故选择摄像头巡线。

这里我通过寻找有效区域内的最大色块,将其x轴坐标返回给单片机,在单片机端进行数据处理,例如摄像头下的分辨率为(w:320,h:240),设感应区域ROI为(0,90,320,60) ,
采集到的有效色块X坐标为162,下图可见,被圈出的大白框矩形为感应区域ROI,中间被圈出的为最大有效色块(图中色块阈值选择为黑色),下方红色圈出的为该色块的X轴坐标。
在这里插入图片描述
获取目标色块:

img = sensor.snapshot()  //截取摄像头的一个图像
blob=img.find_blobs([thresholds[0]], roi=ROI1, x_stride=10, y_stride=5,pixels_threshold=10, area_threshold=10, merge=True)  

筛选出最大色块:

def find_max(blobs):
    max_size=0
    for blob in blobs:
        if blob[2]*blob[3] > max_size:
            max_blob=blob
            max_size = blob[2]*blob[3]
    return max_blob

输出最大色块X坐标:

x=max_ID.cx()

将有效色块坐标发送至单片机端后该怎样对数据进行处理呢?

  • 方法一:
    例如采集到的坐标为140,可知中心坐标为160,已速度闭环为例,可先将坐标差值Err=140-160=-20,可拟定为负值为偏左,正值为偏右,假如你的闭环在每10ms单相双边沿产生15个脉冲信号,可设定一个线性系数k,有Err/k=P,Err2=Err_Last-Err=I,则Target_L=15+PI,Target_R=15-PI,Target_L和Target_R则为计算后的目标脉冲,具体公式推导这里不做介绍,仅供参考!

  • 方法二:
    这种方法也是更为简单,更为方便的。
    对色块的X坐标进行区域划分,例如中线为160,则:
    ①中心区域可划分为(150,170)
    ②偏左区域可划分为(120,150)、(90,120)、(60,90)、(30,60)、(0,30)
    ③偏右区域可划分为(170,200)、(200,230)、(230,260)、(260,290)、(290,320)
    即可根据不同位置发送不同指令。单片机段根据不同指令执行不同程度的回正操作。

示例如下:


def Send_X(err):
    if(err>=150 and err<=170):
        uart.write("F")

    elif(err>=120 and err<150):
        uart.write("0")
    elif(err>=90 and err<120):
        uart.write("1")
    elif(err>=60 and err<90):
        uart.write("2")
    elif(err>=30 and err<60):
        uart.write("3")
    elif(err>=0 and err<30):
        uart.write("4")

    elif(err>170 and err<200):
        uart.write("5")
    elif(err>=200 and err<230):
        uart.write("6")
    elif(err>=230 and err<260):
        uart.write("7")
    elif(err>=260 and err<290):
        uart.write("8")
    elif(err>=290 and err<320):
        uart.write("9")

其中Err表示踩到的X坐标,根据不同坐标区域发送不同指令,在单片机端接收操作如下:

	if( openmv_rx=='F' )
	{

	}	

	//偏向左边
	else if( openmv_rx=='0' )
	{
		
	}
	else if( openmv_rx=='1' )
	{
	
	}
	else if( openmv_rx=='2' )
	{
			
	}
	......
	
	//偏向右边
	else if( openmv_rx=='5' )
	{
	
	}
	else if( openmv_rx=='6' )
	{
		
	}
	......

三、舵机转向

舵机转向问题,在学习较为常用的为180°舵机,这里我以180°数字舵机进行简单介绍

常用的舵机大多都分为3根线,其中俩根为VCC和GND,也就是电源线,剩下一根为信号线,也就是控制舵机的线

  • 舵机控制
    关于舵机的控制说的通俗易懂点就是控制信号线的脉宽,通过控制不同脉冲舵机转动不同角度,如下所示:
                20ms为例
        0.5ms ------------ 0度;
        1.0ms ------------ 45度;
        1.5ms ------------ 90度;
        2.0ms ------------ 135度;
        2.5ms ------------ 180度;

设一个PWM周期为20ms,则控制有效电平为0.5ms,也就是一百分之一的时候,舵机保持0°,依次类推。

  • 实时转向
    可根据上面巡线返回的信号进行转向,如当接收到信号F时,表示在中心区域,则舵机保持直线行驶状态,也就是90°,若接收到1-4信号,则舵机向左偏向,120°、150°、180°等,如接收到5-9信号,则舵机向右偏向,60°、30°、0°等。

  • 舵机初始化
    这里以定时器A0的通道三为例,如下代码:

	    /*初始化引脚*/
	MAP_GPIO_setAsPeripheralModuleFunctionOutputPin(GPIO_PORT_P2, GPIO_PIN6, GPIO_PRIMARY_MODULE_FUNCTION);
	
    Timer_A_PWMConfig TimA0_PWMConfig;
    /*定时器PWM初始化*/
    TimA0_PWMConfig.clockSource = TIMER_A_CLOCKSOURCE_SMCLK;             //时钟源
    TimA0_PWMConfig.clockSourceDivider = psc;                            //时钟分频 范围1-64
    TimA0_PWMConfig.timerPeriod = ccr0;                                  //自动重装载值(ARR)
    TimA0_PWMConfig.compareRegister = TIMER_A_CAPTURECOMPARE_REGISTER_3; //通道三
    TimA0_PWMConfig.compareOutputMode = TIMER_A_OUTPUTMODE_TOGGLE_SET;   //输出模式                              

    MAP_Timer_A_generatePWM(TIMER_A0_BASE, &TimA0_PWMConfig); /* 初始化比较寄存器以产生 PWM1 */	
  • 角度控制
void SG90_angle(int a)
{
    int pwm=500+2000/180*a;
    MAP_Timer_A_setCompareValue(TIMER_A0_BASE, TIMER_A_CAPTURECOMPARE_REGISTER_3, pwm);
} 

四、停止线识别

  • 方法一
    通过判断有效色块的面积或者宽度,因为在巡线中都是1cm1cm的虚线组成,而停止线为5cm1cm,所以可通过色块的面积或者宽度等其他因素进行识别,返回停止信号。
w=max_ID.w()
if w>=80:
    uart.write("S")
  • 方法二
    因为整个赛图小车走的路程是固定的,则也可用通过小车走的路程进行停止。
if(sum>=1)
{
	Stop();
	PID_SetPoint(&L_pid,0);
	PID_SetPoint(&R_pid,0);			
}

五、技术交流

疑难解答或技术交流联系下方wx即可👇👇👇

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/789223.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

网络知识点之-路由

路由&#xff08;routing&#xff09;是指分组从源到目的地时&#xff0c;决定端到端路径的网络范围的进程。路由工作在OSI参考模型第三层——网络层的数据包转发设备。路由器通过转发数据包来实现网络互连。虽然路由器可以支持多种协议&#xff08;如TCP/IP、IPX/SPX、AppleTa…

iptables与防火墙

目录 防火墙 安全技术 划分方式 iptables 构成 四表 优先级 五链 iptables的规则 匹配顺序 iptables的命令格式 管理选项 匹配条件 控制类型 隐藏扩展模块 注意事项 防火墙 隔离功能&#xff0c;一般部署在网络边缘或者主机边缘&#xff0c;在工作中防火墙的…

【【51单片机LCD1602模块介绍】】

LCD1602的介绍 显示容量16x2 每个字符是5x7的点阵 VDD 是电源正极 4.5-5.5v VO 是对比度调节电压 RS 数据/指令 选择 1为数据0为指令 RW 读写选择1是读 0为写 E 使能 1为数据有效 下降沿执行命令 D0-D7 数据输入输出 A 背光电源正极 K 背光电源负极 LCD1602的操作流程 1.初始…

艺人商务代言:避雷策略与成功合作之道

避免在艺人商务代言中遇到风险&#xff0c;是每个企业和艺人都应该高度重视的问题。代言活动是一种有效的市场营销手段&#xff0c;可以为企业带来广泛的曝光和销售增长&#xff0c;同时也能让艺人获得额外的收入和更高的知名度。然而&#xff0c;不慎选择错误的代言合作可能带…

PostgreSQL实战-数据库迁移部署

PostgreSQL实战-数据库迁移部署 介绍 根据项目需求&#xff0c;我们需要将现有的PostgreSQL数据库重新部署到新的服务器上。由于项目本身就是基于PostgreSQL数据库构建的&#xff0c;因此数据库迁移将变得十分便捷。接下来&#xff0c;我将简要介绍我们的迁移步骤。 迁移步骤…

IDEA安装热部署插件JRebel详解

JRebel 简介 JRebel是一套JavaEE开发工具。JRebel允许开发团队在有限的时间内完成更多的任务修正更多的问题&#xff0c;发布更高质量的软件产品。 JRebel是收费软件&#xff0c;用户可以在JRebel官方站点下载30天的评估版本。 Jrebel 可快速实现热部署&#xff0c;节省了大量重…

微服务的各种边界在架构演进中的作用

演进式架构 在微服务设计和实施的过程中&#xff0c;很多人认为&#xff1a;“将单体拆分成多少个微服务&#xff0c;是微服务的设计重点。”可事实真的是这样吗&#xff1f;其实并非如此&#xff01; Martin Fowler 在提出微服务时&#xff0c;他提到了微服务的一个重要特征—…

【Linux】Ubuntu基本使用与配置, 以及常见问题汇总(一)

前言 大学期间&#xff0c;感觉很多时候学习课外知识都是被推着往前走&#xff0c;很多内容并没有深入去学习&#xff0c;知识的记录受限于所学比较片面&#xff0c;如今渐渐意识到似乎并没有建立起相关知识的体系架构&#xff0c;缺乏一个系统学习并整理的过程。本文将以Ubunt…

跨境独立站如何应对恶意网络爬虫?

目录 跨境出海独立站纷纷成立 爬虫威胁跨境电商生存 如何有效识别爬虫&#xff1f; 技术反爬方案 防爬虫才能保发展 中国出海跨境电商业务&#xff0c;主要选择大平台开设店铺&#xff0c;例如&#xff0c;亚马逊、eBay、Walmart、AliExpress、Zalando等。随着业务的扩大&…

Error “slow_conv2d_cpu“ not implemented for ‘Half‘

Error “slow_conv2d_cpu” not implemented for ‘Half’ 报错原因&#xff1a; 将输入数据的类型设置为half(半精度浮点数&#xff0c;能加快计算速度)&#xff0c;但是half只有GPU支持&#xff0c;pytorch cpu不支持半(half)精度训练 解决方式&#xff1a; 既然不支持&am…

微信小程序将接口返回的文件流预览导出Excel文件并转发

把接口url替换就可以用了 exportExcel () {wx.request({url: importMyApply, //这个地方是你获取二进制流的接口地址method: POST,responseType: "arraybuffer", //特别注意的是此处是请求文件流必须加上的属性&#xff0c;不然你导出到手机上的时候打不开&#xff…

ES检索结果高亮显示JAVA以及Kibana实现

/*** 查询接口** param searchReqVO*/ public EsSearchPageInfoResVO guessYouWantListForClient(EsSearchRequestVO searchReqVO) {BaseInfo baseInfo getApp();List<Long> catalogues getAccesses();EsSearchPageInfoResVO result new EsSearchPageInfoResVO();Sear…

FreeRTOS(中断管理)

一、中断定义 中断&#xff08;Interrupt&#xff09;是计算机系统中的一种事件&#xff0c;它打断了正常的程序执行流程&#xff0c;引起处理器&#xff08;CPU&#xff09;暂时转去执行其他任务或处理特殊事件。中断通常由硬件设备或者操作系统产生&#xff0c;用于向处理器传…

PP-YOLOE 论文学习

1. 解决了什么问题&#xff1f; 单阶段目标检测器能很好地平衡速度和精度&#xff0c;YOLO 系列是其中的代表。YOLOX 采用了 anchor-free 范式&#xff0c;加入了动态标签分配以提升检测表现&#xff0c;在 Tesla V100 上取得了 50.1 mAP&#xff0c;速度是 68.9 FPS。本文提出…

了解uuid

目录 一.认识 UUID 二.UUID 会耗尽吗 三.UUID 会重复吗 四.UUID 的版本 五.UUID的应用 六.java 如何生成UUID 一.认识 UUID uuid是经过特定的算法得到的. UUID 是 16 字节 128 位长的数字&#xff0c;通常以 36 字节的字符串表示&#xff0c;示例如下&#xff1a; 3F2…

大模型,开源干不掉闭源

开源大模型对闭源大模型的冲击&#xff0c;变得非常猛烈。 今年3月&#xff0c;Meta发布了Llama&#xff08;羊驼&#xff09;&#xff0c;很快成为AI社区内最强大的开源大模型&#xff0c;也是许多模型的基座模型。有人戏称&#xff0c;当前的大模型集群&#xff0c;就是一堆各…

c++一级 输入三个数,按照从小到大的顺序输出

这个题是2022年9月份c一级的真题&#xff0c;它说难不难&#xff0c;说不难也难&#xff0c;评判标准主要看学生学到哪种程度以及 使用的是哪种方法。 首先来看用最基础的判断怎么做&#xff1a; #include<iostream> using namespace std; int main(){int a,b,c;cin>…

macOS Ventura 13.5 (22G74) 正式版发布,ISO、IPSW、PKG 下载

macOS Ventura 13.5 (22G74) 正式版发布&#xff0c;ISO、IPSW、PKG 下载 本站下载的 macOS Ventura 软件包&#xff0c;既可以拖拽到 Applications&#xff08;应用程序&#xff09;下直接安装&#xff0c;也可以制作启动 U 盘安装&#xff0c;或者在虚拟机中启动安装。另外也…

Cesium态势标绘专题-正三角形(标绘+编辑)

标绘专题介绍:态势标绘专题介绍_总要学点什么的博客-CSDN博客 入口文件:Cesium态势标绘专题-入口_总要学点什么的博客-CSDN博客 辅助文件:Cesium态势标绘专题-辅助文件_总要学点什么的博客-CSDN博客 本专题没有废话,只有代码,代码中涉及到的引入文件方法,从上面三个链…

Cesium态势标绘专题-弓形(标绘+编辑)

标绘专题介绍:态势标绘专题介绍_总要学点什么的博客-CSDN博客 入口文件:Cesium态势标绘专题-入口_总要学点什么的博客-CSDN博客 辅助文件:Cesium态势标绘专题-辅助文件_总要学点什么的博客-CSDN博客 本专题没有废话,只有代码,代码中涉及到的引入文件方法,从上面三个链…