分享一个使用Arduino敲击手指生成音调的项目

描述

在这个项目中,我们将使用 Arduino 构建一个娱乐。我们都有敲击桌子或笔来创作任何随机音乐的习惯。当然,这可能不被认为是一种良好的举止,但我们都喜欢至少做一次。因此,我想通过使用Arduino的音调播放能力将其提升到一个新的水平。一旦你构建了这个项目,你就可以通过 敲击任何导电的东西来生成音调 ,并创造你自己的节奏,就像在你的手掌上弹钢琴一样。听起来很酷,所以,让我们构建它。

所需组件:

本项目所需的材料如下,不一定要坚持。一旦你掌握了这个概念,你就可以使用自己的方式来构建它。

  1. Arduini Pro Mini
  2. 培佐扬声器
  3. 柔性传感器
  4. 手指手套
  5. 10K 电阻器
  6. BC547 晶体管
  7. 9V电池

电路图及说明:

这款Arduino棕榈钢琴的电路图如下所示。

音调

该项目总共使用四个传感器,即两个 柔性传感器和两个达林顿对作为触摸传感器 。我们还使用了两个下拉电阻R1和R2,每个值为10k,它们将充当Flex传感器的下拉电阻。在这里,Flex传感器用于使用一根手指根据弯曲的程度生成三种不同的音调。所以我们可以用两根手指发出 6 种声音。在此处了解柔性传感器

达林顿对:

在我们继续之前,重要的是要知道什么是达林顿以及它在我们的项目中究竟是如何工作的。达林顿对可以定义为两个双极晶体管的连接方式,即第一个晶体管放大的电流被第二个晶体管进一步放大。下图显示了达林顿对:

音调

如上所示,我们使用了两个BC547晶体管,其集电极连接在一起,第一个晶体管的发射极与第二个晶体管的基极连接。该电路充当具有增益的放大器,这意味着提供给第一个晶体管基极的任何小信号都足以偏置第二个晶体管的基极。 我们的身体在这里充当接地 ,因此每当我们触摸晶体管的底部时,第二个晶体管就会偏置。利用这一点,我们为这个项目构建了触摸传感器。

引脚 2 和 3 是 Arduino 上的中断引脚,将使用内部上拉电阻器将其拉高,然后在达林顿开关闭合时将这些引脚固定在地。这样,每次我们触摸电线时(从 1 的底部^圣^晶体管)将从 Arduino 触发中断。

使用两个手指只能产生两种类型的音调,因此我还添加了一个柔性传感器,它会根据弯曲的程度改变音调。我已经编程为根据手指(柔性传感器)弯曲的程度为每个手指产生三种不同的音调。如果您想在指尖拥有更多音调,可以增加数量。

我在性能板上制作了完整的板,以便它很容易放入我的手掌,但您也可以使用面包板。只要确保你的身体在某个时候接触电路的地面。焊接所有东西后,它应该看起来像这样

音调

音调

我用两只手指手套将达林顿对的电线固定到位,如上所示。您可以提出自己的(如果可能的话更好)想法,以便在播放音调时将它们固定到位。

Arduino编程:

这个Arduino点击音发生器的程序非常简单。我们只需要注意来自达林顿电线的中断,如果找到一个,我们必须播放音调,这取决于弯曲传感器弯曲的程度。完整的代码在这篇文章的末尾给出,但我在下面解释了几个重要的块。

注意:该程序在库“pitches.h”的帮助下工作。因此,请确保在编译之前已将头文件添加到程序中。您可以从此处下载 pitches.h 头文件。

在设置函数中,我们将引脚 2 和 3 初始化为带有上拉电阻的输入。我们还将它们声明为中断引脚,并在引脚 2 上有中断时执行 tone1(),当引脚 3 上有中断时执行 tone2() 函数^RD^针。每当这些引脚从其上拉状态变为低电平时,就会触发这些中断。

void setup() {
pinMode(2, INPUT_PULLUP);
pinMode(3, INPUT_PULLUP);
attachInterrupt(digitalPinToInterrupt(2), tone1, LOW);
attachInterrupt(digitalPinToInterrupt(3), tone2, LOW);
Serial.begin(9600);
}

环路功能内部,我们不断检查柔性传感器的弯曲程度。例如,我的 FlexSensor 1 在保持平坦时给出的值约为 200,当我将其弯曲到最大值时,值一直下降到 130,因此我将值从 200 映射到 130 为 1 到 3,因为我必须播放 3 种不同类型的音调。您必须根据 Flex 传感器值和音调数量调整这两条线。

void loop() {
 flexSensor1 = map(analogRead(A0),200,130,1,3); //Map up with your own values based on your flex sensor
 flexSensor2 = map(analogRead(A1),170,185,1,3); //Map up with your own values based on your flex sensor

}

正如我们之前看到的,当在引脚 2 上检测到中断时,函数 tone1() 将被执行。tone1() 函数内部发生了什么如上所示。我们查看 FlexSensor1 的值,并根据 flexSesnor 值播放音调。音调将使用Arduino的音调功能播放。

void tone1()
{
if (flexSensor1==1)
tone(8, NOTE_D4,50);
else if (flexSensor1==2)
tone(8, NOTE_A3,50);
else if (flexSensor1==3)
tone(8, NOTE_G4,50);
else
tone(8, NOTE_D4,50);
}

下面的行用于播放音调。您可以播放“pitches.h”头文件中可用的任何音调。例如,上面的行在引脚上播放NOTE_A3,持续时间为 50 毫秒。

tone(8, NOTE_A3,50); //tone(PinNum,Note name, Duration);

加工:

硬件准备就绪后,上传代码并将其安装在手指上。确保您的身体在某个时候接触电路的地面。现在只需触摸任何导电材料或您的身体,您应该能够听到相应的音调。您可以通过以不同的间隔和不同的位置点击来播放自己的旋律或音乐。

/*
* Arduino based Tap and Tone player
* Published by: CircuitDigest.com
* Code By: B.Aswinth Raj
* Dated:8-7-2017
*
* ###CONNECTIONS###
* Darlington Wire 1 -> Pin 2
* Darlington Wire 2 -> Pin 3
* FlexSensor 1 -> A0
* FlexSensor 2 -> A1
* Speaker -> Pin 8
*/

#include "pitches.h" //add this librarey into the project folder
int flexSensor1,flexSensor2;

void setup() {
pinMode(2, INPUT_PULLUP);
pinMode(3, INPUT_PULLUP);
attachInterrupt(digitalPinToInterrupt(2), tone1, LOW); //Trigger tone1 when LOW
attachInterrupt(digitalPinToInterrupt(3), tone2, LOW); //Trigger tone2 when LOW
Serial.begin(9600);
}

void loop() {
flexSensor1 = map(analogRead(A0),200,130,1,3); //Map up with your own values based on your flex sensor
flexSensor2 = map(analogRead(A1),170,185,1,3); //Map up with your own values based on your flex sensor
}

//**Function to execute on Interrupt 1**//
void tone1()
{

if (flexSensor1==1)
tone(8, NOTE_D4,50);
else if (flexSensor1==2)
tone(8, NOTE_A3,50);
else if (flexSensor1==3)
tone(8, NOTE_G4,50);
else
tone(8, NOTE_D4,50);
}

//**Function to execute on Interrupt 2**//
void tone2()
{

if (flexSensor1==1)
tone(8, NOTE_A4,50);
else if (flexSensor1==2)
tone(8, NOTE_F4,50);
else if (flexSensor1==3)
tone(8, NOTE_E4,50);
else
tone(8, NOTE_A4,50);
}

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

全部0条评论

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

×
20
完善资料,
赚取积分