首页 > 其他分享 >基于STM32的远距离遥控自动避障小车设计

基于STM32的远距离遥控自动避障小车设计

时间:2024-11-05 18:49:13浏览次数:5  
标签:避障 HAL PIN 引脚 遥控 STM32 GPIO void

引言

本项目基于STM32微控制器设计一个远距离遥控自动避障小车系统。该系统通过蓝牙或Wi-Fi模块实现远程控制,同时结合超声波传感器和红外传感器,实现自主避障功能。小车支持多种操作模式,包括手动遥控、自动避障和路径跟踪,适用于家庭娱乐、智能小车开发和机器人教育等场景。项目包含硬件设计、软件控制算法、避障策略和远程通信方案的实现,本文将详细介绍系统的设计思路和具体实现步骤。


环境准备

1. 硬件设备
  • STM32F103C8T6开发板(或其他 STM32 系列):作为小车的控制核心。
  • 电机驱动模块(如L298N或TB6612):用于控制小车的直流电机,实现前进、后退和转向。
  • 直流电机:小车的驱动电机,为小车提供动力。
  • 超声波传感器(如HC-SR04):用于前方障碍物检测,实现自动避障。
  • 红外传感器模块:用于路径检测或防跌落检测。
  • 蓝牙模块(如HC-05)或Wi-Fi模块(如ESP8266):用于远程控制小车。
  • 电源模块:为STM32和电机驱动模块供电。
  • 舵机(可选):用于旋转超声波传感器,扩大避障检测范围。
2. 软件工具
  • STM32CubeMX:用于配置STM32的外设并生成代码框架。
  • Keil uVision 或 STM32CubeIDE:用于编写、调试和下载代码。
  • ST-Link驱动程序:用于将程序下载到STM32开发板。
  • 串口调试工具:用于调试远程控制和传感器数据。

项目实现

1. 硬件连接
  1. 电机驱动模块:将电机驱动模块的IN1、IN2引脚分别连接到STM32的GPIO引脚(如PA0和PA1),控制左电机的前进和后退。IN3、IN4引脚连接到其他GPIO引脚(如PA2和PA3),控制右电机的前进和后退。PWM引脚连接到STM32的PWM输出引脚,以调节电机速度。

  2. 超声波传感器:超声波传感器的触发引脚连接至STM32的GPIO引脚(如PA4),回声引脚连接至另一个GPIO引脚(如PA5),用于检测前方障碍物的距离。

  3. 红外传感器:用于检测路径和防跌落,连接到STM32的ADC引脚(如PA6),实时检测是否接近边缘或黑线。

  4. 蓝牙模块:蓝牙模块的TX和RX引脚连接至STM32的USART接口(如USART1),用于远程发送和接收控制命令。

  5. 舵机(可选):连接至STM32的PWM输出引脚(如PA7),控制舵机旋转超声波传感器,以扫描不同方向的障碍物。

2. STM32CubeMX 配置
  1. 选择开发板型号:在STM32CubeMX中选择STM32F103C8T6。
  2. 配置系统时钟:设置系统时钟为HSI,确保系统稳定运行。
  3. 配置GPIO引脚:用于控制电机和超声波传感器的引脚配置为GPIO输出模式。
  4. 配置PWM:设置用于电机驱动和舵机控制的PWM输出。
  5. 配置ADC:设置用于红外传感器的引脚配置为ADC通道。
  6. 配置UART:用于蓝牙模块的通信。
  7. 生成代码:选择Keil或STM32CubeIDE作为工具链,生成代码框架。
3. 编写主程序

基于生成的代码框架,编写小车的远程控制、自动避障和路径检测的逻辑代码,以下为智能小车系统的核心代码示例:

#include "stm32f1xx_hal.h"

// 定义引脚
#define LEFT_MOTOR_IN1 GPIO_PIN_0
#define LEFT_MOTOR_IN2 GPIO_PIN_1
#define RIGHT_MOTOR_IN1 GPIO_PIN_2
#define RIGHT_MOTOR_IN2 GPIO_PIN_3
#define ULTRASONIC_TRIG_PIN GPIO_PIN_4
#define ULTRASONIC_ECHO_PIN GPIO_PIN_5
#define IR_SENSOR_PIN GPIO_PIN_6
#define SERVO_PWM_PIN GPIO_PIN_7
#define GPIO_PORT GPIOA

// 变量声明
uint8_t pwm_duty_cycle = 100;  // 电机速度
uint8_t mode = 1;  // 1:手动模式, 2:自动避障模式

// 函数声明
void Motor_Control(uint8_t leftSpeed, uint8_t rightSpeed, uint8_t direction);
uint32_t Ultrasonic_ReadDistance(void);
void IR_Sensor_Check(void);
void Bluetooth_Control(void);
void Auto_Avoidance(void);

// 电机控制函数
void Motor_Control(uint8_t leftSpeed, uint8_t rightSpeed, uint8_t direction) {
    if (direction == 1) { // 前进
        HAL_GPIO_WritePin(GPIO_PORT, LEFT_MOTOR_IN1, GPIO_PIN_SET);
        HAL_GPIO_WritePin(GPIO_PORT, LEFT_MOTOR_IN2, GPIO_PIN_RESET);
        HAL_GPIO_WritePin(GPIO_PORT, RIGHT_MOTOR_IN1, GPIO_PIN_SET);
        HAL_GPIO_WritePin(GPIO_PORT, RIGHT_MOTOR_IN2, GPIO_PIN_RESET);
    } else { // 后退
        HAL_GPIO_WritePin(GPIO_PORT, LEFT_MOTOR_IN1, GPIO_PIN_RESET);
        HAL_GPIO_WritePin(GPIO_PORT, LEFT_MOTOR_IN2, GPIO_PIN_SET);
        HAL_GPIO_WritePin(GPIO_PORT, RIGHT_MOTOR_IN1, GPIO_PIN_RESET);
        HAL_GPIO_WritePin(GPIO_PORT, RIGHT_MOTOR_IN2, GPIO_PIN_SET);
    }
    __HAL_TIM_SET_COMPARE(&htim1, TIM_CHANNEL_1, leftSpeed);
    __HAL_TIM_SET_COMPARE(&htim1, TIM_CHANNEL_2, rightSpeed);
}

// 读取超声波距离
uint32_t Ultrasonic_ReadDistance(void) {
    // 触发超声波测距
    HAL_GPIO_WritePin(GPIO_PORT, ULTRASONIC_TRIG_PIN, GPIO_PIN_SET);
    HAL_Delay(10);
    HAL_GPIO_WritePin(GPIO_PORT, ULTRASONIC_TRIG_PIN, GPIO_PIN_RESET);
    
    // 计算距离
    uint32_t start = HAL_GetTick();
    while (HAL_GPIO_ReadPin(GPIO_PORT, ULTRASONIC_ECHO_PIN) == GPIO_PIN_RESET);
    start = HAL_GetTick();
    while (HAL_GPIO_ReadPin(GPIO_PORT, ULTRASONIC_ECHO_PIN) == GPIO_PIN_SET);
    uint32_t end = HAL_GetTick();
    
    return (end - start) * 0.034 / 2;
}

// 蓝牙控制
void Bluetooth_Control(void) {
    uint8_t command;
    HAL_UART_Receive(&huart1, &command, 1, HAL_MAX_DELAY);
    switch (command) {
        case 'F': Motor_Control(pwm_duty_cycle, pwm_duty_cycle, 1); break; // 前进
        case 'B': Motor_Control(pwm_duty_cycle, pwm_duty_cycle, 0); break; // 后退
        case 'L': Motor_Control(pwm_duty_cycle / 2, pwm_duty_cycle, 1); break; // 左转
        case 'R': Motor_Control(pwm_duty_cycle, pwm_duty_cycle / 2, 1); break; // 右转
        case 'S': Motor_Control(0, 0, 1); break; // 停止
        case 'A': mode = 2; break; // 切换至自动避障模式
        case 'M': mode = 1; break; // 切换至手动模式
    }
}

// 自动避障功能
void Auto_Avoidance(void) {
    uint32_t distance = Ultrasonic_ReadDistance();
    if (distance < 20) {
        Motor_Control(0, 0, 1);  // 停止
        HAL_Delay(500);
        Motor_Control(pwm_duty_cycle, pwm_duty_cycle, 0);  // 后退
        HAL_Delay(1000);
        Motor_Control(pwm_duty_cycle / 2, pwm_duty_cycle, 1);  // 右转避障
        HAL_Delay(500);
    } else {
        Motor_Control(pwm_duty_cycle, pwm_duty_cycle, 1);  // 前进
    }
}

int main(void) {
    HAL_Init();
    SystemClock_Config();
    
    MX_GPIO_Init();
    MX_ADC1_Init();
    MX_TIM1_Init();
    MX_USART1_UART_Init();

    HAL_TIM_PWM_Start(&htim1, TIM_CHANNEL_1); // 开启PWM

    while (1) {
        if (mode == 1) {
            Bluetooth_Control();  // 手动控制
        } else if (mode == 2) {
            Auto_Avoidance();  // 自动避障
        }
    }
}

⬇帮大家整理了单片机的资料

包括stm32的项目合集【源码+开发文档】

点击下方蓝字即可领取,感谢支持!⬇

点击领取更多嵌入式详细资料

问题讨论,stm32的资料领取可以私信!

 

4. 自动避障功能

通过超声波传感器测量前方障碍物的距离,当距离小于一定阈值(如20 cm)时,小车后退并转向,以避开障碍物。可通过舵机旋转超声波传感器,扩大检测范围,实现多方向避障。

5. 遥控控制

蓝牙或Wi-Fi模块接收远程命令,控制小车的前进、后退、转向和停止。不同模式下,小车可以响应手动命令或自主切换到自动避障模式。

6. 路径检测

红外传感器检测路径或地面边缘,防止小车偏离既定路线或跌落。可在需要时切换为巡线模式,以沿预定路线行驶。


智能控制原理

  • 手动遥控:通过蓝牙或Wi-Fi实现远程控制,可通过手机或电脑发送命令控制小车运动。
  • 自动避障:超声波传感器实时测量前方障碍物的距离,结合转向和后退动作,自动避开障碍物。
  • 路径检测:红外传感器实时监测路径,辅助避障和防跌落。
  • 多模式切换:支持手动、自动避障和路径跟踪模式切换,适应不同使用需求。

常见问题与解决方法

  • 小车行驶不稳定

    • 检查电机和电机驱动模块的连接,确保PWM信号稳定。
    • 确认小车的电池供电充足。
  • 蓝牙模块无法通信

    • 检查蓝牙模块的波特率是否与STM32 UART波特率一致。
    • 确保手机端和蓝牙模块的配对和连接正常。
  • 自动避障失灵

    • 检查超声波传感器的连接和工作状态,确保无干扰信号。
    • 确保舵机(如使用)旋转顺畅,无卡顿。

结论

该远距离遥控自动避障小车系统基于STM32控制,通过蓝牙或Wi-Fi实现远程控制,并结合超声波和红外传感器,实现了自动避障功能。系统支持多种模式切换,适应不同的应用场景,为智能机器人控制提供了良好的实践基础。

标签:避障,HAL,PIN,引脚,遥控,STM32,GPIO,void
From: https://blog.csdn.net/stm32d1219/article/details/143521069

相关文章

  • 【STM32开发之寄存器版】(十六)-CAN总线基础知识
    一、CAN简介本文主要参考瑞萨CAN入门书。CAN是ControllerAreaNetwork的缩写(以下称为CAN),是ISO*1国际标准化的串行通信协议。在当前的汽车产业中,出于对安全性、舒适性、方便性、低公害、低成本的要求,各种各样的电子控制系统被开发了出来。由于这些系统之间通信所用的......
  • 一篇文章教会你HC-SR04超声波传感器测距,附STM32代码示例
     一、HC-SR04超声波传感器介绍:(1)HC-SR04(2020版本):        HC-SR04(2020版本)是一款尺寸完全兼容老版本,增加UART和IIC功能的开放式超声波测距模块。默认条件下,软件与硬件完全兼容老版本HC-SR04;可以通过电阻设置成UART或IIC模式。2CM超小盲区,4.5M典型最远测......
  • stm32教程:GPIO口及流水灯实验
    早上好啊,大佬们,想必在你电脑硬盘的某处放着一个stm32的工程模板吧!~然后今天,就和大家一起写出第一个小项目——流水灯咱们先来讲讲GPIO口吧。关于GPIO的那点事儿什么是GPIOGPIO(英语:General-purposeinput/output),通用型之输入输出的简称,功能类似8051的P0—P3,其接脚可以供......
  • STM32(hal库)为什么中断服务函数里TIM2_IRQHandler(void)调用 HAL_TIM_IRQHandler(&time
    STM32(hal库)为什么中断服务函数里TIM2_IRQHandler(void)调用HAL_TIM_IRQHandler(&timer_handle);而不是TIM2_IRQHandler(void)里直接写需要的程序呢?而标准库只需要在TIM2_IRQHandle里写中断需要的代码即可?        在STM32HAL库中,中断服务函数(ISR)的设计思路与标准......
  • 学习记录:STM32G431CBU6的多通道ADC采样串口打印(HAL库)
    一配置  二代码uint16_tGet_adc(){//启动ADC1HAL_ADC_Start(&hadc1);//等待ADC转换完成,超时为100msHAL_ADC_PollForConversion(&hadc1,100);//判断ADC是否转换成功if(HAL_IS_BIT_SET(HAL_ADC_GetState(&hadc1),HAL_ADC_STATE_REG_EOC)......
  • STM32——PWM
    目录1、PWM2、芯片手册通用定时器(TIM1/TIM8)高级定时器(TIMx)3、如何配置生成一个PWM波形4、示例5、如何配置出来的5.1、RCC 5.2、时基单元5.3、PWM输出5.4、具体配置1、PWMPWM信号:PWM信号通过改变高电平和低电平的持续时间比(占空比)来调节输出功率。定时器:STM32......
  • ST官方开发工具(一) STM32CubeMX 安装
    STM32CubeMX安装安装Java的环境STM32CubeMX安装在开发STM32MP157的时候我们还需要用到一些ST官方提供的软件,一共有三种:STM32CubeMX、STM32CubeIDE、STM32CubeProgrammerSTM32CubeMX可以直接在ST官网下载到http://www.st.com/en/developmen......
  • STM32 第20章 USART--串口通信3
    时间:2024.10.30参考资料:《零死角玩转STM32》“USART--串口通信”章节 一、学习内容1、串口2345代码移植实现控制串口2-->将串口1的宏修改成串口2的即可1.1串口的宏串口1://为了方便移植,定义的宏//串口1-USART#defineDEBUG_USARTxUSART1#d......
  • STM32 第20章 USART--串口通信2
    时间:2024.10.29参考资料:《零死角玩转STM32》“USART--串口通信”章节编程是从GPIO输出-使用固件库点亮LED灯的基础上开始一、学习内容1、STM32串口初始化结构体和固件库1.1USART初始化结构体 /***@briefUSARTInitStructuredefinition*/typedef......
  • STM32按键开关灯
    文章目录概要整体架构流程灯LEDSTM32F103的IO口--IN/OUT输入输出的接口IO口资源和命名方式stm32中GPIO的内部结构以及工作模式寄存器与配置时钟软件编程驱动LED灯延时函数使用嘀嗒定时器按键驱动概要使用Stm32F103ZET6型号芯片开发项目中灯led、IO口、......