MSP432自主开发笔记2:八路寻迹模块的编程

news2024/12/25 12:22:50

今日得以继续我的MSP432学习之路,今日学习八路寻迹模块的编程与测试:

本章需要掌握的知识只有俩个:串口通信发送数据、GPIO基础初始化与获取电平状态

这俩个在我专栏里都可寻到,大家可以自行查找~~

八路灰度寻迹模块的原理与应用:

 下图就是八路灰度传感寻迹模块了,它长这样:

 为何称之为灰度传感器,而不是颜色传感器呢,因为它实质上是没有颜色传感的:

灰度传感器利用不同颜色的检测面对光的反射程度不 同的原理进行颜色深浅检测。在有效的检测距离内 (理论上距离可以无限远,实际受外界光 源的影响,最佳距离为 15mm 50mm, 如果距离过高的话,需要进行遮光) ,发光二极管发 出的光,照射在检测面上,检测面反射部分光线,光敏二极管检测此光线的强度并将其转换 为单片机可以识别的电信号。这个电信号是一个模拟值,单片机可以根据不同处理手段对其处理后反馈给主机

况且 :

颜色传感器容易受外界光线影响,需要在黑暗环境下使用,而且颜色传感器获
得的信号是反应 RGB 三色的复杂数据信号,因此,颜色传感器的通信过程非常复杂,更重
要的是价格昂贵。

 这里我画了它的原理框图,帮助大家理解:

 主要还是推荐直接用那八根线,IIC是接OLED调试用的,UART用处不明,商家自己说用到PID算法,但MSP432串口资源有限,因此不建议占用串口~~

直接使用OUT1~8这八根高低电平输出线即可,因为通用输入输出口资源足够的。

编程思路:

基本是使用商家给的八路寻迹代码,但商家没有注释,此处我贴出注释就好理解了:

我们可以看到,它是根据车辆与线在横向的左右偏移量来决定车辆轮胎运转差速的:

而这个左右便宜的量的大小是根据八路寻迹探测情况八个输出口的高低电平情况判断的:

检测到线,就会返回低电平,反之为高:


void XunXian()          //巡线检测
{
	//刚好在线上,车轮均匀速
	if((D4 == 0)&&(D5 == 0))    
	{
//		motor(40,40);
	}
	//车辆右偏0~1cm,左慢右快
	else if((D4 == 0)&&(D5 != 0))   
	{
//		motor(38,40);
	}
	//车辆左偏0~1cm,右慢左快
	else if((D4 != 0)&&(D5 == 0))   
	{
//		motor(40,38);
	}
	//车辆右偏1.5cm,
	else if((D3 == 0)&&(D4 == 0))   
	{
//	motor(32,40);
	}
	//车辆左偏1.5cm,
	else if((D5 == 0)&&(D6 == 0))   
	{
//		motor(40,32);
	}
	//车辆右偏2.5cm,
	else if((D3 == 0)&&(D4 != 0))    
	{
//		motor(25,40);
	}
	//车辆左偏2.5cm,	
	else if((D5 != 0)&&(D6 == 0))   
	{
//		motor(40,25);
	}
	//车辆右偏3.5cm,	
	else if((D2 == 0)&&(D3 == 0))   
	{
//		motor(20,40);
	}
	//车辆左偏3.5cm,	
	else if((D6 == 0)&&(D7 == 0))   
	{
//		motor(40,20);
	}
	//车辆右偏4.5cm,
	else if((D2 == 0)&&(D3 != 0))    
	{
//		motor(15,40);
	}
	//车辆左偏4.5cm,
	else if((D6 != 0)&&(D7 == 0))  
	{
//		motor(40,15);
	}
	//车辆右偏5.5cm,	
	else if((D1 == 0)&&(D2 == 0))   
	{
//		motor(10,40);
	}
	//车辆左偏5.5cm,	
	else if((D7 == 0)&&(D8 == 0))   
	{
//		motor(40,10);
	}
	//车辆右偏6.5cm,		
	else if((D1 == 0)&&(D2 != 0))    
	{
//		motor(0,40);
	}	
	//车辆左偏6.5cm,	
	else if((D7 !=0)&&(D8 == 0))   
	{
//		motor(40,0);
	}
	//其余检测不到的情况先停止
	else   
	{
//		motor(20,20);
	}

模块调试:

模块需要我们调试给定什么是背景,什么是线,因为背景与线的颜色可能不一致,这个需要我们给模块调试上去,不喜欢看字的可以看一遍调试视频:

 我们发现模块上有三个按键:K1、RST、K2

RST是复位用的,一般不用~

进入调试模式:

长按K1俩秒左右进入调试模式,此时红色指示灯会亮起:

1、采集背景色模式:

第一个灯会亮,此时进入采集背景色的环节,将传感头一排都放在背景色上,按一下K2,红灯会闪烁一下,表示采集有效,不闪就是无效

2.采集巡线颜色模式:

背景采集结束后,按一下K1,第二个灯会亮,此时采集的是巡线的颜色,将传感头一排都放在背景色上,按一下K2,红灯会闪烁一下,表示采集有效,不闪就是无效

 3.设置高低电平输出模式:

巡线颜色采集结束后,按一下K1,第三个灯会亮,此时可以按K2切换输出电平,要结合D6灯观看,D6亮起,表示巡线输出低电平,反之,则高电平

4.切换数据输出类型:

高低电平输出模式设置结束后,按一下K1,第四个灯会亮,此时按K2切换数据输出的类型,要结合D7观看,D7亮,表示输出误差值,D7灭,表示输出高低电平情况

5.采集线中位置数据:

数据类型输出切换结束后,按一下K1,第五个灯会亮起,此时需要将模块正放在线上,使其中间的D4,D5在线上,其余在背景上,表示正确的巡线位置,按一下K2进行采集,红灯会闪烁一下,表示采集有效,不闪就是无效

完成调试后长按我们的K1退出调试模式,红灯灭就是退出了~

调试视频:

寻迹模块的调试

编程实践:

 首先确定我们需要使用的引脚,P4^0~P4^7,分别接上OUT1~8,其次初始化以上的GPIO口为输入模式:

void inint_Xunxian(void)//巡线引脚初始化
{
	//设置为输入脚:
	GPIO_setAsInputPin (GPIO_PORT_P4,GPIO_PIN0);
	GPIO_setAsInputPin (GPIO_PORT_P4,GPIO_PIN1);
	GPIO_setAsInputPin (GPIO_PORT_P4,GPIO_PIN2);
	GPIO_setAsInputPin (GPIO_PORT_P4,GPIO_PIN3);
	GPIO_setAsInputPin (GPIO_PORT_P4,GPIO_PIN4);
	GPIO_setAsInputPin (GPIO_PORT_P4,GPIO_PIN5);
	GPIO_setAsInputPin (GPIO_PORT_P4,GPIO_PIN6);
	GPIO_setAsInputPin (GPIO_PORT_P4,GPIO_PIN7);
	
	
}

 此处位带操作没有实际意义用途,纯属为了接线提示:

// 位带操作
//定义八路寻迹引脚名称
#define OUT1   BITBAND_PERI(P4OUT,0)
#define OUT2   BITBAND_PERI(P4OUT,1)
#define OUT3   BITBAND_PERI(P4OUT,2)
#define OUT4   BITBAND_PERI(P4OUT,3)
#define OUT5   BITBAND_PERI(P4OUT,4)
#define OUT6   BITBAND_PERI(P4OUT,5)
#define OUT7   BITBAND_PERI(P4OUT,6)
#define OUT8   BITBAND_PERI(P4OUT,7)

我们在需要获得引脚状态的时候使用函数: 来获取引脚高低电平状态:

uint8_t GPIO_getInputPinValue (uint8_t selectedPort,uint16_t selectedPins )

代码部分十分简单,这个自己编写就行,实在不会参考以下:

#include "main.h"

int main(void)
{
    SysInit();                   
    uart_init(115200);          
    delay_init();
		TimA0_Int_Init(CCR0_COMMON,CLK_DIV_COMMON);//用宏定义初始化通用定时器,周期1ms
//	  Interrupt_CAP_inint();                     //外部中断初始化
//		inint_TB6612();                            //初始化电机
	  inint_Xunxian();                  //巡线引脚初始化
    printf("Hello,MSP432!\r\n");
    MAP_Interrupt_enableMaster(); // 开启总中断
    while (1)
    {
			if(FTT_flag==1)
			{
				FTT_flag=0;
				XunXian();      //巡线检测,获取电平情况,再分析
			  printf("D1=%d,D2=%d,D3=%d,D4=%d,D5=%d,D6=%d,D7=%d,D8=%d\r\n",D1,D2,D3,D4,D5,D6,D7,D8);//打印结果
			}
    }
}

//通用定时器中断中断服务函数,周期2ms
void TA0_0_IRQHandler(void)
{
    MAP_Timer_A_clearCaptureCompareInterrupt(TIMER_A0_BASE, TIMER_A_CAPTURECOMPARE_REGISTER_0);
		if(++FTT_cnt==1000)        //每1反馈一次寻迹结果
		{	FTT_cnt=0;FTT_flag=1;}
		
}
#ifndef _main_h_
#define _main_h_

#include "sysinit.h"
#include "usart.h"
#include "delay.h"
#include "led.h"
#include "tim32.h"
#include "TB6612.h"
#include "string.h"
#include "timA.h"
#include <ti/devices/msp432p4xx/driverlib/driverlib.h>
#include "FTT.h"



//宏定义 通用定时器需要的参数
#define CCR0_COMMON 999
#define CLK_DIV_COMMON 48


uint16_t FTT_flag=0;    //寻迹检测标志
uint32_t FTT_cnt;       //寻迹计时标志


#endif

#include "FTT.h"

uint8_t D1,D2,D3,D4,D5,D6,D7,D8;

void inint_Xunxian(void)//巡线引脚初始化
{
	//设置为输入脚:
	GPIO_setAsInputPin (GPIO_PORT_P4,GPIO_PIN0);
	GPIO_setAsInputPin (GPIO_PORT_P4,GPIO_PIN1);
	GPIO_setAsInputPin (GPIO_PORT_P4,GPIO_PIN2);
	GPIO_setAsInputPin (GPIO_PORT_P4,GPIO_PIN3);
	GPIO_setAsInputPin (GPIO_PORT_P4,GPIO_PIN4);
	GPIO_setAsInputPin (GPIO_PORT_P4,GPIO_PIN5);
	GPIO_setAsInputPin (GPIO_PORT_P4,GPIO_PIN6);
	GPIO_setAsInputPin (GPIO_PORT_P4,GPIO_PIN7);
	
	
}

void XunXian(void)          //巡线检测,获取电平情况,再分析
{
	//获取电平状态
	D1=GPIO_getInputPinValue (GPIO_PORT_P4,GPIO_PIN0);
	D2=GPIO_getInputPinValue (GPIO_PORT_P4,GPIO_PIN1);	
	D3=GPIO_getInputPinValue (GPIO_PORT_P4,GPIO_PIN2);
	D4=GPIO_getInputPinValue (GPIO_PORT_P4,GPIO_PIN3);	
	D5=GPIO_getInputPinValue (GPIO_PORT_P4,GPIO_PIN4);
	D6=GPIO_getInputPinValue (GPIO_PORT_P4,GPIO_PIN5);	
	D7=GPIO_getInputPinValue (GPIO_PORT_P4,GPIO_PIN6);
	D8=GPIO_getInputPinValue (GPIO_PORT_P4,GPIO_PIN7);	
	

}


#ifndef _FTT_h_
#define _FTT_h_


#include <ti/devices/msp432p4xx/driverlib/driverlib.h>

// 位带操作
//定义八路寻迹引脚名称
#define OUT1   BITBAND_PERI(P4OUT,0)
#define OUT3   BITBAND_PERI(P4OUT,2)
#define OUT5   BITBAND_PERI(P4OUT,4)
#define OUT7   BITBAND_PERI(P4OUT,6)

#define OUT2   BITBAND_PERI(P4OUT,1)
#define OUT4   BITBAND_PERI(P4OUT,3)
#define OUT6   BITBAND_PERI(P4OUT,5)
#define OUT8   BITBAND_PERI(P4OUT,7)

extern	uint8_t D1,D2,D3,D4,D5,D6,D7,D8;

void inint_Xunxian(void);//巡线引脚初始化
void XunXian(void);      //巡线检测,获取电平情况,再分析

#endif


测试效果视频:

巡线下载测试

 

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

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

相关文章

【UE5 Cesium】13-Cesium for Unreal 加载本地倾斜摄影

目录 效果 步骤 一、获取倾斜摄影资源 二、使用CesiumLab转换 三、在UE中加载转换后的倾斜摄影 效果 步骤 一、获取倾斜摄影资源 首先下载免费的资源&#xff0c;这里是从規劃署 香港三維實景模型 规划署 香港三维实景模型下载的&#xff0c; 我下载了如下6个区域的资源…

突破AI大模型工业化开发,生成式AI迎来全链条服务商

LLM大模型和生成式AI在2023年上半年迅速爆发&#xff0c;不仅高盛集团和麦肯锡发布了生成式AI的经济前景预测&#xff0c;纷纷认为生成式AI将为全球生产力带来显著提升&#xff0c;每年将为全球带来数万亿美元的经济增长&#xff0c;更有UC伯克利和斯坦福等先后发布了LLM大模型…

Centos环境Access denied for user ‘root‘@‘%to database ‘xxx‘

Centos7解决数据库出现Access denied for user ‘root‘‘%to database ‘xxx‘ 问题 原因: root%表示 root用户 通过任意其他端访问操作 被拒绝! 授权即可: 1&#xff1a;进入数据库 mysql -u root -p 2.输入 mysql>grant all privileges on *.* to root% with grant o…

CCF-CSP真题《202303-5 施肥》思路+python,c++满分题解

想查看其他题的真题及题解的同学可以前往查看&#xff1a;CCF-CSP真题附题解大全 试题编号&#xff1a;202303-5试题名称&#xff1a;施肥时间限制&#xff1a;2.0s内存限制&#xff1a;1.0GB问题描述&#xff1a; 问题描述 春天到了&#xff0c;西西艾弗岛上的 n 块田地需要施…

Mysql之进阶宝典系列-视图

Mysql之进阶宝典系列-视图 一、视图是什么(what) 视图本质上是一个虚表&#xff0c;在数据库中不实际存在&#xff0c;它的所有数据来源于查询中所使用的表的数据&#xff0c;而且是在视图调用过程中动态生成的。视图只保存了SQL查询的逻辑&#xff0c;不保存SQL查询的结果。 …

HarmonyOS学习路之开发篇—数据管理(关系型数据库)

关系型数据库概述 关系型数据库&#xff08;Relational Database&#xff0c;RDB&#xff09;是一种基于关系模型来管理数据的数据库。HarmonyOS关系型数据库基于SQLite组件提供了一套完整的对本地数据库进行管理的机制&#xff0c;对外提供了一系列的增、删、改、查等接口&am…

深度学习-GPU多卡并行训练总结

1.为什么要使用多GPU并行训练 简单来说&#xff0c;有两种原因&#xff1a;第一种是模型在一块GPU上放不下&#xff0c;两块或多块GPU上就能运行完整的模型&#xff08;如早期的AlexNet&#xff09;。第二种是多块GPU并行计算可以达到加速训练的效果。想要成为“炼丹大师“&…

【原生HTML+SpringBoot】电子病历编辑器源码

一、简介 本系统主要面向医院医生、护士&#xff0c;提供对住院病人的电子病历书写、保存、修改、打印等功能。本系统基于云端SaaS服务方式&#xff0c;通过浏览器方式访问和使用系统功能&#xff0c;提供电子病历在线制作、管理和使用的一体化电子病历解决方案&#x…

常见面试题之JVM组成

1. JVM由那些部分组成&#xff0c;运行流程是什么&#xff1f; JVM是什么 Java Virtual Machine Java程序的运行环境&#xff08;java二进制字节码的运行环境&#xff09; 好处&#xff1a; 一次编写&#xff0c;到处运行 自动内存管理&#xff0c;垃圾回收机制 JVM由哪些…

sqldeveloper 连接 MySQL

sqldeveloper 连接 MySQL 工作中使用 Oracle 用户的小伙伴&#xff0c;sqldeveloper 是常用的开发和运维工具之一 工作中如果连接MySQL需要安装额外的客户端工具 不但学习成本高而且维护也较为麻烦 能不能使用 sqldeveloper 可以同时管理Oracle和MySQL两种甚至更多种数据库 成为…

基于Javaweb实现ATM机系统开发实战(一)基础配置和搭建

一、环境介绍 JDK:JDK1.8 IDEA:2020 MYSQL :MYSQL5.7 Navcat :mysql的客户端工具 Tomcat:tomcat5.7 二、项目简介 本项目主要实现一个模拟ATM机存款、取款、转账功能的一个系统&#xff0c;可以查看打印交易明细&#xff0c;后台用户可以管理用户账户卡信息。本系统主要是针对计…

Java易忘知识点

Java八大基本类型 整数类型&#xff1a;byte&#xff0c;1字节&#xff0c;8位&#xff0c;最大存储数据量是255&#xff0c;存放的数据范围是-128~127之间。整数类型&#xff1a;short&#xff0c;2字节&#xff0c;16位&#xff0c;最大数据存储量是65536&#xff0c;数据范…

centos下./configure报错:Permission denied

./configure 文章目录 ./configure报错解决方案使用chmod给./configure赋予x权限sftp给configure文件赋予x权限 ./configure报错 -bash: ./configure: Permission denied解决方案 使用chmod给./configure赋予x权限 sudo chmod x ./configuresftp给configure文件赋予x权限

推荐一个基于Java 的在线网盘开源程序

目录 一、软件简介 二、功能列表 文件列表 画廊模式 视频预览 文本预览 音频预览 PDF 预览 Office 预览 3d 文件预览 生成直链 页面设置 后台设置-登录 后台设置-存储源列表 后台设置-存储源权限控制 后台设置-添加存储源(本地存储) 后台设置-添加存储源 后…

Spring Boot中的请求参数绑定及使用

Spring Boot中的请求参数绑定及使用 在Web应用程序中&#xff0c;请求参数绑定是非常重要的操作。Spring Boot框架使得请求参数绑定变得非常简单&#xff0c;通过使用注解和预定义的类可以轻松地实现此操作。本文将介绍Spring Boot中的请求参数绑定及其使用。 请求参数绑定 在…

第十章:C语言数据结构与算法初阶之链式二叉树

系列文章目录 文章目录 系列文章目录前言一、链式二叉树的定义二、链式二叉树的实现三、链式二叉树的遍历1、前序遍历/先根遍历2、中序遍历/中根遍历3、后序遍历/后根遍历4、层序遍历5、前/中/后序遍历的关系 四、节点个数以及高度等1. 二叉树节点的个数2. 二叉树叶子节点个数3…

Java面试知识点复习​_kaic

一、后端基础 1.Java基础、集合、线程、异常&#xff08;自定义异常&#xff09;流 2.mysql、redis、mongodb(为什么使用) 3.ssm、springboot、springcloud、mybatis-plus 1.接口和抽象类的区别 二、前端基础 1.事件 三、实习和项目 1.博客项目的日志配置&#xff08;切面&a…

flutter tabBar 的属性及自定义实现

flutter tabBar 的属性及自定义实现 前言一、TabBar是什么&#xff1f;二、TabBar 自定义三、 Tab 自定义总结 前言 在Flutter中&#xff0c;TabBar的indicatorPadding属性用于设置指示器的内边距&#xff0c;而不是用于调整指示器和文字之间的间距。要调整TabBar中指示器和文字…

Field ‘非主键_id‘ doesn‘t have a default value

参考文章 Field ‘非主键_id‘ doesn‘t have a default value 的sql报错有两种情况 1.如果id是主键的话,一般是主键没有添加自增导致的错误 2.如果报错的是非主键id 那么是数据库设置错误 前端请求参数根本没有传入business_id 但是数据库报错 解决方法 把数据库数据限制n…

python 第九章 常用操作

系列文章目录 第一章 初识python 第二章 变量 第三章 基础语句 第四章 字符串str 第五章 列表list [] 第六章 元组tuple ( ) 第七章 字典dict {} 第八章 集合set {} 文章目录 系列文章目录9.1公共操作运算符 合并* 复制判断数据是否存在 公共方法len()delmax()min()rangeenume…