首页 > 其他分享 >STM32智能小车循迹教程

STM32智能小车循迹教程

时间:2023-12-17 21:02:15浏览次数:24  
标签:教程 循迹 read IO4 Moto STM32 && speed

(文章目录)


前言

本篇文章将带大家学习STM32智能小车的循迹功能。

一、红外循迹模块工作原理及接线图

红外循迹模块工作原理

电路工作描述 以其中一路为例 在这里插入图片描述

TCRT5000传感器的红外发射二极管不断发射红外线,当发射的红外线没有被反射回来或者反射回的强度不够大时,红外接收管一直处于关闭状态,此时比较器LM393的2脚的电压低于3脚的电压,输出OUT1为低电平,LED1为点亮状态;当红外反射强度足够且被接收到时,比较器LM3932脚的电压大于3脚的电压,输出OUT1为低电平,LED1为熄灭状态。简单的可以理解为遇到黑线灯亮,遇到白线灯灭。

红外循迹模块和STM32的接线图

此红外循迹模块使用到了4个IO口分别接到了STM32的PA4~PA7。

在这里插入图片描述

二、cubeMX配置

将红外循迹的4个IO口都设置为上拉输入模式即可。 在这里插入图片描述

三、代码解析

find.c

#include "find.h"
#include "Moto.h"

extern TIM_HandleTypeDef htim3;

/*
函数功能:调节小车左右电机PWM
Left:左电机PWM
Right:右电机PWM
*/
void Moto_speed_set(int Left,int Right)
{
  __HAL_TIM_SET_COMPARE(&htim3, TIM_CHANNEL_3, Right);
  __HAL_TIM_SET_COMPARE(&htim3, TIM_CHANNEL_4, Left); 
}

/*
函数功能:循迹
*/
void Find(void)
{
  //全是白线前进
  if((IO1_read()==0)&&(IO2_read()==0)&&(IO3_read()==0)&&(IO4_read()==0))
  {
    Moto_speed_set(800,800);
    car_move(0);    
  }
  //右边有黑线小车向左即左轮加速右轮减速
  else if((IO1_read()==0)&&(IO2_read()==1)&&(IO3_read()==0)&&(IO4_read()==0))
  {
    Moto_speed_set(800,0);
    car_move(0);    
  }
  //右边有黑线小车向左即左轮加速右轮减速
  else if((IO1_read()==1)&&(IO2_read()==1)&&(IO3_read()==0)&&(IO4_read()==0))
  {
    Moto_speed_set(800,0);
    car_move(0);    
  }
  //右边有黑线小车向左即左轮加速右轮减速
  else if((IO1_read()==1)&&(IO2_read()==0)&&(IO3_read()==0)&&(IO4_read()==0))
  {
    Moto_speed_set(800,0);
    car_move(0);    
  }
  
  
  //左边有黑线小车向右即右轮加速左轮减速
  else if((IO1_read()==0)&&(IO2_read()==0)&&(IO3_read()==1)&&(IO4_read()==0))
  {
    Moto_speed_set(0,800);
    car_move(0);    
  }
  //左边有黑线小车向右即右轮加速左轮减速
  else if((IO1_read()==0)&&(IO2_read()==0)&&(IO3_read()==1)&&(IO4_read()==1))
  {
    Moto_speed_set(0,800);
    car_move(0);    
  }
  //左边有黑线小车向右即右轮加速左轮减速
  else if((IO1_read()==0)&&(IO2_read()==0)&&(IO3_read()==0)&&(IO4_read()==1))
  {
    Moto_speed_set(0,800);
    car_move(0);    
  }
  
  //全是黑线停车
  if((IO1_read()==1)&&(IO2_read()==1)&&(IO3_read()==1)&&(IO4_read()==1))
  {
    Moto_speed_set(0,0);
    car_move(2);
  }
}

find.h

#ifndef _FIND_H_
#define _FIND_H_

#include "main.h"

#define u8 unsigned char
#define u16 unsigned short
#define u32 unsigned int

//红外循迹IO口定义
//传感器从右到左  IO1 IO2 IO3 IO4
#define IO1_read() HAL_GPIO_ReadPin(GPIOA,GPIO_PIN_4)
#define IO2_read() HAL_GPIO_ReadPin(GPIOA,GPIO_PIN_5)
#define IO3_read() HAL_GPIO_ReadPin(GPIOA,GPIO_PIN_6)
#define IO4_read() HAL_GPIO_ReadPin(GPIOA,GPIO_PIN_7)


void Find(void);
void Moto_speed_set(int Left,int Right);


#endif

总结

循迹代码已经贴出希望大家可以好好理解一下循迹算法的编写。

标签:教程,循迹,read,IO4,Moto,STM32,&&,speed
From: https://blog.51cto.com/u_16153875/8863348

相关文章

  • 无涯教程-Java - String toLowerCase()函数
    将此String中的所有字符转换为小写,这等同于调用toLowerCase(Locale.getDefault())。StringtoLowerCase()-语法publicStringtoLowerCase()StringtoLowerCase()-返回值它返回转换为小写字母的字符串。StringtoLowerCase()-示例importjava.io.*;publicclassTest......
  • 无涯教程-Java - toCharArray()函数
    此方法将此字符串转换为新的字符数组。char[]toCharArray()-语法这是此方法的语法-publicchar[]toCharArray()char[]toCharArray()-返回值它返回一个新分配的字符数组,其长度是此字符串的长度,并且其内容已初始化为包含此字符串表示的字符序列。char[]toCharArray()......
  • Mybatis-Plus技术教程
    Mybatis-Plus课程目标了解Mybatis-Plus整合Mybatis-Plus通用CRUDMybatis-Plus的配置条件构造器Mybatis-Plus的Service封装代码生成器1Mybatis-Plus介绍1.1Mybatis-Plus介绍MyBatis-Plus(简称MP)是一个MyBatis的增强工具,在MyBatis的基础上只做增强......
  • 无涯教程-Java - String substring(int beginIndex)函数
    从beginIndex索引处开始截取字符串。Stringsubstring-语法publicStringsubstring(intbeginIndex)这是参数的详细信息-beginIndex  -  包含开始索引。Stringsubstring-返回值指定的子字符串。Stringsubstring-示例importjava.io.*;publicclassTest......
  • 无涯教程-Java - String substring(int beginIndex, int endIndex)函数
    截取beginIndex索引开始到endIndex结束之间的字符串内容。Stringsubstring-语法这是此方法的语法-publicStringsubstring(intbeginIndex,intendIndex)这是参数的详细信息-beginIndex - 包含开始索引。endIndex   - 不包含结束索引。Stringsubstri......
  • 无涯教程-Java - boolean startsWith(String prefix, int toffset)函数
    判断字符串是否以prefix开头。booleanstartsWith-语法这是此方法的语法-publicbooleanstartsWith(Stringprefix,inttoffset)这是参数的详细信息-prefix   -要匹配的前缀。toffset  -从何处开始查找字符串。booleanstartsWith-返回值如果参数表示......
  • 无涯教程-Java - boolean startsWith(String prefix)函数
    判断字符串是否以prefix开头。booleanstartsWith-语法publicbooleanstartsWith(Stringprefix)这是参数的详细信息-prefix  - 要匹配的前缀。booleanstartsWith-返回值如果是以prefix开头,则返回true,否则为false。booleanstartsWith-示例importjava.io.*......
  • 反平坦化教程
    angr+deflat.py未平坦化前为下图有明显的平坦化程序特征,画个图接下来的工作就是尝试进行函数的修复(去平坦化)可以参考:https://security.tencent.com/index.php/blog/msg/112首先安装angr,在windows下cmd输入pipinstallangr然后在GitHub上下载deflat.py脚本接着把题放在......
  • 最新Spring 6手写实现Sping IOC保姆级教程
    Java全能学习+面试指南:https://javaxiaobear.cn我们都知道,Spring框架的IOC是基于Java反射机制实现的,下面我们先回顾一下java反射。1、回顾Java反射Java反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意方法和属性;这种......
  • 无涯教程-Java - split(String regex, int limit)函数
    将字符串拆分成一个数组。String[]split-语法publicString[]split(Stringregex,intlimit)这是参数的详细信息-regex   -定界的正则表达式。limit   -输出阈值,这意味着要返回多少个字符串。String[]split-返回值它返回通过将字符串拆分为字符串......