当前位置: 首页 > news >正文

基于STM32F103C8的循迹避障小车V6设计及Proteus仿真(含C语言Keil工程与仿...

项目:循迹避障小车V6——基于STM32F103C8的循迹-避障-灭火小车设计 设计;proteus 仿真(版本8.15-可提供软件安装包) 主控:STM32F103C8 外设:OLED ,红外循迹传感器,超声波传感器,电机L298N,按键,舵机,继电器,蜂鸣器,DS18B20 功能: 1. 2 路红外循迹 2. 1 路超声波避障 3. 2路PWM 调速控制 4. OLED 显示运行模式 5. L298N电机驱动(2轮) 6. 舵机驱动 7. 温度测量DS18B20 8. 蜂鸣器报警 9. 继电器电机控制 10. 按键切换模式 程序:C语言,KEIL工程(注释详细,工程目录清晰,代码格式明了) 服务:可代码,电路原理,如需实物可加工制作(费用另算) 本条包括:c语言(keil工程)+proteus仿真文件 注:stm32仿真版本为 8.15

今天,我决定给大家分享一个有趣的STM32项目——循迹避障小车V6的设计与实现。这个项目结合了循迹、避障、温度监测等功能,还加入了灭火模式,听起来是不是有点酷?让我带大家一步步拆解它的设计思路和实现细节。


项目概述

这个小车基于STM32F103C8主控芯片,通过多种外设协同工作,实现以下功能:

  1. 循迹功能:通过2路红外传感器识别黑线。
  2. 避障功能:利用超声波传感器检测前方障碍物。
  3. PWM调速:通过L298N驱动模块控制电机速度。
  4. OLED显示:实时显示运行模式和状态信息。
  5. 温度监测:使用DS18B20传感器测量环境温度。
  6. 灭火模式:通过继电器控制灭火装置(理论上支持,实际未测试)。
  7. 蜂鸣器报警:在异常情况下发出警报声。

听起来像是一个全能型的小车,对吧?接下来我们将详细拆解它的设计与实现。


硬件平台选择

我们选择了STM32F103C8作为主控,它的性能在小车项目中绰绰有余,而且性价比很高。接下来是外设的选择:

  • 红外传感器:用于循迹,价格便宜,容易获取。
  • HC-SR04超声波传感器:常用的避障传感器,精度不错。
  • OLED显示屏:显示信息直观,体积小巧。
  • L298N电机驱动:支持PWM调速,适合两轮驱动的小车。
  • DS18B20温度传感器:支持单总线通信,精度高。

此外,项目还使用了舵机和蜂鸣器,前者用于角度调整(理论上可以扩展更多功能),后者用于报警。


软件开发环境

我们使用了KEIL C语言进行开发,工程结构清晰,注释详细。对于仿真,使用了Proteus 8.15,版本比较经典,资源丰富(安装包可以找我获取)。


功能模块实现

1. 红外传感器循迹

循迹功能是小车的核心之一。我们使用了2路红外传感器,传感器输出低电平表示检测到黑线。通过检测左右传感器的输出,小车可以判断当前的行驶状态(如跑偏、直行等)。

代码片段:

// 红外传感器状态读取 void IR_Init(void) { GPIO_InitTypeDef GPIO_InitStructure; RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE); GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5 | GPIO_Pin_4; // 左右传感器接PB4和PB5 GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPD; // 下拉输入 GPIO_InitStructure.GPIO_Speed = GPIO_Speed_2MHz; GPIO_Init(GPIOB, &GPIO_InitStructure); } // 读取传感器状态 uint8_t IR_Read(void) { uint8_t left = GPIO_ReadInputDataBit(GPIOB, GPIO_Pin_5); uint8_t right = GPIO_ReadInputDataBit(GPIOB, GPIO_Pin_4); // 0表示检测到黑线 return (left << 1) | right; }

2. 超声波避障

超声波传感器的实现相对简单,主要利用定时器测量回波时间来计算距离。当检测到障碍物时,小车会减速或停车,避免碰撞。

代码片段:

// 超声波传感器初始化 void Ultrasonic_Init(void) { GPIO_InitTypeDef GPIO_InitStructure; RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB | RCC_APB2Periph_GPIOC | RCC_APB2Periph_TIM4, ENABLE); // 触发引脚(PB8)配置为推挽输出 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_2MHz; GPIO_Init(GPIOB, &GPIO_InitStructure); // 回波引脚(PC1)配置为下降沿中断 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPD; GPIO_Init(GPIOC, &GPIO_InitStructure); // 配置定时器TIM4 TIM_TimeBaseInitTypeDef TIM_InitStructure; TIM_InitStructure.TIM_Period = 0xFFFF; // 最大周期 TIM_InitStructure.TIM_Prescaler = 72-1; // 72MHz时钟分频 TIM_InitStructure.TIM_TriggerSelection = TIM TriggerSelection_None; TIM_InitStructure.TIM_CounterMode = TIM_CounterMode_Up; TIM_InitStructure.TIM_ClockDivision = TIM_ClockDivision_CKD_N; TIM_Init(TIM4, &TIM_InitStructure); // 使能中断 NVIC_InitTypeDef NVIC_InitStructure; NVIC_InitStructure.NVIC_IRQChannel = TIM4_IRQn; NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0x0F; NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0; NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; NVIC_Init(&NVIC_InitStructure); // 使能定时器 TIM_Cmd(TIM4, ENABLE); } // 回波中断处理 void TIM4_IRQHandler(void) { if (TIM_GetITStatus(TIM4, TIM_IT_Update) != RESET) { // 计算距离(具体实现略) uint16_t distance = ...; if (distance < 20) { // 触发避障逻辑 Car_Stop(); Beeper_Play(); } TIM_ClearITPendingBit(TIM4, TIM_IT_Update); } }

3. PWM调速与电机控制

L298N驱动模块通过PWM信号控制电机的速度。我们实现了两种控制方式:手动控制(按键切换)和自动控制(根据避障逻辑调整速度)。

项目:循迹避障小车V6——基于STM32F103C8的循迹-避障-灭火小车设计 设计;proteus 仿真(版本8.15-可提供软件安装包) 主控:STM32F103C8 外设:OLED ,红外循迹传感器,超声波传感器,电机L298N,按键,舵机,继电器,蜂鸣器,DS18B20 功能: 1. 2 路红外循迹 2. 1 路超声波避障 3. 2路PWM 调速控制 4. OLED 显示运行模式 5. L298N电机驱动(2轮) 6. 舵机驱动 7. 温度测量DS18B20 8. 蜂鸣器报警 9. 继电器电机控制 10. 按键切换模式 程序:C语言,KEIL工程(注释详细,工程目录清晰,代码格式明了) 服务:可代码,电路原理,如需实物可加工制作(费用另算) 本条包括:c语言(keil工程)+proteus仿真文件 注:stm32仿真版本为 8.15

代码片段:

// PWM初始化 void PWM_Init(void) { GPIO_InitTypeDef GPIO_InitStructure; RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_TIM2, ENABLE); GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5 | GPIO_Pin_6; // PWM输出引脚 GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_2MHz; GPIO_Init(GPIOA, &GPIO_InitStructure); // 配置TIM2 TIM_TimeBaseInitTypeDef TIM_InitStructure; TIM_InitStructure.TIM_Period = 999; // PWM周期 TIM_InitStructure.TIM_Prescaler = 720-1; // 频率约1kHz TIM_InitStructure.TIM_TriggerSelection = TIM TriggerSelection_None; TIM_InitStructure.TIM_CounterMode = TIM_CounterMode_Up; TIM_Init(TIM2, &TIM_InitStructure); // 启动PWM TIM_Cmd(TIM2, ENABLE); } // 设置电机速度 void Car_Speed(uint16_t duty) // duty范围0-100% { // 通过改变PWM占空比控制速度 if (duty > 100) duty = 100; TIM_SetCompare1(TIM2, (duty * 10) / 100); // 调整占空比(具体逻辑略) }

OLED显示与按键控制

OLED显示部分使用了SSD1306驱动的OLED屏,通过I2C接口与STM32通信。按键用于切换运行模式(手动/自动)。显示内容包括当前模式、传感器状态、温度信息等。

代码片段:

// OLED显示模式切换 void OLED_Show_Mode(uint8_t mode) { char buffer[20]; sprintf(buffer, "Mode: %d", mode); OLED_Write_String(0, 0, buffer); } // 按键中断处理 void EXTI0_IRQHandler(void) { if (EXTI_GetITStatus(EXTI_Line0) != RESET) { // 切换模式逻辑 if (current_mode == AUTO_MODE) current_mode = MANUAL_MODE; else current_mode = AUTO_MODE; // 更新显示 OLED_Show_Mode(current_mode); EXTI_ClearITPendingBit(EXTI_Line0); } }

总结与展望

这个循迹避障小车项目从硬件到软件的设计都非常经典,能够帮助大家掌握STM32的外设开发、PWM控制、中断处理等关键技术。虽然它只是一个小项目,但可以通过扩展实现更多功能,比如加入无线通信模块(如Wi-Fi或蓝牙)实现远程控制,或者加入摄像头模块实现更复杂的图像识别功能。

如果你对这个项目感兴趣,可以联系我获取KEIL工程和Proteus仿真文件,我也可以提供实物制作服务(费用另算)。希望大家能够通过这个项目学到更多stm32开发知识,也期待看到你们的改进建议和优秀作品!

http://www.jsqmd.com/news/535175/

相关文章:

  • Wan2.1-umt5构建行业搜索引擎:基于语义理解的精准信息检索
  • Anaconda+Pycharm环境下Pytorch CPU版安装避坑指南(附虚拟环境配置技巧)
  • 禅道测试用例 RAG 系统 1:从 SQL 到智能问答,手把手搭建测试专家助手
  • 2026年目前热门的棕刚玉品牌推荐,棕刚玉企业诚信金钢砂专注产品质量 - 品牌推荐师
  • NumPy 函数手册:聚合与统计
  • 救命!论文DDL只剩3天?这几款AI工具帮你5分钟搞定初稿,知网查重仅10%
  • Oracle 11g在Windows上的快速部署:使用Docker容器简化安装与配置
  • Pi0与卷积神经网络结合:视觉语言动作模型部署指南
  • 保姆级教程:用VMware虚拟机+cpolar内网穿透,5分钟搞定Home Assistant远程访问
  • CTFSHOW国赛漏洞解析:Unzip软连接攻击实战
  • 26春 日总结11
  • Stable Diffusion镜像免配置优势:Pixel Fashion Atelier Docker镜像体积仅2.3GB
  • 技术降本实测:矩阵跃动龙虾机器人全自动运营,月省2.9万运营成本的落地案例
  • 单调队列优化多重背包 学习笔记 详解
  • mysql的主从配置
  • 电商API接口数据采集与应用行业分析
  • AI正在淘汰的不是程序员,而是这3类人(看完你就明白了)
  • 差分曼彻斯特编码这东西挺有意思的,每个比特中间必须跳变,数据本身由比特开始处有无跳变决定。今天咱们直接撸Verilog代码,看看怎么在硬件层面实现编解码
  • B2B行业实测:矩阵跃动小陌GEO助力询盘增长180%+,AI获客转化技术拆解
  • OpenClaw+GLM-4.7-Flash:个人健康管理助手
  • 工业上位机开发实战:基于.NET 6和CIP协议,5分钟搞定与ControlLogix PLC的数据对接
  • Halcon数组分析实战:5分钟搞定极值定位与可视化(附完整代码)
  • WVP-GB28181-Pro技术深度解析:国标视频监控平台的架构演进与行业价值重塑
  • NumPy 函数手册:条件筛选与逻辑运算
  • OpenClaw的安全反思——如果你跟OpenClaw说“我讨厌我老婆”,一分钟后它告诉你“我已经把她干掉了”,你是什么心情?
  • C++开发者必看:nlohmann::json实战避坑指南(含性能优化技巧)
  • 7×24小时无人值守:矩阵跃动龙虾机器人+GEO,AI流量闭环效率实测报告
  • 解决提示词「卡壳」难题:架构师的3个创新实践破解法
  • 云原生架构设计:新手入门的核心原则
  • 5个步骤掌握TinyMaix:从环境搭建到边缘部署