在這個項目中,我們將使用 Arduino 構建一個娛樂。我們都有敲擊桌子或筆來創作任何隨機音樂的習慣。當然,這可能不被認為是一種良好的舉止,但我們都喜歡至少做一次。因此,我想通過使用Arduino的音調播放能力將其提升到一個新的水平。一旦你構建了這個項目,你就可以通過 敲擊任何導電的東西來生成音調 ,并創造你自己的節奏,就像在你的手掌上彈鋼琴一樣。聽起來很酷,所以,讓我們構建它。
所需組件:
本項目所需的材料如下,不一定要堅持。一旦你掌握了這個概念,你就可以使用自己的方式來構建它。
電路圖及說明:
這款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);
}
-
音調
+關注
關注
0文章
22瀏覽量
26799 -
Arduino
+關注
關注
188文章
6491瀏覽量
190103
發布評論請先 登錄
評論