[其他ST产品] STM32智能小车循迹教程

[复制链接]
 楼主| 实际测量不符 发表于 2023-2-28 17:09 | 显示全部楼层 |阅读模式
前言

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

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

电路工作描述
以其中一路为例

5822563fdc4a69aba8.png


 楼主| 实际测量不符 发表于 2023-2-28 17:09 | 显示全部楼层
TCRT5000传感器的红外发射二极管不断发射红外线,当发射的红外线没有被反射回来或者反射回的强度不够大时,红外接收管一直处于关闭状态,此时比较器LM393的2脚的电压低于3脚的电压,输出OUT1为低电平,LED1为点亮状态;当红外反射强度足够且被接收到时,比较器LM3932脚的电压大于3脚的电压,输出OUT1为低电平,LED1为熄灭状态。简单的可以理解为遇到黑线灯亮,遇到白线灯灭。、
 楼主| 实际测量不符 发表于 2023-2-28 17:10 | 显示全部楼层
红外循迹模块和STM32的接线图
此红外循迹模块使用到了4个IO口分别接到了STM32的PA4~PA7。

6428063fdc4e60b606.png
 楼主| 实际测量不符 发表于 2023-2-28 17:10 | 显示全部楼层
cubeMX配置
将红外循迹的4个IO口都设置为上拉输入模式即可。
 楼主| 实际测量不符 发表于 2023-2-28 17:11 | 显示全部楼层
代码解析
find.c

  1. #include "find.h"
  2. #include "Moto.h"

  3. extern TIM_HandleTypeDef htim3;

  4. /*
  5. 函数功能:调节小车左右电机PWM
  6. Left:左电机PWM
  7. Right:右电机PWM
  8. */
  9. void Moto_speed_set(int Left,int Right)
  10. {
  11.   __HAL_TIM_SET_COMPARE(&htim3, TIM_CHANNEL_3, Right);
  12.   __HAL_TIM_SET_COMPARE(&htim3, TIM_CHANNEL_4, Left);
  13. }

  14. /*
  15. 函数功能:循迹
  16. */
  17. void Find(void)
  18. {
  19.   //全是白线前进
  20.   if((IO1_read()==0)&&(IO2_read()==0)&&(IO3_read()==0)&&(IO4_read()==0))
  21.   {
  22.     Moto_speed_set(800,800);
  23.     car_move(0);   
  24.   }
  25.   //右边有黑线小车向左即左轮加速右轮减速
  26.   else if((IO1_read()==0)&&(IO2_read()==1)&&(IO3_read()==0)&&(IO4_read()==0))
  27.   {
  28.     Moto_speed_set(800,0);
  29.     car_move(0);   
  30.   }
  31.   //右边有黑线小车向左即左轮加速右轮减速
  32.   else if((IO1_read()==1)&&(IO2_read()==1)&&(IO3_read()==0)&&(IO4_read()==0))
  33.   {
  34.     Moto_speed_set(800,0);
  35.     car_move(0);   
  36.   }
  37.   //右边有黑线小车向左即左轮加速右轮减速
  38.   else if((IO1_read()==1)&&(IO2_read()==0)&&(IO3_read()==0)&&(IO4_read()==0))
  39.   {
  40.     Moto_speed_set(800,0);
  41.     car_move(0);   
  42.   }
  43.   
  44.   
  45.   //左边有黑线小车向右即右轮加速左轮减速
  46.   else if((IO1_read()==0)&&(IO2_read()==0)&&(IO3_read()==1)&&(IO4_read()==0))
  47.   {
  48.     Moto_speed_set(0,800);
  49.     car_move(0);   
  50.   }
  51.   //左边有黑线小车向右即右轮加速左轮减速
  52.   else if((IO1_read()==0)&&(IO2_read()==0)&&(IO3_read()==1)&&(IO4_read()==1))
  53.   {
  54.     Moto_speed_set(0,800);
  55.     car_move(0);   
  56.   }
  57.   //左边有黑线小车向右即右轮加速左轮减速
  58.   else if((IO1_read()==0)&&(IO2_read()==0)&&(IO3_read()==0)&&(IO4_read()==1))
  59.   {
  60.     Moto_speed_set(0,800);
  61.     car_move(0);   
  62.   }
  63.   
  64.   //全是黑线停车
  65.   if((IO1_read()==1)&&(IO2_read()==1)&&(IO3_read()==1)&&(IO4_read()==1))
  66.   {
  67.     Moto_speed_set(0,0);
  68.     car_move(2);
  69.   }
  70. }
 楼主| 实际测量不符 发表于 2023-2-28 17:13 | 显示全部楼层
find.h

  1. #ifndef _FIND_H_
  2. #define _FIND_H_

  3. #include "main.h"

  4. #define u8 unsigned char
  5. #define u16 unsigned short
  6. #define u32 unsigned int

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


  13. void Find(void);
  14. void Moto_speed_set(int Left,int Right);


  15. #endif

 楼主| 实际测量不符 发表于 2023-2-28 17:13 | 显示全部楼层
find.h

  1. #ifndef _FIND_H_
  2. #define _FIND_H_

  3. #include "main.h"

  4. #define u8 unsigned char
  5. #define u16 unsigned short
  6. #define u32 unsigned int

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


  13. void Find(void);
  14. void Moto_speed_set(int Left,int Right);


  15. #endif

 楼主| 实际测量不符 发表于 2023-2-28 17:13 | 显示全部楼层
总结
循迹代码已经贴出希望大家可以好好理解一下循迹算法的编写。
Pulitzer 发表于 2024-5-6 08:06 | 显示全部楼层

时间片轮的设计思想
童雨竹 发表于 2024-5-6 10:02 | 显示全部楼层

大大减小与其他引线之间的容性耦合
Wordsworth 发表于 2024-5-6 11:05 | 显示全部楼层

需要在做项目的过程中经历磨难
Clyde011 发表于 2024-5-6 12:08 | 显示全部楼层

硬件设计和软件设计本来就是鱼和熊掌的关系,两者不可兼得
公羊子丹 发表于 2024-5-6 13:01 | 显示全部楼层

与电感和续流二极管相连
万图 发表于 2024-5-6 14:04 | 显示全部楼层

结构化模块化的程序设计的思想,使最基本的要求
Uriah 发表于 2024-5-6 15:07 | 显示全部楼层

确定好硬件原理图,硬件布线,最后才是软件的开发
帛灿灿 发表于 2024-5-6 17:03 | 显示全部楼层

写程序不难,但是程序怎么样才能写的好,写的快,那是需要点经验积累的
Bblythe 发表于 2024-5-6 18:06 | 显示全部楼层

在实际的项目应用当中,单片机引脚的复用相当厉害
您需要登录后才可以回帖 登录 | 注册

本版积分规则

48

主题

605

帖子

1

粉丝
快速回复 在线客服 返回列表 返回顶部