|
在本篇文章中,我们将学习如何制作一个声音控制的开关,可以用两次拍手声打开和关闭开关。该电路的声音传感装置是驻极体麦克风。连接到麦克风的前置放大器电路将来自麦克风的输入信号转换为模拟信号,LaunchPad开发板的内部ADC模块读取并处理该信号。当检测到两次拍手声时,通过继电器驱动器电路接通或断开继电器。通过这种方式,可以控制连接到继电器的任何小功率的工具,如本示例中使用的风扇。
所需的材料 ● MSP430 LaunchPad开发板 ● 驻极体麦克风 ● 2N3904 BJT晶体管 ● SPDT 12V线圈继电器 ● 5mm绿色LED ● SPST轻触开关 ● 连接导线 ● 面包板
连接原理图
驻极体麦克风是一种基于电容器(麦克风)的麦克风,可将声能转换为电能。这是一款低成本的麦克风,可以在手机、笔记本电脑、相机等中找到。该电路的主要部件是驻极体麦克风,它用作声音传感器。
驻极体麦克风连接到基于Q1晶体管构建的前置放大器,其放大来自麦克风的输入信号。放大的信号连接到LaunchPad的模拟输入引脚A0。通过使用下面的代码,我们可以轻松读取此模拟输入并监控拍手期间信号的状态。 - void setup()
- {
- Serial.begin(9600);
- }
- void loop()
- {
- int sensorValue = analogRead(A0);
- // print out the value you read:
- Serial.println(sensorValue);
- }
复制代码
在Energia IDE的串口监视器上,我们可以获取读数并在Excel中创建图形。通过下图,您可以看到拍手测试期间音频信号的样子:
您可以看到音频信号的DC偏移约为260个单位。拍手产生的峰值最多可达500个单位。 LaunchPad代码的主要用途是检测这些峰值,并在检测到两次拍手时激活继电器。
实际上,对于所需的拍手操作,仅仅感知任意两次拍手略显不足。两个拍手之间的间隔也很重要。代码中应用了超时过程,如果在500ms内未检测到另一个拍手声,则会丢弃该拍手声。
轻触开关用于调整将被检测到的拍手动作的阈值水平。有三种不同的阈值电平,黄色LED亮度根据所选的电平而变化。当灵敏度变高时,LED会变亮。
当软件检测到两次拍手声时,它将反转P1.1输出,该输出通过继电器驱动电路驱动绿色LED和继电器。绿色LED指示输出状态。由于LaunchPad的输出引脚电流额定值限制为6mA且无法驱动继电器线圈,因此需要基于Q2晶体管的继电器驱动电路。 1N4007二极管放置在线圈端子之间以防止反向电动势。
软件代码 该应用程序的软件使用Energia IDE构建,代码如下所示。电路不会响应单个拍手声,当仅感测到两次拍手声时,才会反转其输出。 - unsigned long int timestamp;
- int sensitivity=350;
- void setup()
- {
- // Set the pin modes
- pinMode(P1_1, OUTPUT);
- pinMode(P1_2, OUTPUT);
- pinMode(P1_3, INPUT_PULLUP);
- digitalWrite(P1_1, LOW);
- analogWrite(P1_2, 150);
- }
- void loop()
- {
- // Detect the first clap sound
- if (analogRead(A0) > sensitivity) {
-
- delay(100);
- timestamp = millis();
- do {
- // Detect the second clap sound
- if (analogRead(A0) > sensitivity) {
- digitalWrite(P1_1, !digitalRead(P1_1));
- delay(100);
- break; // Second clap is detected, break the while loop
- }
- }
-
- //Discard the first clap if the second clap is not received in 500ms
- while(millis() < (timestamp + 500));
-
- }
-
- // If the sensitivity buton is pressed, change the sensitivity level
- if (!digitalRead(P1_3)) {
- if (sensitivity == 400) {
- sensitivity = 350;
- analogWrite(P1_2, 150);
- }
- else if (sensitivity == 350) {
- sensitivity = 300;
- analogWrite(P1_2, 250);
- }
- else if (sensitivity == 300) {
- sensitivity = 400;
- analogWrite(P1_2, 50);
- }
- delay(500);
- }
- }
复制代码
|