使用Arduino和声音传感器构建一个音乐喷泉

描述

  有几个喷泉可以无条件地洒水并带有一些有趣的灯光效果。所以我想设计一个创新的喷泉,它可以响应外部音乐并根据音乐节拍洒水。听起来是不是很有趣?

  这个Arduino 喷泉的基本思想是从任何外部声源(如移动设备、iPod、PC 等)获取输入,对声音进行采样并将其分解为不同的电压范围,然后使用输出打开各种继电器。我们首先使用基于电容麦克风的声音传感器模块在声源上执行,以将声音分成不同的电压范围。然后电压将被馈送到运算放大器,以将声级与特定限制进行比较。较高的电压范围将对应于继电器开关打开,该开关包括根据歌曲节拍和节奏运行的音乐喷泉。所以在这里我们正在使用 Arduino 和声音传感器构建这个音乐喷泉。

  所需材料

  Arduino纳米

  声音传感器模块

  12V继电器模块

  直流泵

  发光二极管

  连接线

  Vero 板或面包板

  声音传感器的工作

Arduino

  声音传感器模块是一个简单的基于驻极体麦克风的电子板,用于从环境中感知外部声音。它基于LM393功率放大器和驻极体麦克风,可用于检测是否有超出设定阈值限制的声音。模块输出是一个数字信号,表示声音大于或小于阈值。

  电位器可用于调节传感器模块的灵敏度。当声源低于/高于电位器设置的阈值时,模块输出为 HIGH/LOW。同样的声音传感器模块也可以用于测量分贝的声级。

  声音传感器电路图

Arduino

  众所周知,在声音传感器模块中,基本的输入设备是麦克风,它将声音信号转换为电信号。但是由于声音传感器的电信号输出幅度很小,很难分析,所以我们使用了一个NPN 晶体管放大器电路,将其放大并将输出信号馈送到 Op- 的非反相输入端。放大器。这里 LM393 OPAMP 用作比较器,用于比较来自麦克风的电信号和来自分压器电路的参考信号。如果输入信号大于参考信号,则 OPAMP 的输出将为高电平,反之亦然。

  音乐喷泉电路图

Arduino

  如上述音乐喷泉电路图所示,声音传感器由 Arduino Nano 的 3.3V 电源供电,声音传感器模块的输出引脚连接到 Nano 的模拟输入引脚(A6)。您可以使用任何模拟引脚,但请确保在程序中进行更改。如图所示,继电器模块和直流泵由外部 12VDC 电源供电。继电器模块的输入信号连接到 Nano 的数字输出引脚 D10。为了照明效果,我选择了两种不同颜色的 LED,并将它们连接到 Nano 的两个数字输出引脚(D12、D11)。

  在这里,泵的连接方式是,当继电器模块的输入端收到一个高脉冲时,继电器的 COM 触点连接到 NO 触点,电流得到一个闭路路径流过泵到激活水流。否则泵将保持关闭状态。高/低脉冲由 Arduino Nano 生成,具体取决于声音输入。

  在穿孔板上焊接完整电路后,它将如下所示:

Arduino

  在这里,我们使用一个塑料盒作为喷泉容器和迷你5v 泵作为喷泉,我们之前在消防机器人中使用过这个泵:

Arduino

为舞蹈喷泉编程 Arduino Nano

这个Arduino 喷泉项目的完整程序在页面底部给出。但在这里我只是分部分解释,以便更好地理解:

程序的第一部分是声明必要的变量来分配我们将在下一个程序块中使用的引脚号。然后定义一个常数 REF,其值为声音传感器模块的参考值。赋值700是声音传感器输出电信号的字节等效值。

 

int 传感器 = A6;
int redled = 12; 
int greenled = 11; 
int泵= 10;

#define REF 700

 

在void setup函数中,我们使用pinMode函数来分配引脚的 INPUT/OUTPUT 数据方向。这里将传感器作为输入,所有其他设备作为输出。

 

无效设置()
{ 
  pinMode(传感器,输入);
  pinMode(红色,输出);
  pinMode(绿灯,输出);
  pinMode(泵,输出);
}

 

在无限循环中,调用了模拟读取函数,该函数读取从传感器引脚输入的模拟值并将其存储在变量sensor_value中。

 

int sensor_value = 模拟读取(传感器);

 

在最后一部分中,使用if-else循环将输入模拟信号与参考值进行比较。如果它大于参考值,则所有输出引脚都被赋予高电平输出,以便所有 LED 和泵都被激活,否则一切都保持关闭。在这里,我们还给出了 70 毫秒的延迟来区分继电器的开/关时间。

 

if (sensor_value>REF) 
  { 
    digitalWrite(greenled,HIGH); 
    数字写入(红色,高);
    数字写入(泵,高);
    延迟(70);
   } 
   else 
   { 
    digitalWrite(greenled,LOW); 
    数字写入(红色,低);
    数字写入(泵,低);
    延迟(70);
   }

 

Arduino

Arduino

int 传感器 = A6;

int redled = 12;

int greenled = 11;

int泵= 10;


#define REF 700


无效设置()

{

pinMode(传感器,输入);

pinMode(红色,输出);

pinMode(绿灯,输出);

pinMode(泵,输出);



}

无效循环()

{



int sensor_value = 模拟读取(传感器);



if (sensor_value>REF)

{

digitalWrite(greenled,HIGH);

数字写入(红色,高);

数字写入(泵,高);

延迟(70);

}

else

{

digitalWrite(greenled,LOW);

数字写入(红色,低);

数字写入(泵,低);

延迟(70);

}

}

 

打开APP阅读更多精彩内容
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉

全部0条评论

快来发表一下你的评论吧 !

×
20
完善资料,
赚取积分