基于STM32的智能声音跟随小车设计

news2024/12/27 18:36:27
引言

本项目基于STM32微控制器设计了一个智能声音跟随小车,通过集成麦克风阵列实现声音源定位和跟随功能。该系统可以检测环境中的声音信号,如手掌拍击声或语音指令,驱动小车向声源方向移动。项目涉及硬件设计、声音信号处理算法以及电机控制模块的实现,适用于家庭娱乐、智能小车开发和机器人教育等场景。本文将详细介绍系统的设计思路和具体实现步骤。

环境准备
1. 硬件设备
  • STM32F103C8T6开发板(或其他 STM32 系列):作为小车的控制核心。

  • 麦克风阵列模块(如MAX9814):用于获取环境中的声音信号,实现声音源方向的定位。

  • 电机驱动模块(如L298N):用于驱动小车的直流电机,实现小车的前进、后退和转向。

  • 直流电机:小车的驱动电机,为小车提供动力。

  • 电源模块:为STM32和电机驱动模块供电。

  • 舵机(可选):用于旋转麦克风阵列,实现更精确的声音源定位。

2. 软件工具
  • STM32CubeMX:用于配置STM32的外设并生成代码框架。

  • Keil uVision 或 STM32CubeIDE:用于编写、调试和下载代码。

  • ST-Link驱动程序:用于将程序下载到STM32开发板。

  • 串口调试工具:用于调试声音信号处理和小车控制。

项目实现
1. 硬件连接
  • 麦克风阵列模块:连接至STM32的ADC引脚(如PA0, PA1, PA2),用于获取多个方向的声音信号。

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

  • 舵机(可选):连接至STM32的PWM输出引脚(如PA7),用于旋转麦克风阵列,以扫描不同方向的声音源。

  • 电源模块:提供3.3V或5V电压以供STM32和其他模块运行。

2. STM32CubeMX 配置
  • 选择开发板型号:在STM32CubeMX中选择STM32F103C8T6。

  • 配置系统时钟:设置系统时钟为HSI,确保系统稳定运行。

  • 配置ADC:用于与麦克风阵列模块进行通信,获取声音信号的幅度和方向信息。

  • 配置PWM:设置用于电机驱动和舵机控制的PWM输出。

  • 配置GPIO:用于电机控制和其他外设连接。

  • 生成代码:选择Keil或STM32CubeIDE作为工具链,生成代码框架。

3. 编写主程序

基于生成的代码框架,编写声音信号处理、声源定位和小车控制的逻辑代码,以下为智能声音跟随小车系统的核心代码示例:

#include "stm32f1xx_hal.h"

// 定义引脚
#define LEFT_MOTOR_IN1 GPIO_PIN_3
#define LEFT_MOTOR_IN2 GPIO_PIN_4
#define RIGHT_MOTOR_IN1 GPIO_PIN_5
#define RIGHT_MOTOR_IN2 GPIO_PIN_6
#define MOTOR_PORT GPIOA
#define MIC1_PIN GPIO_PIN_0
#define MIC2_PIN GPIO_PIN_1
#define MIC3_PIN GPIO_PIN_2
#define MIC_PORT GPIOA
#define SERVO_PWM_PIN GPIO_PIN_7

// 变量声明
uint16_t mic1_value, mic2_value, mic3_value;
uint8_t direction;

// 函数声明
void Sound_Direction_Detection(void);
void Motor_Control(uint8_t leftSpeed, uint8_t rightSpeed, uint8_t direction);

// 声音方向检测函数
void Sound_Direction_Detection(void) {
    // 读取麦克风的ADC值
    HAL_ADC_Start(&hadc1);
    if (HAL_ADC_PollForConversion(&hadc1, HAL_MAX_DELAY) == HAL_OK) {
        mic1_value = HAL_ADC_GetValue(&hadc1);
    }
    HAL_ADC_Start(&hadc1);
    if (HAL_ADC_PollForConversion(&hadc1, HAL_MAX_DELAY) == HAL_OK) {
        mic2_value = HAL_ADC_GetValue(&hadc1);
    }
    HAL_ADC_Start(&hadc1);
    if (HAL_ADC_PollForConversion(&hadc1, HAL_MAX_DELAY) == HAL_OK) {
        mic3_value = HAL_ADC_GetValue(&hadc1);
    }
    HAL_ADC_Stop(&hadc1);

    // 判断声音来源方向
    if (mic1_value > mic2_value && mic1_value > mic3_value) {
        direction = 1; // 声音来自左侧
    } else if (mic2_value > mic1_value && mic2_value > mic3_value) {
        direction = 2; // 声音来自前方
    } else if (mic3_value > mic1_value && mic3_value > mic2_value) {
        direction = 3; // 声音来自右侧
    }
}

// 电机控制函数
void Motor_Control(uint8_t leftSpeed, uint8_t rightSpeed, uint8_t direction) {
    if (direction == 1) { // 声音来自左侧,小车向左转
        HAL_GPIO_WritePin(MOTOR_PORT, LEFT_MOTOR_IN1, GPIO_PIN_RESET);
        HAL_GPIO_WritePin(MOTOR_PORT, LEFT_MOTOR_IN2, GPIO_PIN_SET);
        HAL_GPIO_WritePin(MOTOR_PORT, RIGHT_MOTOR_IN1, GPIO_PIN_SET);
        HAL_GPIO_WritePin(MOTOR_PORT, RIGHT_MOTOR_IN2, GPIO_PIN_RESET);
    } else if (direction == 3) { // 声音来自右侧,小车向右转
        HAL_GPIO_WritePin(MOTOR_PORT, LEFT_MOTOR_IN1, GPIO_PIN_SET);
        HAL_GPIO_WritePin(MOTOR_PORT, LEFT_MOTOR_IN2, GPIO_PIN_RESET);
        HAL_GPIO_WritePin(MOTOR_PORT, RIGHT_MOTOR_IN1, GPIO_PIN_RESET);
        HAL_GPIO_WritePin(MOTOR_PORT, RIGHT_MOTOR_IN2, GPIO_PIN_SET);
    } else { // 声音来自前方,小车向前
        HAL_GPIO_WritePin(MOTOR_PORT, LEFT_MOTOR_IN1, GPIO_PIN_SET);
        HAL_GPIO_WritePin(MOTOR_PORT, LEFT_MOTOR_IN2, GPIO_PIN_RESET);
        HAL_GPIO_WritePin(MOTOR_PORT, RIGHT_MOTOR_IN1, GPIO_PIN_SET);
        HAL_GPIO_WritePin(MOTOR_PORT, RIGHT_MOTOR_IN2, GPIO_PIN_RESET);
    }
    __HAL_TIM_SET_COMPARE(&htim1, TIM_CHANNEL_1, leftSpeed);
    __HAL_TIM_SET_COMPARE(&htim1, TIM_CHANNEL_2, rightSpeed);
}

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

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

    while (1) {
        Sound_Direction_Detection();  // 声音方向检测
        Motor_Control(100, 100, direction);  // 控制小车移动
    }
}

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

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

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

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

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

 

4. 声音源定位与跟随

通过麦克风阵列模块检测不同方向的声音强度,结合信号处理算法,判断声音源的方向,并驱动小车朝声音方向移动,实现声音跟随功能。

5. 声音处理与电机控制

根据麦克风阵列获取的声音信号,通过ADC转换为数值,再根据不同方向的麦克风信号强度差异,判断声源方向,并相应地控制电机驱动小车前进、后退或转向。

6. 舵机扫描(可选)

通过舵机旋转麦克风阵列,可以实现更广范围的声音源扫描,进一步提高声音定位的精度和小车的响应能力。

智能控制原理
  • 声音源定位:通过多个麦克风模块检测环境中的声音信号,判断声音的来源方向。

  • 小车移动控制:根据声音来源方向,控制小车前进、后退或转向,实现声音跟随。

  • 舵机扫描(可选):通过舵机控制麦克风的旋转,增强系统对声源定位的能力。

常见问题与解决方法
  • 声音定位不准确

    • 确保麦克风模块的位置均匀分布,减少环境噪声的干扰。

    • 增加信号处理算法,过滤掉背景噪声,提高定位精度。

  • 小车行驶不稳定

    • 检查电机和电机驱动模块的连接,确保PWM信号稳定。

    • 确认小车的电池供电充足,避免供电不足导致行驶不稳。

结论

该基于STM32的智能声音跟随小车系统通过麦克风阵列实现了声源定位,并结合电机驱动模块实现了对声音的自动跟随功能。系统能够识别并响应环境中的声音信号,自动朝着声源方向移动,为智能机器人技术提供了良好的实践基础。该系统适用于家庭娱乐、智能小车开发和机器人教育等场景,展示了智能声音交互的潜力。

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

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

相关文章

Bruno解决SSL验证问题

在测试接口的时候,我使用的是Bruno这个软件,开源离线的API测试软件。 主页是这样子的 今天在测试一个HTTPS的接口时候,因为这个HTTPS接口是用的是自签证书,所以就报错误了。 Error invoking remote method send-http-request: …

【论文速读】| APOLLO:一种基于 GPT 的用于检测钓鱼邮件并生成警告用户的解释的工具

基本信息 原文标题:APOLLO: A GPT-based tool to detect phishing emails and generate explanations that warn users 原文作者:Giuseppe Desolda, Francesco Greco, Luca Vigan 作者单位:University of Bari “A. Moro”, Italy, King’…

jfrog artifactory oss社区版,不支持php composer私库

一、docker安装 安装环境:centos操作系统,root用户。 如果是mac或ubuntu等操作系统的话,会有许多安装的坑等着你。 一切都是徒劳,安装折腾那么久,最后还是不能使用。这就是写本文的初衷,切勿入坑就对了。 …

WindowsDocker安装到D盘,C盘太占用空间了。

Windows安装 Docker Desktop的时候,默认位置是安装在C盘,使用Docker下载的镜像文件也是保存在C盘,如果对Docker使用评率比较高的小伙伴,可能C盘空间,会被耗尽,有没有一种办法可以将Docker安装到其它磁盘,同时Docker的数据文件也保存在其他磁盘呢? 答案是有的,我们可以…

vue常见题型(1-10)

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 2.2双向绑定的原理是什么vue框架采用的是数据双向绑定的方式,由三个重要部分构成2.2.1.ViewModel2.2.2 双向绑定2.2.3.1.编译Compile2.2.3.2.依赖收集 3…

python怎么将字符串转换为数字

python如何将列表中的字符串转为数字?具体方法如下: 有一个数字字符的列表: numbers [1, 5, 10, 8] 想要把每个元素转换为数字: numbers [1, 5, 10, 8] 用一个循环来解决: new_numbers []; for n in numbers:new_n…

大数据新视界 -- 大数据大厂之 Impala 性能优化:解锁大数据分析的速度密码(上)(1/30)

💖💖💖亲爱的朋友们,热烈欢迎你们来到 青云交的博客!能与你们在此邂逅,我满心欢喜,深感无比荣幸。在这个瞬息万变的时代,我们每个人都在苦苦追寻一处能让心灵安然栖息的港湾。而 我的…

Flutter 插件 sliding_up_panel 实现从底部滑出的面板

前言 sliding_up_panel 是一个 Flutter 插件,用于实现从底部滑出的面板。它在设计上非常灵活,能够适应多种 UI 场景,比如从底部滑出的菜单、可拖动的弹出面板等。以下是 sliding_up_panel 的详细用法,包括常用的参数说明和示例代…

大客户营销数字销售实战讲师培训讲师唐兴通专家人工智能大模型销售客户开发AI大数据挑战式销售顾问式销售专业销售向高层销售业绩增长创新

唐兴通 销售增长策略专家、数字销售实战导师 专注帮助企业构建面向AI数字时代新销售体系,擅长运用数字化工具重塑销售流程,提升销售业绩。作为《挑战式销售》译者,将全球顶尖销售理论大师马修狄克逊等理论导入中国销售业界。 核心专长&…

es数据同步(仅供自己参考)

数据同步的问题分析: 当MySQL进行增删改查的时候,数据库的数据有所改变,这个时候需要修改es中的索引库的值,这个时候就涉及到了数据同步的问题 解决方法: 1、同步方法: 当服务对MySQL进行增删改的时候&…

入门车载以太网(3) -- 网络层

目录 1. 网络通信示例 2. IP地址类别 3. IP数据报 4. 小结 今天继续车载以太网,聊聊网络层。 1. 网络通信示例 我们首先回顾车载以太网的数据传输模型。 从7层开始(车载以太网模糊了5-7层,统称应用层),每个中间层都为上层提供功能&…

六个核桃斥资千万研究脑健康,核桃健脑作用科学具象化了

健康,是这两年热度居高不下的社会话题。对健康的追求影响了诸多领域的发展,上至尖端科研,下至日常接触的食品饮料,都已被卷入大势。 其中,“脑健康”这个听起来更前沿的话题,又已经成为格外重要的一个领域…

基于Multisim光控夜灯LED电路(含仿真和报告)

【全套资料.zip】光控夜灯LED电路设计Multisim仿真设计数字电子技术 文章目录 功能一、Multisim仿真源文件二、原理文档报告资料下载【Multisim仿真报告讲解视频.zip】 功能 1.采用纯数字电路,非单片机。 2.通过检测周围光线,光线暗且有声音时自动开灯…

【go从零单排】go中的基本数据类型和变量

Don’t worry , just coding! 内耗与overthinking只会削弱你的精力,虚度你的光阴,每天迈出一小步,回头时发现已经走了很远。 基本类型 go中的string、int、folat都可以用连接boolen可以用逻辑表达式计算 package mainimport "fmt&quo…

前端学习笔记—Vue3特性

一、 Vue3与Vite构建工具简介 image.png image.png image.png image.png Vite构建工具(其他的打包工具有webpack,grunt,gulp) image.png image.png 构建 二、创建Vue3项目 vite在TypeScript结合使用上,直接开箱即用&am…

DICOM标准:DICOM图像核心属性概念详解——关于参考帧、病人位置、病人方位、图像位置和图像方向、切片位置、图像像素等重要概念解析

目录 1、参考帧模块属性 2、模态(Modality): 3、病人位置(Patient Position): 4、 病人方位(Patient Orientation): 5、 图像位置和图像方向: 6、切片位置 7、图像像素模块 7.1 图像像素属性描述 7.1.1 每个像素的样本 7.1.2 光度解释 7.1.3 平面结构 7.1.…

短视频矩阵系统的源码, OEM贴牌源码

针对矩阵短视频系统的源码功能设计,我们开发设计了以下核心模块: 1. 短视频一键发布功能:允许用户快速、便捷地发布短视频内容 2. 批量图文剪辑:支持同时编辑和处理多张图片与文本的组合,提高编辑效率 3. 批量剪辑短…

6款IntelliJ IDEA插件,让Spring和Java开发如虎添翼

文章目录 1、SonarLint2、JRebel for IntelliJ3、SwaggerHub插件4、Lombok插件5、RestfulTool插件6、 Json2Pojo插件7、结论 对于任何Spring Boot开发者来说,两个首要的目标是最大限度地提高工作效率和确保高质量代码。IntelliJ IDEA 是目前最广泛使用的集成开发环境…

新能源汽车与公共充电桩布局

近年来,全球范围内对新能源汽车产业的推动力度不断增强,中国新能源汽车市场也呈现蓬勃发展的势头,在政策与市场的共同推动下,新能源汽车销量持续增长。然而,据中国充电联盟数据显示,充电基础设施建设滞后于新能源汽车数量增长的现状导致充电桩供需不平衡,公共充电桩服务空白区域…

健身房管理智能化:SpringBoot技术指南

摘要 随着信息技术在管理上越来越深入而广泛的应用,管理信息系统的实施在技术上已逐步成熟。本文介绍了健身房管理系统的开发全过程。通过分析健身房管理系统管理的不足,创建了一个计算机管理健身房管理系统的方案。文章介绍了健身房管理系统的系统分析部…