当前位置:   article > 正文

STM32智能小车—跟随小车和摇头避障小车_stm32标准外设库小车的自由避障代码

stm32标准外设库小车的自由避障代码

一、STM32跟随小车

1. 红外壁障模块分析

原理和循迹是一样的,循迹红外观朝下,跟随朝前

2. 跟随小车的原理

  • 左边跟随模块能返回红外,输出低电平,右边不能返回,输出高电平,说明物体在左边,需要左转
  • 右边跟随模块能返回红外,输出低电平,左边不能返回,输出高电平,说明物体在右边,需要右转

3. 跟随小车开发和调试代码

硬件接线

  • B-1A -- PB0
  • B-1B -- PB1
  • A-1A -- PB2
  • A-1B -- PB10
  • 跟随模块(左) -- PB5
  • 跟随模块(右) -- PB6

代码示例:

  1. #define LeftWheel_Value HAL_GPIO_ReadPin(GPIOB, GPIO_PIN_5)
  2. #define RightWheel_Value HAL_GPIO_ReadPin(GPIOB, GPIO_PIN_6)
  3. // main函数里
  4. while (1)
  5. {
  6. if(LeftWheel_Value == GPIO_PIN_RESET && RightWheel_Value == GPIO_PIN_RESET)
  7. goForward();
  8. if(LeftWheel_Value == GPIO_PIN_SET && RightWheel_Value == GPIO_PIN_RESET)
  9. goRight();
  10. if(LeftWheel_Value == GPIO_PIN_RESET && RightWheel_Value == GPIO_PIN_SET)
  11. goLeft();
  12. if(LeftWheel_Value == GPIO_PIN_SET && RightWheel_Value == GPIO_PIN_SET)
  13. stop();
  14. }

二、STM32摇头避障小车

1. 超声波模块介绍

使用超声波模块,型号:HC-SR04

  • 怎么让它发送波 Trig ,给Trig端口至少10us的高电平
  • 怎么知道它开始发了 Echo信号,由低电平跳转到高电平,表示开始发送波
  • 怎么知道接收了返回波 Echo,由高电平跳转回低电平,表示波回来了
  • 怎么算时间 Echo引脚维持高电平的时间! 波发出去的那一下,开始启动定时器 波回来的拿一下,我们开始停止定时器,计算出中间经过多少时间
  • 怎么算距离 距离 = 速度 (340m/s)* 时间/2

时序图:

2. 舵机模块介绍

 1. 什么是舵机

如下图所示,最便宜的舵机sg90,常用三根或者四根接线,黄色为PWM信号控制 用处:垃圾桶项目开盖用、智能小车的全比例转向、摄像头云台、机械臂等 常见的有0-90°、0-180°、0-360°

2. 怎么控制舵机

向黄色信号线“灌入”PWM信号

PWM波的频率不能太高,大约50HZ,即周期=1/频率=1/50=0.02s,20ms左右

确定周期/频率:

如果周期为20ms,则 PSC=7199,ARR=199

角度控制

0.5ms-------------0度; 2.5% 对应函数中CCRx为5

1.0ms------------45度; 5.0% 对应函数中CCRx为10

1.5ms------------90度; 7.5% 对应函数中CCRx为15

2.0ms-----------135度; 10.0% 对应函数中CCRx为20

2.5ms-----------180度; 12.5% 对应函数中CCRx为25

3. 摇头避障小车开发和调试代码

硬件接线

  • sg90 -- PB9

cubeMX配置

代码实现

sg90.c

  1. #include "sg90.h"
  2. #include "gpio.h"
  3. #include "tim.h"
  4. void initSG90(void)
  5. {
  6. HAL_TIM_PWM_Start(&htim4,TIM_CHANNEL_4); //启动定时器4
  7. __HAL_TIM_SetCompare(&htim4, TIM_CHANNEL_4, 17); //将舵机置为90度
  8. }
  9. void sgMiddle(void)
  10. {
  11. __HAL_TIM_SetCompare(&htim4, TIM_CHANNEL_4, 17); //将舵机置为90度
  12. }
  13. void sgRight(void)
  14. {
  15. __HAL_TIM_SetCompare(&htim4, TIM_CHANNEL_4, 5); //将舵机置为0度
  16. }
  17. void sgLeft(void)
  18. {
  19. __HAL_TIM_SetCompare(&htim4, TIM_CHANNEL_4, 25); //将舵机置为180度
  20. }

sg90.h

  1. #ifndef __SG90_H__
  2. #define __SG90_H__
  3. void initSG90(void);
  4. void sgMiddle(void);
  5. void sgRight(void);
  6. void sgLeft(void);
  7. #endif

main.c

  1. initSG90();
  2. HAL_Delay(1000);
  3. while (1)
  4. {
  5. sgLeft();
  6. HAL_Delay(1000);
  7. sgMiddle();
  8. HAL_Delay(1000);
  9. sgRight();
  10. HAL_Delay(1000);
  11. sgMiddle();
  12. HAL_Delay(1000);
  13. }

封装超声波传感器

超声波模块接线:

  • Trig       --    PB7
  • Echo     -- PB8

cubeMX配置

代码实现

sr04.c

  1. #include "sr04.h"
  2. #include "gpio.h"
  3. #include "tim.h"
  4. //使用TIM2来做us级延时函数
  5. void TIM2_Delay_us(uint16_t n_us)
  6. {
  7. /* 使能定时器2计数 */
  8. __HAL_TIM_ENABLE(&htim2);
  9. __HAL_TIM_SetCounter(&htim2, 0);
  10. while(__HAL_TIM_GetCounter(&htim2) < ((1 * n_us)-1) );
  11. /* 关闭定时器2计数 */
  12. __HAL_TIM_DISABLE(&htim2);
  13. }
  14. double get_distance(void)
  15. {
  16. int cnt=0;
  17. //1. Trig ,给Trig端口至少10us的高电平
  18. HAL_GPIO_WritePin(GPIOB, GPIO_PIN_7, GPIO_PIN_SET);//拉高
  19. TIM2_Delay_us(20);
  20. HAL_GPIO_WritePin(GPIOB, GPIO_PIN_7, GPIO_PIN_RESET);//拉低
  21. //2. echo由低电平跳转到高电平,表示开始发送波
  22. //波发出去的那一下,开始启动定时器
  23. while(HAL_GPIO_ReadPin(GPIOB, GPIO_PIN_8) == GPIO_PIN_RESET);//等待输入电平拉高
  24. HAL_TIM_Base_Start(&htim2);
  25. __HAL_TIM_SetCounter(&htim2,0);
  26. //3. 由高电平跳转回低电平,表示波回来了
  27. while(HAL_GPIO_ReadPin(GPIOB, GPIO_PIN_8) == GPIO_PIN_SET);//等待输入电平变低
  28. //波回来的那一下,我们开始停止定时器
  29. HAL_TIM_Base_Stop(&htim2);
  30. //4. 计算出中间经过多少时间
  31. cnt = __HAL_TIM_GetCounter(&htim2);
  32. //5. 距离 = 速度 (340m/s)* 时间/2(计数1次表示1us)
  33. return (cnt*340/2*0.000001*100); //单位:cm
  34. }

sr04.h

  1. #ifndef __SR04_H__
  2. #define __SR04_H__
  3. double get_distance(void);
  4. #endif

main.c

  1. while (1)
  2. {
  3. if(dir != MIDDLE){
  4. sgMiddle();
  5. dir = MIDDLE;
  6. HAL_Delay(300);
  7. }
  8. disMiddle = get_distance();
  9. if(disMiddle > 35){
  10. //前进
  11. }
  12. else
  13. {
  14. //停止
  15. //测左边距离
  16. sgLeft();
  17. HAL_Delay(300);
  18. disLeft = get_distance();
  19. sgMiddle();
  20. HAL_Delay(300);
  21. sgRight();
  22. dir = RIGHT;
  23. HAL_Delay(300);
  24. disRight = get_distance();
  25. }
  26. }

封装电机驱动

代码实现:

  1. while (1)
  2. {
  3. if(dir != MIDDLE){
  4. sgMiddle();
  5. dir = MIDDLE;
  6. HAL_Delay(300);
  7. }
  8. disMiddle = get_distance();
  9. if(disMiddle > 35){
  10. //前进
  11. goForward();
  12. }else if(disMiddle < 10){
  13. goBack();
  14. }else
  15. {
  16. //停止
  17. stop();
  18. //测左边距离
  19. sgLeft();
  20. HAL_Delay(300);
  21. disLeft = get_distance();
  22. sgMiddle();
  23. HAL_Delay(300);
  24. sgRight();
  25. dir = RIGHT;
  26. HAL_Delay(300);
  27. disRight = get_distance();
  28. if(disLeft < disRight){
  29. goRight();
  30. HAL_Delay(150);
  31. stop();
  32. }
  33. if(disRight < disLeft){
  34. goLeft();
  35. HAL_Delay(150);
  36. stop();
  37. }
  38. }
  39. HAL_Delay(50);
  40. }

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

闽ICP备14008679号