在這個(gè)項(xiàng)目中,我們將使用 Arduino 構(gòu)建一個(gè)娛樂(lè)。我們都有敲擊桌子或筆來(lái)創(chuàng)作任何隨機(jī)音樂(lè)的習(xí)慣。當(dāng)然,這可能不被認(rèn)為是一種良好的舉止,但我們都喜歡至少做一次。因此,我想通過(guò)使用Arduino的音調(diào)播放能力將其提升到一個(gè)新的水平。一旦你構(gòu)建了這個(gè)項(xiàng)目,你就可以通過(guò) 敲擊任何導(dǎo)電的東西來(lái)生成音調(diào) ,并創(chuàng)造你自己的節(jié)奏,就像在你的手掌上彈鋼琴一樣。聽(tīng)起來(lái)很酷,所以,讓我們構(gòu)建它。
所需組件:
本項(xiàng)目所需的材料如下,不一定要堅(jiān)持。一旦你掌握了這個(gè)概念,你就可以使用自己的方式來(lái)構(gòu)建它。
電路圖及說(shuō)明:
這款Arduino棕櫚鋼琴的電路圖如下所示。
該項(xiàng)目總共使用四個(gè)傳感器,即兩個(gè) 柔性傳感器和兩個(gè)達(dá)林頓對(duì)作為觸摸傳感器 。我們還使用了兩個(gè)下拉電阻R1和R2,每個(gè)值為10k,它們將充當(dāng)Flex傳感器的下拉電阻。在這里,F(xiàn)lex傳感器用于使用一根手指根據(jù)彎曲的程度生成三種不同的音調(diào)。所以我們可以用兩根手指發(fā)出 6 種聲音。在此處了解柔性傳感器。
達(dá)林頓對(duì):
在我們繼續(xù)之前,重要的是要知道什么是達(dá)林頓以及它在我們的項(xiàng)目中究竟是如何工作的。達(dá)林頓對(duì)可以定義為兩個(gè)雙極晶體管的連接方式,即第一個(gè)晶體管放大的電流被第二個(gè)晶體管進(jìn)一步放大。下圖顯示了達(dá)林頓對(duì):
如上所示,我們使用了兩個(gè)BC547晶體管,其集電極連接在一起,第一個(gè)晶體管的發(fā)射極與第二個(gè)晶體管的基極連接。該電路充當(dāng)具有增益的放大器,這意味著提供給第一個(gè)晶體管基極的任何小信號(hào)都足以偏置第二個(gè)晶體管的基極。 我們的身體在這里充當(dāng)接地 ,因此每當(dāng)我們觸摸晶體管的底部時(shí),第二個(gè)晶體管就會(huì)偏置。利用這一點(diǎn),我們?yōu)檫@個(gè)項(xiàng)目構(gòu)建了觸摸傳感器。
引腳 2 和 3 是 Arduino 上的中斷引腳,將使用內(nèi)部上拉電阻器將其拉高,然后在達(dá)林頓開(kāi)關(guān)閉合時(shí)將這些引腳固定在地。這樣,每次我們觸摸電線時(shí)(從 1 的底部^圣^晶體管)將從 Arduino 觸發(fā)中斷。
使用兩個(gè)手指只能產(chǎn)生兩種類型的音調(diào),因此我還添加了一個(gè)柔性傳感器,它會(huì)根據(jù)彎曲的程度改變音調(diào)。我已經(jīng)編程為根據(jù)手指(柔性傳感器)彎曲的程度為每個(gè)手指產(chǎn)生三種不同的音調(diào)。如果您想在指尖擁有更多音調(diào),可以增加數(shù)量。
我在性能板上制作了完整的板,以便它很容易放入我的手掌,但您也可以使用面包板。只要確保你的身體在某個(gè)時(shí)候接觸電路的地面。焊接所有東西后,它應(yīng)該看起來(lái)像這樣
我用兩只手指手套將達(dá)林頓對(duì)的電線固定到位,如上所示。您可以提出自己的(如果可能的話更好)想法,以便在播放音調(diào)時(shí)將它們固定到位。
Arduino編程:
這個(gè)Arduino點(diǎn)擊音發(fā)生器的程序非常簡(jiǎn)單。我們只需要注意來(lái)自達(dá)林頓電線的中斷,如果找到一個(gè),我們必須播放音調(diào),這取決于彎曲傳感器彎曲的程度。完整的代碼在這篇文章的末尾給出,但我在下面解釋了幾個(gè)重要的塊。
注意:該程序在庫(kù)“pitches.h”的幫助下工作。因此,請(qǐng)確保在編譯之前已將頭文件添加到程序中。您可以從此處下載 pitches.h 頭文件。
在設(shè)置函數(shù)中,我們將引腳 2 和 3 初始化為帶有上拉電阻的輸入。我們還將它們聲明為中斷引腳,并在引腳 2 上有中斷時(shí)執(zhí)行 tone1(),當(dāng)引腳 3 上有中斷時(shí)執(zhí)行 tone2() 函數(shù)^RD^針。每當(dāng)這些引腳從其上拉狀態(tài)變?yōu)榈碗娖綍r(shí),就會(huì)觸發(fā)這些中斷。
void setup() {
pinMode(2, INPUT_PULLUP);
pinMode(3, INPUT_PULLUP);
attachInterrupt(digitalPinToInterrupt(2), tone1, LOW);
attachInterrupt(digitalPinToInterrupt(3), tone2, LOW);
Serial.begin(9600);
}
在環(huán)路功能內(nèi)部,我們不斷檢查柔性傳感器的彎曲程度。例如,我的 FlexSensor 1 在保持平坦時(shí)給出的值約為 200,當(dāng)我將其彎曲到最大值時(shí),值一直下降到 130,因此我將值從 200 映射到 130 為 1 到 3,因?yàn)槲冶仨毑シ?3 種不同類型的音調(diào)。您必須根據(jù) Flex 傳感器值和音調(diào)數(shù)量調(diào)整這兩條線。
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
}
正如我們之前看到的,當(dāng)在引腳 2 上檢測(cè)到中斷時(shí),函數(shù) tone1() 將被執(zhí)行。tone1() 函數(shù)內(nèi)部發(fā)生了什么如上所示。我們查看 FlexSensor1 的值,并根據(jù) flexSesnor 值播放音調(diào)。音調(diào)將使用Arduino的音調(diào)功能播放。
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);
}
下面的行用于播放音調(diào)。您可以播放“pitches.h”頭文件中可用的任何音調(diào)。例如,上面的行在引腳上播放NOTE_A3,持續(xù)時(shí)間為 50 毫秒。
tone(8, NOTE_A3,50); //tone(PinNum,Note name, Duration);
加工:
硬件準(zhǔn)備就緒后,上傳代碼并將其安裝在手指上。確保您的身體在某個(gè)時(shí)候接觸電路的地面?,F(xiàn)在只需觸摸任何導(dǎo)電材料或您的身體,您應(yīng)該能夠聽(tīng)到相應(yīng)的音調(diào)。您可以通過(guò)以不同的間隔和不同的位置點(diǎn)擊來(lái)播放自己的旋律或音樂(lè)。
/*
* 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);
}
-
音調(diào)
+關(guān)注
關(guān)注
0文章
22瀏覽量
26836 -
Arduino
+關(guān)注
關(guān)注
190文章
6498瀏覽量
192184
發(fā)布評(píng)論請(qǐng)先 登錄
簡(jiǎn)易的敲擊裝置
音調(diào)發(fā)生器模塊是如何利用計(jì)數(shù)器去生成一個(gè)1kHz信號(hào)的
自制一個(gè)arduino項(xiàng)目
一個(gè)簡(jiǎn)單的音調(diào)控制電路
一個(gè)帶有Arduino NANO V3的PLC項(xiàng)目
分享一個(gè)不錯(cuò)的Arduino NANO項(xiàng)目
分享一個(gè)不錯(cuò)的Arduino-PLC項(xiàng)目
是否有生成方波的音調(diào)函數(shù)?
怎樣將敲擊傳感器與Arduino接口
一個(gè)簡(jiǎn)單的PCB鍵盤,可輕松用于Arduino項(xiàng)目
如何使用Arduino構(gòu)建一個(gè)電子動(dòng)畫(huà)眼睛

將使用代碼生成器生成的項(xiàng)目移植到與智能配置器一起使用的項(xiàng)目

使用Arduino播放不同頻率的音調(diào)

將使用代碼生成器生成的項(xiàng)目移植到與智能配置器一起使用的項(xiàng)目

評(píng)論