当前位置:   article > 正文

基于STM32智能小车控制,红外循迹_stm32红外循迹小车代码

stm32红外循迹小车代码

目录

一、蓝牙相关配置

1.串口介绍

​编辑

 2.硬件连接 ​编辑

3. 配置蓝牙

1.AT指令

4.软件CUBEIDE相关配置

1.串口配置

2. 代码

二、配置电机(L298N)

1.查看原理图

 2.软件配置

3.代码

三、红外循迹

1.原理图

 2、软件配置

​3、代码


一、蓝牙相关配置

1.串口介绍

串口是一种应用十分广泛的通讯接口,串口成本低、容易使用、通信线路简单,可实现两个设备的互相通信。
单片机的串口可以使单片机与单片机、单片机与电脑、单片机与各式各样的模块互相通信,极大的扩展了单片机的应用范围,增强了单片机系统的硬件实力。
单片机内部自带 UART Universal Asynchronous Receiver Transmitter ,通用异步收发器),可实现单片机的串口通信。

 

 2.硬件连接 

3. 配置蓝牙

1.AT指令

AT+NAME=8888                //名字

AT+NAME?                        //查看名字

AT+PSWD="6666"             //密码

AT+PSWD?                        //查看名字

AT+UART=9600,0,0          //波特率

AT+UART?                        //查看波特率

AT+RESET                //重启

设置成功都会返回 OK

4.软件CUBEIDE相关配置

1.串口配置

 

 

开启串口中断

 

2. 代码

打印函数,用于测试的。

开启接收中断

进入串口接收中断回调函数,此函数为弱函数,即在主函数中调用便可覆盖之前执行的内容,执行现在打印的函数。

 

 手机连上蓝牙发送信息;串口界面打印 111111 换行  hello   就表示可以进入中断函数,

 

二、配置电机(L298N)

1.查看原理图

ENA和ENB使能,ENA控制INT1和INT2,ENB控制INT3和INT4。

分别对应PA0,PA1,PB15,PB14,PB13,PB12。

 2.软件配置

 

 

 这里我们使用PWM(脉冲宽度调制),指1秒内信号从高电平到低电平再回到高电平的次数,即高电平在一个周期所占比。可以调节左右两边车轮的速度。这里就不细讲了。

3.代码

1.在主函数里面开启PWM

 

 

模块化,在Core/Src下面添加一个.c文件,在里面添加用到的头文件。

  1. #include "DJ.h"
  2. #include "main.h"
  3. #include "stm32f1xx_hal.h"
  4. extern TIM_HandleTypeDef htim2;
  5. extern TIM_HandleTypeDef htim3;
  6. //电机正转
  7. void DJ(int a,int b)
  8. {
  9. __HAL_TIM_SET_COMPARE(&htim2,TIM_CHANNEL_1,a);
  10. HAL_GPIO_WritePin(OUT1_GPIO_Port,OUT1_Pin,GPIO_PIN_RESET);
  11. HAL_GPIO_WritePin(OUT2_GPIO_Port,OUT2_Pin,GPIO_PIN_SET);
  12. __HAL_TIM_SET_COMPARE(&htim2,TIM_CHANNEL_2,b);
  13. HAL_GPIO_WritePin(OUT3_GPIO_Port,OUT3_Pin,GPIO_PIN_RESET);
  14. HAL_GPIO_WritePin(OUT4_GPIO_Port,OUT4_Pin,GPIO_PIN_SET);
  15. }
  16. //电机反转
  17. void BACK(int c,int d)
  18. {
  19. __HAL_TIM_SET_COMPARE(&htim2,TIM_CHANNEL_1,c);
  20. HAL_GPIO_WritePin(OUT1_GPIO_Port,OUT1_Pin,GPIO_PIN_SET);
  21. HAL_GPIO_WritePin(OUT2_GPIO_Port,OUT2_Pin,GPIO_PIN_RESET);
  22. __HAL_TIM_SET_COMPARE(&htim2,TIM_CHANNEL_2,d);
  23. HAL_GPIO_WritePin(OUT3_GPIO_Port,OUT3_Pin,GPIO_PIN_SET);
  24. HAL_GPIO_WritePin(OUT4_GPIO_Port,OUT4_Pin,GPIO_PIN_RESET);
  25. }

 在Core/INC文件夹里面添加一个.h文件

  1. #ifndef INC_DJ_H_
  2. #define INC_DJ_H_
  3. void DJ(int a,int b);
  4. void BACK(int c,int d);
  5. #endif

 在main.c里中断接收函数里添加如下代码

  1. void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
  2. {
  3. HAL_UART_Transmit(&huart3,data,1,10); //发送函数
  4. if(data[0] == 'a')
  5. {
  6. DJ(150,150); //前进
  7. }
  8. if(data[0] == 'b')
  9. {
  10. DJ(10,150); //左转
  11. }
  12. if(data[0] == 'c')
  13. {
  14. DJ(0,0); //停止
  15. }
  16. if(data[0] == 'd')
  17. {
  18. BACK(150,150); //后退
  19. }
  20. if(data[0] == 'e')
  21. {
  22. DJ(150,10); //右转
  23. }
  24. HAL_UART_Receive_IT(&huart3,data,1); //开启接收中断
  25. }

 第一步测试在串口界面打印了就说明是可以通信的,在手机蓝牙调试器软件上发相应的字符

就能实现相应的功能,

蓝牙控制小车功能已经实现,

三、红外循迹

1.原理图

引脚分别对应PC4,PC5,PB0,PB1,PB2。

 2、软件配置

 3、代码

 1.放在main.c文件里面,头文件下面主函数之前,也可以模块化代码,步骤和上面一样。

因为该红外传感器0是黑色,1是其他颜色

  1. int KZ(void)
  2. {
  3. int flag=0;
  4. if(HAL_GPIO_ReadPin(GPIOC,GPIO_PIN_4)==0 && HAL_GPIO_ReadPin(GPIOC,GPIO_PIN_5)==1 && HAL_GPIO_ReadPin(GPIOB,GPIO_PIN_1)==1 && HAL_GPIO_ReadPin(GPIOB,GPIO_PIN_1)==1 && HAL_GPIO_ReadPin(GPIOB,GPIO_PIN_2)==1)
  5. {
  6. flag=1;//左转大弯
  7. }
  8. if(HAL_GPIO_ReadPin(GPIOC,GPIO_PIN_4)==1 && HAL_GPIO_ReadPin(GPIOC,GPIO_PIN_5)==0 && HAL_GPIO_ReadPin(GPIOB,GPIO_PIN_1)==1 && HAL_GPIO_ReadPin(GPIOB,GPIO_PIN_1)==1 && HAL_GPIO_ReadPin(GPIOB,GPIO_PIN_2)==1)
  9. {
  10. flag=2; //左转小弯
  11. }
  12. if(HAL_GPIO_ReadPin(GPIOC,GPIO_PIN_4)==1 && HAL_GPIO_ReadPin(GPIOC,GPIO_PIN_5)==1 && HAL_GPIO_ReadPin(GPIOB,GPIO_PIN_0)==0 && HAL_GPIO_ReadPin(GPIOB,GPIO_PIN_1)==1 && HAL_GPIO_ReadPin(GPIOB,GPIO_PIN_2)==1)
  13. {
  14. flag=3;//慢�?�前�???
  15. }
  16. if(HAL_GPIO_ReadPin(GPIOC,GPIO_PIN_4)==1 && HAL_GPIO_ReadPin(GPIOC,GPIO_PIN_5)==1 && HAL_GPIO_ReadPin(GPIOB,GPIO_PIN_0)==1 && HAL_GPIO_ReadPin(GPIOB,GPIO_PIN_1)==0 && HAL_GPIO_ReadPin(GPIOB,GPIO_PIN_2)==1)
  17. {
  18. flag=4; //右转小弯
  19. }
  20. if(HAL_GPIO_ReadPin(GPIOC,GPIO_PIN_4)==1 && HAL_GPIO_ReadPin(GPIOC,GPIO_PIN_5)==1 && HAL_GPIO_ReadPin(GPIOB,GPIO_PIN_0)==1 && HAL_GPIO_ReadPin(GPIOB,GPIO_PIN_1)==1 && HAL_GPIO_ReadPin(GPIOB,GPIO_PIN_2)==0)
  21. {
  22. flag=5; //右转大弯
  23. }
  24. return flag;
  25. }

 2.在主函数while循环里添加如下代码

  1. while (1)
  2. {
  3. /* USER CODE END WHILE */
  4. /* USER CODE BEGIN 3 */
  5. if(KZ()==1)
  6. {
  7. DJ(50,100); //左大转
  8. }
  9. if(KZ()==2)
  10. {
  11. DJ(100,200); //左小转
  12. }
  13. if(KZ()==3)
  14. {
  15. DJ(200,200); //前进
  16. }
  17. if(KZ()==4)
  18. {
  19. DJ(200,100); //右小转
  20. }
  21. if(KZ()==5)
  22. {
  23. DJ(200,50); //右大转
  24. }
  25. }

循迹功能也可以显示了,也可以在此基础上添加一些其他功能。

 

 

 

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/Monodyee/article/detail/320932
推荐阅读
相关标签
  

闽ICP备14008679号