【花雕动手做】ASRPRO语音识别(39)---语音控制180度SG90舵机模块

在这里插入图片描述
本例实验使用180度SG90舵机模块

在这里插入图片描述

舵机
是一种位置伺服的驱动器,主要是由外壳、电路板、无核心马达、齿轮与位置检测器所构成。其工作原理是由接收机或者单片机发出信号给舵机,其内部有一个基准电路,产生周期为20ms,宽度为1.5ms 的基准信号,将获得的直流偏置电压与电位器的电压比较,获得电压差输出。经由电路板上的IC 判断转动方向,再驱动无核心马达开始转动,透过减速齿轮将动力传至摆臂,同时由位置检测器送回信号,判断是否已经到达定位。适用于那些需要角度不断变化并可以保持的控制系统。当电机转速一定时,通过级联减速齿轮带动电位器旋转,使得电压差为0,电机停止转动。一般舵机旋转的角度范围是0 度到180 度。

在这里插入图片描述

SG9

ESP32可以通过其强大的处理能力和外设支持来实现语音控制舵机的功能。以下是基于Espressif提供的官方框架——ESP-IDF的一个简单示例代码思路: ### 硬件需求: 1. **ESP32模块** - 主控芯片。 2. **麦克风模块** 或者直接通过ESP32自带ADC输入音频信号。 3. **SG90或其他型号舵机**。 ### 软件环境搭建: 需要安装并配置好`ESP-IDF`开发环境,并熟悉基本操作如编译、烧录等流程。 --- #### 示例代码概述 下面是一个简化版的伪代码结构,展示如何利用ESP32捕获声音数据并通过FFT分析频率特性后控制舵机变化的过程。 ```c #include <stdio.h> #include "driver/i2s.h" #include "freertos/FreeRTOS.h" #include "freertos/task.h" #define SERVO_PIN GPIO_NUM_18 // 定义舵机的GPIO口 #define SAMPLE_RATE_HZ (4000) // 设置采样率 Hz // 配置I2S用于录音 void i2s_config() { i2s_config_t i2s_conf = { .mode = I2S_MODE_MASTER | I2S_MODE_RX, .sample_rate = SAMPLE_RATE_HZ, .bits_per_sample = I2S_BITS_PER_SAMPLE_16BIT, .channel_format = I2S_CHANNEL_FMT_ONLY_LEFT, .communication_format = I2S_COMM_FORMAT_I2S_LSB, .intr_alloc_flags = 0, .dma_buf_count = 8, .dma_buf_len = 512, .use_apll = false, .tx_desc_auto_clear = true, .fixed_mclk = 0}; i2s_driver_install(I2S_PORT, &i2s_conf, 0, NULL); } // 初始化PWM波形生成以驱动舵机 void servo_init() { ledc_timer_config_t timer_conf; memset(&timer_conf, 0x00, sizeof(timer_conf)); timer_conf.duty_resolution = LEDC_TIMER_13_BIT; // 分辨率为最大值的一半(即2^13) timer_conf.freq_hz = 50 ; // PWM频率设置为50Hz (标准伺服电机工作频) timer_conf.speed_mode = LEDC_LOW_SPEED_MODE ; timer_conf.timer_num = LEDC_TIMER_0 ; ledc_timer_config(&timer_conf); ledc_channel_config_t channel_conf; memset(&channel_conf, 0x00, sizeof(channel_conf)); channel_conf.gpio_num = SERVO_PIN ; channel_conf.channel = LEDC_CHANNEL_0 ; channel_conf.duty = 0 ; channel_conf.hpoint = 0 ; channel_conf.speed_mode = LEDC_LOW_SPEED_MODE ; channel_conf.timer_sel = LEDC_TIMER_0; ledc_channel_config(&channel_conf); } // 根据音量调整舵机位置 int adjust_servo_angle(int volume_level){ int angle = map(volume_level , MIN_VOLUME_LEVEL , MAX_VOLUME_LEVEL , 0 , 180); float duty_cycle = ((float)(angle + 1)) / 20 * powf(2,LEDC_TIMER_13_BIT); printf("Setting Servo Angle to %d\n", angle ); ledc_set_duty(LEDC_LOW_SPEED_MODE , LEDC_CHANNEL_0,duty_cycle); ledc_update_duty(LEDC_LOW_SPEED_MODE , LEDC_CHANNEL_0); } void app_main(){ servo_init(); // 初始化舵机控制功能 i2s_config(); // 启动I2S收器获取模拟声音信息 short audio_buffer[512]; // 缓冲区存储采集到的声音样本点数 while(true){ size_t bytes_read=0; i2s_read(I2S_PORT,audio_buffer,sizeof(audio_buffer),&bytes_read,portMAX_DELAY); // 对buffer里的内容做简单的幅求和得到粗略估计响数值... int total_sum =0; for(size_t j=0;j<sizeof(audio_buffer)/sizeof(short)-1;++j ){ if(abs((short )audio_buffer[j]) >THRESHOLD_NOISE_CUT_OFF_VALUE){ total_sum += abs((short )audio_buffer[j]); } } delayMicroseconds(ANALYSIS_TIME_WINDOW_US); // 模拟一个短时间内的平均计算周期 adjust_servo_angle(total_sum/AUDIO_SAMPLES_TO_AVERAGE_OVER); } } ``` 注意以上仅为参考架构设计,实际应用中还需要考虑更多细节比如噪音过滤、精确声纹匹配算法集成等等。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

驴友花雕

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值