引言
本项目基于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. 硬件连接
-
电机驱动模块:将电机驱动模块的IN1、IN2引脚分别连接到STM32的GPIO引脚(如PA0和PA1),控制左电机的前进和后退。IN3、IN4引脚连接到其他GPIO引脚(如PA2和PA3),控制右电机的前进和后退。PWM引脚连接到STM32的PWM输出引脚,以调节电机速度。
-
超声波传感器:超声波传感器的触发引脚连接至STM32的GPIO引脚(如PA4),回声引脚连接至另一个GPIO引脚(如PA5),用于检测前方障碍物的距离。
-
红外传感器:用于检测路径和防跌落,连接到STM32的ADC引脚(如PA6),实时检测是否接近边缘或黑线。
-
蓝牙模块:蓝牙模块的TX和RX引脚连接至STM32的USART接口(如USART1),用于远程发送和接收控制命令。
-
舵机(可选):连接至STM32的PWM输出引脚(如PA7),控制舵机旋转超声波传感器,以扫描不同方向的障碍物。
2. STM32CubeMX 配置
- 选择开发板型号:在STM32CubeMX中选择STM32F103C8T6。
- 配置系统时钟:设置系统时钟为HSI,确保系统稳定运行。
- 配置GPIO引脚:用于控制电机和超声波传感器的引脚配置为GPIO输出模式。
- 配置PWM:设置用于电机驱动和舵机控制的PWM输出。
- 配置ADC:设置用于红外传感器的引脚配置为ADC通道。
- 配置UART:用于蓝牙模块的通信。
- 生成代码:选择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