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

引言

本项目基于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); // 开启PWMwhile (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实现远程控制,并结合超声波和红外传感器,实现了自动避障功能。系统支持多种模式切换,适应不同的应用场景,为智能机器人控制提供了良好的实践基础。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/diannao/59354.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

gitee 使用 webhoot 触发 Jenkins 自动构建

一、插件下载和配置 Manage Jenkins>Plugin Manager 搜索 gitee 进行安装 插件配置 1、前往Jenkins -> Manage Jenkins -> System -> Gitee Configuration -> Gitee connections 2、在 Connection name 中输入 Gitee 或者你想要的名字 3、Gitee host URL 中…

springboot yml文件数据源出现警告/报黄/数据库配置警告问题

1、看一下数据源的依赖是不是都引入完整了 2、看一下数据源是否有拼写错误 上图就是数据源拼写错误

局部路径规划——frenet坐标系

零、参考资料 轨迹规划1&#xff1a;Frenet坐标转化公式推导_笛卡尔坐标系转化为frenet坐标系-CSDN博客曲率、切向量、法向量 一、概念 二、深度理解 2-1 参数曲线的向量值函数和弧长函数 a. r(t)参数曲线的向量值函数&#xff1a;表示空间曲线在 x、y、z 方向上的分量随时…

Spring Validation数据校检

文章目录 Spring Validation1 关于Spring Validation2 使用流程3 快速入门4 运行异常处理4.1 说明4.2 处理异常4.3 明确提示消息 5 常用注解5.1 NotNull注解5.2 NotEmpty 注解5.3 NotBlank 注解5.4 Size 注解5.5 Range 注解 6 非POJO参数校验6.1 使用流程6.2 使用示例 Spring V…

数据集成技术:聚水潭与金蝶云星空的成功对接

聚水潭数据集成到金蝶云星空的技术案例分享 在企业信息化管理中&#xff0c;数据的高效流动和准确对接是确保业务顺畅运行的关键。本文将聚焦于一个具体的系统对接集成案例&#xff1a;如何通过轻易云数据集成平台&#xff0c;将聚水潭的采购入库数据无缝集成到金蝶云星空&…

Linux网络命令:它用于实时监控网络接口的状态变化的命令 ip monitor详解

目录 一、概述 二、使用 1、语法 2、对象类型 3、常用选项 4、获取帮助 三、 示例 1. 监视链路层变化 2. 监视所有的网络变化 3. 仅监视路由表的变化 4. 监视特定网络接口的状态变化&#xff1a; 5. 监视网络接口地址的变化 四、实际应用 五、其他事项 一、概述 …

仿微信项目-2-Socket模拟聊天室

利用 Socket 模拟一个服务器来统一接收和发送消息 再用 Socket 模拟若干的客户端 服务端代码&#xff1a; package com.wfChat.test;import java.io.*; import java.net.ServerSocket; import java.net.Socket; import java.util.HashMap; import java.util.Map;public clas…

Hive学习笔记

1 Hive基本概念 1.1 Hive定义 Hive&#xff1a;由 Facebook 开源用于解决海量结构化日志的数据统计工具。 Hive 是基于 Hadoop 的一个数据仓库工具&#xff0c;可以将结构化的数据文件映射为一张表&#xff0c;并 提供类 SQL 查询功能。 利用MapReduce去查询数据文件中的某些内…

ESRALLY安装与使用

ESRALLY安装与使用 geonames、geopoint:都是和地理位置相关的,如果需要测试ES在地理位置处理的性能可以选用 http_logs:是http_server的,如果要测服务器日志、redis日志、apache日志可以选用 说明:esrally 自带的测试数据即为 rally_track 文件夹中的内容,主要包括: Ge…

默认路由:实现内网所有网段流量走一条默认路由访问外网

默认路由 Tip&#xff1a;默认路由一般指出口网关设备的出口路由。实现所有网段流量都走一条路由。 实验模拟&#xff1a;公司内部pc 通过出口网关 访问运营商内部 baidu服务 isp网关配置&#xff1a; <Huawei>sy Enter system view, return user view with CtrlZ. …

算法工程师重生之第四十四天(岛屿数量 深搜 广搜 岛屿的最大面积)

参考文献 代码随想录 一、岛屿数量 题目描述 给定一个由 1&#xff08;陆地&#xff09;和 0&#xff08;水&#xff09;组成的矩阵&#xff0c;你需要计算岛屿的数量。岛屿由水平方向或垂直方向上相邻的陆地连接而成&#xff0c;并且四周都是水域。你可以假设矩阵外均被水包…

搭建你的私人云盘:使用File Browser与cpolar实现公网传输文件

文章目录 前言1.下载安装File Browser2.启动访问File Browser3.安装cpolar内网穿透3.1 注册账号3.2 下载cpolar客户端3.3 登录cpolar web ui管理界面3.4 创建公网地址 4.固定公网地址访问 前言 File Browser是一个开源的文件管理器和文件共享工具&#xff0c;它可以帮助用户轻…

【C++】布隆过滤器的概念与特点解析

&#x1f308; 个人主页&#xff1a;谁在夜里看海. &#x1f525; 个人专栏&#xff1a;《C系列》《Linux系列》 ⛰️ 天高地阔&#xff0c;欲往观之。 目录 00.引入 01.布隆过滤器的概念 特点1&#xff1a;极低的内存消耗 特点2&#xff1a;快速查询 特点3&#xff1a;假阳…

深入解析:云计算与虚拟化技术

&#x1f493; 博客主页&#xff1a;瑕疵的CSDN主页 &#x1f4dd; Gitee主页&#xff1a;瑕疵的gitee主页 ⏩ 文章专栏&#xff1a;《热点资讯》 # 深入解析&#xff1a;云计算与虚拟化技术 文章目录 云计算概述定义服务模型部署模型 虚拟化技术定义类型关键技术 云计算与虚…

Mybatis查询数据库,返回List集合,集合元素也是List。

#有时间需求会要求&#xff1a;查询全校的学生数据&#xff0c;且学生数据按班级划分。那么就需要List<List<user>>类型的数据。 SQL语句 SELECT JSON_ARRAYAGG(JSON_OBJECT(name , name ,BJMC, BJMC ,BJBH,BJBH)) as dev_user FROM dev_user WHERE project_id …

105. UE5 GAS RPG 搭建主菜单

在这一篇&#xff0c;我们将实现对打开游戏显示的主菜单进行搭建&#xff0c;主菜单将显示游戏主角&#xff0c;游戏名称和进入游戏和退出游戏两个按钮。 搭建菜单场景 我们将主菜单设置为一个单独的场景&#xff0c;前面可以显示对应的UI控件&#xff0c;用于玩家操作&#…

时间序列预测(十八)——实现配置管理和扩展命令行参数解析器

如图&#xff0c;这是一个main,py文件&#xff0c;在此代码中&#xff0c;最开始定义了许多模型参数&#xff0c;为了使项目更加灵活和可扩展&#xff0c;便于根据不同的需求调整参数和配置&#xff0c;可以根据实际需要扩展参数和配置项。 下面是如何实现配置管理和扩展命令行…

Ubuntu用docker安装AWVS和Nessus(含破解)

Ubuntu安装AWVS(更多搜索&#xff1a;超详细Ubuntu用docker安装AWVS和Nessus) 首先安装docker&#xff0c;通过dockers镜像安装很方便&#xff0c;且很快&#xff1b;Docker及Docker-Compose-安装教程。 1.通过docker search awvs命令查看镜像&#xff1b; docker search awvs…

QT for android 问题总结(QT 5.15.2)

1.配置好的sdk&#xff0c;显示设置失败 Android SDK Command-line Tools run. Android Platform-Tools installed. Command-line Tools (latest) 版本过高导致报错 &#xff0c;下载一个低版本的latest &#xff0c;替换掉之前latest中的文件。即可&#xff0c;latest 路径如…

Jmeter5.X性能测试

Jmeter5.X性能测试 文章目录 Jmeter5.X性能测试一、掌握Http基础协议1.1 浏览器的B/S架构和C/S架构1.2 HyperText Transfer Protocol 超文本传输协议1.3 超文本传输协议Http消息体拆分讲解1.4 HTTP的九种请求方法和响应码介绍1.5 Http请求头/响应头1.6 Http常见请求/响应头cont…