Arduino入门教程26-指针式噪音计
本帖最后由 zoey不种土豆 于 2024-12-31 17:00 编辑在这个项目中,我们将学习如何使用Arduino、麦克风和舵机来创建一个有趣的互动装置。将声音强度信息通过Arduino转换为舵机的旋转角度,使得舵机的叶片能够随着声音的大小而转动,从而直观地展示声音的变化。
元件清单
硬件连接
图 1 指针式噪音计
示例代码//项目 - 指针式噪音计
#include <Servo.h>
// 定义声音传感器
const int soundSensorPin = A0; // 声音传感器连接到A0
Servo myservo;// 创建舵机对象
const float alpha = 0.1;
// 滤波因子,介于0和1之间,数值越小滤波效果越强
float filteredValue = 0;// 经过滤波后的声音传感器值
void setup() {
pinMode(soundSensorPin, INPUT);
Serial.begin(9600);
myservo.attach(13);
}
void loop() {
// 读取声音传感器的值
int sensorValue = analogRead(soundSensorPin);
Serial.println(sensorValue);
// 应用指数移动平均滤波器
filteredValue = alpha * sensorValue + (1 - alpha) * filteredValue;
// 通过串口监视器打印滤波后的声音传感器值
Serial.print("滤波后的声音值: ");
Serial.println(filteredValue);
// 将滤波后的声音值映射到舵机的位置范围(通常是0到180度)
int servoPos = map(filteredValue, 0, 1023, 0, 180);
// 控制舵机转动到指定位置
myservo.write(servoPos);
// 延时一小段时间,以便于舵机稳定
delay(100);
}
上传代码后,对着麦克风发出声音,舵机的叶片会发生转动。根据声音的音量大小,转动的角度会有所不同。
代码回顾
由于麦克风传输出的信号不是稳定平滑的,当我们把信号直接使用在舵机上时,会发现即使环境声音没有变化,舵机也处于抖动状态,实现效果不够稳定。
所以,在使用驻极体麦克风模块和舵机进行音量显示时,引入滤波机制是非常重要的,它可以提高系统的准确性和稳定性,提升用户体验。
首先,我们需要定义滤波器的滤波因子(Alpha)值。
const float alpha = 0.1;
Alpha值介于0和1之间,决定了滤波器对输入数据的敏感程度以及滤波效果的平滑程度。
filteredValue = alpha * sensorValue + (1 - alpha) * filteredValue;
上面的计算实现了指数移动平均滤波算法,以平滑声音数据。
其中,filterValues是滤波后的值,也就是当前时间点的输出值。它随时间更新,以反映最新的输入数据(即sensorValue)与过去的滤波值之间的加权平均值。这里的权重就是滤波因子Alpha。Alpha越大,滤波后的结果对最新的输入数据(sensorValue)的响应越快,滤波结果越能反映近期的数据变化;反之,Alpha越小,滤波后的结果越平滑,但对输入数据的响应也越慢。
int servoPos = map(filteredValue, 0, 1023, 0, 180);
myservo.write(servoPos);
最后,将处理好的数据映射成舵机工作区间的角度servoPos,并使用myservo.write()函数将声音响度以舵机角度的方式呈现出来。
硬件回顾
本项目使用的硬件和电路都与项目【声控灯】相似,如有不清楚的地方,请参考项目【声控灯】的教程。
课后练习
如在实际使用过程中,舵机转动效果不理想,请尝试修改滤波因子的数值,实现舵机的平滑转动吧!
附件下载:
页:
[1]