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

今日得以继续我的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


测试效果视频:

巡线下载测试

 

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

MySQL:子查询(全面详解)

MySQL&#xff1a;子查询 前言一、需求分析与问题解决1、实际问题2、子查询的基本使用3、子查询的分类 二、单行子查询1、单行比较操作符2、代码示例3、HAVING 中的子查询4、CASE中的子查询5、子查询中的空值问题6、非法使用子查询 三、多行子查询1、多行比较操作符2、代码示例…

pyodbc读取.mdb文件时出现[ODBC Microsoft Access Driver] 网络访问已中断。请关闭数据库.....解决方法

在使用pyodbc读取.mdb文件时出现下面的错误 : ODBC Microsoft Access Driver] 网络访问已中断。若要继续&#xff0c;请关闭数据库&#xff0c;然后再将其打开。 (-1022) (SQLDriverConnect) 网上找了很多方法&#xff0c;最后通过下面的方法解决了&#xff0c;就是安装64位的…

Flink写入数据到ClickHouse

文章目录 1.ClickHouse建表1.ClickHouse依赖2.Bean实体类3.ClickHouse业务写入逻辑4.测试写入类5.发送数据 1.ClickHouse建表 ClickHouse中建表 CREATE TABLE default.test_write (id UInt16,name String,age UInt16 ) ENGINE TinyLog();1.ClickHouse依赖 Flink开发相关…

【文生图系列】文生图大模型合集与效果对比

文章目录 DELL EDELL E 1DELL E 2 ERNIE-ViLGERNIE-ViLG 1ERNIE-ViLG 2Paddlehub ImagenMidjourneyStable DiffusionAltDiffusioneDiff-I阿里通义 DELL E DALLE到目前为止有两个版本&#xff0c;2021年1月&#xff0c;OpenAI发布了DALLE&#xff1b;2022年,DALLE 迎来了升…

【电影推荐系统】实时推荐

目录 原因 由于实时性&#xff0c;所以算法设计需要满足一下两点 算法设计 算法实现 算法公式 完整代码 原因 用户对电影的偏好随着时间的推移总是会发生变化的。此时离线系统无法解决&#xff0c;需要实时推荐。 由于实时性&#xff0c;所以算法设计需要满足一下两点 …

Go语言远程调试

Go语言远程调试 1、安装dlv # 安装dlv $ go install github.com/go-delve/delve/cmd/dlvlatest$ dlv version Delve Debugger Version: 1.20.1 Build: $Id: 96e65b6c615845d42e0e31d903f6475b0e4ece6e $2、命令行远程调试 我们远程(Linux服务器)有如下代码&#xff1a; [ro…

自学大语言模型之GPT

GPT火爆的发展史 2017年6月OpenAI联合DeepMind首次正式提出的&#xff1a;Deep Reinforcement Learning from Human Preferences&#xff0c;即基于人类偏好的深度强化学习&#xff0c;简称RLHF 2017年7月的OpenAI团队提出的对TRPO算法的改进&#xff1a;PPO算法 GPT-1&#…

Tomcat的优化多实例部署

目录 一.tomcat核心组件模块 1.2. toncat功能组件结构 二.Tomcat 优化 三.简述Tomcat请求过程 四.Tomcat 多实例部署 多实例部署图示 1.关闭防火墙 拖入软件包 2.安装JDk 设置JDK环境变量 3.解压tomcat 创建目录 4.配置 tomcat 环境变量 5.修改 tomcat2 中的 server.xm…

学习系统编程No.29【线程执行过程之页表详解】

引言&#xff1a; 北京时间&#xff1a;2023/7/3/14:09&#xff0c;刚睡醒&#xff0c;放假在家起床时间确实不怎么好调整&#xff0c;根本固定不了一点&#xff0c;当然通俗点说也就是根本起不来&#xff0c;哈哈哈&#xff0c;已经很少见到那种7点起来码字的情形了&#xff…

UART-GD32

UART-GD32 通信的概念 同步通信和异步通信 数据帧格式 波特率 使用步骤 引脚分布

gitLab配置ssh实现私钥访问

1.配置ssh文件 1.cd C:\Users\用户名\.ssh 找到文件夹 删除.ssh 里面所有其他文件方面我们配置要最新的 2.win r cmd 呼出命令行 ssh-keygen -t rsa -C "必须对应gitLab用户名" 3.生成文件夹拿到ssh 4.复制id_rsa_pub 文件的全部字符串 公钥给到GitLab服务器 2.公…

Spring Boot 中的模板引擎是什么,如何使用

Spring Boot 中的模板引擎是什么&#xff0c;如何使用 在 Web 应用程序中&#xff0c;模板引擎是一种用于动态生成 HTML、XML、JSON 等文档的工具。Spring Boot 内置了多种常见的模板引擎&#xff0c;例如 Thymeleaf、Freemarker、Velocity 等&#xff0c;让我们可以轻松地创建…

线性代数行列式的几何含义

行列式可以看做是一系列列向量的排列&#xff0c;并且每个列向量的分量可以理解为其对应标准正交基下的坐标。 行列式有非常直观的几何意义&#xff0c;例如&#xff1a; 二维行列式按列向量排列依次是 a \mathbf{a} a和 b \mathbf{b} b&#xff0c;可以表示 a \mathbf{a} a和…

Lua学习笔记:浅谈对垃圾回收的理解

前言 本篇在讲什么 Lua的垃圾回收 本篇适合什么 适合初学Lua的小白 本篇需要什么 对Lua语法有简单认知 依赖Sublime Text编辑器 本篇的特色 具有全流程的图文教学 重实践&#xff0c;轻理论&#xff0c;快速上手 提供全流程的源码内容 ★提高阅读体验★ &#x1f…

3、boostrap图片视频上传展示

boostrap图片视频上传展示 1、展示效果2、html代码 1、展示效果 项目目录结构 2、html代码 html <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><title>Title</title><!--<link rel"st…

记一次 .NET 某工控视觉系统 卡死分析

一&#xff1a;背景 1. 讲故事 前段时间有位朋友找到我&#xff0c;说他们的工业视觉软件僵死了&#xff0c;让我帮忙看下到底是什么情况&#xff0c;哈哈&#xff0c;其实卡死的问题相对好定位&#xff0c;无非就是看主线程栈嘛&#xff0c;然后就是具体问题具体分析&#x…

一起来看看文档翻译哪个好吧

在繁忙的都市生活中&#xff0c;小玲是一位年轻的职场人士。她的工作经常需要处理各种文档和文件&#xff0c;而其中不乏需要与外国合作伙伴交流的时候。然而&#xff0c;她并不熟悉其他语言&#xff0c;这给她的工作带来了一定的困扰。于是&#xff0c;她开始寻找免费的文档翻…

什么是AOP?

目录 一、AOP简介 1、AOP简介和作用 2、AOP的概念 二、AOP的基本实现 三、AOP工作流程 1 、AOP工作流程 2、AOP核心概念 四、AOP切入点表达式 1、语法格式 2、通配符 五、AOP通知类型 1、AOP通知分类 2、AOP通知详解 &#xff08;1&#xff09;前置通知 &#xf…

MySQL-分库分表详解(四)

♥️作者&#xff1a;小刘在C站 ♥️个人主页&#xff1a; 小刘主页 ♥️努力不一定有回报&#xff0c;但一定会有收获加油&#xff01;一起努力&#xff0c;共赴美好人生&#xff01; ♥️学习两年总结出的运维经验&#xff0c;以及思科模拟器全套网络实验教程。专栏&#xf…

【ArcGIS微课1000例】0069:用ArcGIS提取一条线的高程值

本实验讲解用ArcGIS软件,基于数字高程模型DEM提取一条线的高程值并导出。 文章目录 一、加载实验数据二、将线转为折点三、提取折点高程值四、导出高程值五、注意事项【相关阅读】:【GlobalMapper精品教程】060:用dem提取一条线的高程值 一、加载实验数据 本实验使用的数据…