2017年6月16日 星期五

創意組合 : 光影電子琴


學習目標 :利用faya電子積塊製作一透過光線強弱控制音鍵的電子琴
學習時間 : 180min
使用模組 : (1) faya brickNano x 1
                 (2) 光感應模組 x 7
                 (3) BCD開關模組 x 1
                 (4) 蜂鳴器模組 x 1
工具 : 樂高積木 / 底板 (相容)
          小螺絲起子 (十字,一字亦可)

====================相關知識====================
這篇文章中所用到的模組使用方式及相關知識整理如下,需進一步了解時可點進去參考:
模組介紹 : faya brickNano
模組介紹 : faya光感應模組
模組介紹 : fayaBCD開關模組
模組介紹 : faya蜂鳴器模組

======================開箱======================
光影電子琴(型號NTG-502)是fayalab的第二款創意組合系列產品,這一款的的牛皮紙盒只有夢幻泡泡機(型號NGT-501)一半的大小,特別設計給16x16的積木底板,這次創意組合利用3個16x16的底板,組合成48x16的大底板,面積能夠橫放七個faya光感應模組,並且結合蜂鳴器和BCD開關,產生7x4=49個音階。

盒內包含了製作夢幻泡泡機所需的全部模組及附件:

1.faya brickNano主板       2.BCD開關模組       3.蜂鳴器模組      4.光感應模組x7
5.電源線(A)/(B)      6.積木柱子       7. 長跳線x4      8.跳線盒
9.積木包       10.micro USB傳輸線       11.積木底板x3


===================範例實作=====================
目標:
(1) 利用faya電子積塊,製作出光感應電子琴
(2) 電子琴上共七鍵 [Do][Re][Mi][Fa][So][La][Si]
(3) 當照射光感應器的光線被遮住時,蜂鳴器模組發出相對應的聲音,從Do~Si共七音
(4) 利用BCD開關改變音階,共七階

組裝:
首先把[1.faya brickNano主板]、[2.BCD開關模組]、[3.蜂鳴器模組]、[4.光感應模組x7]的四個角落裝上[6.積木柱],詳細組裝過程可參考[功能介紹 : faya電子積塊與LEGO積木的結合],完成後如下圖所示:


接下來可以開始組裝積木了,大家可以先參考以下所提供的組裝方式,但沒有強制一定要和以下的範例組的一模一樣。由於組裝出來的外觀結構和程式沒有直接的關係,只要確認電源 / 訊號線夠長,即可依自己的喜好組出心中夢想的光影電子琴。

(註) : 上一款創意組合[夢幻泡泡機],由於程式需配合組出來的結構,因此強力建議初學者先按照文章裡的範例組一次,再更改成自己喜歡的樣式,但在本篇範例並無此問題。

首先利用兩片[9.積木包]裡的2x10的薄片板,把三片的 [11.積木底板x3]固定起來。


接著我們要組14個(2x5)的座台放置7個光感應模組,底下的排列方式,能夠讓7個光感應模組對稱的在積木底板上排列,白色圓圈部分是光感應模組四個腳座的擺放位置。


將[4.光感應模組x7] 擺放在白色圈圈的標記位置,完成後如下圖所示:


接下來我們在中間空位架一個能夠放faya_brickNano的小平台,白色圓圈部分是brickNano四個腳座的擺放位置。


將[1.faya brickNano主板] 擺放在白色圈圈的標記位置(USB朝左),完成後如下圖所示:


接下來我們要在左邊空位架一個能夠放BCD開關模組的小平台,底下的範例是利用2組(2x5x2)的長方體配合2片白色(2x6)的平板製作而成,平板上的圓圈部分是fBCD模組四個腳座的擺放位置。


將[2.BCD開關模組] 擺放在白色圈圈的標記位置,完成後如下圖所示:


再來我們要在右邊空位架一個能夠放BCD開關模組的小平台,這邊的範例是利用6顆(2x8)的基本款積木組合而成,積木上的圓圈部分是蜂鳴器模組四個腳座的擺放位置。


將[ 3.蜂鳴器模組] 擺放在白色圈圈的標記位置,完成後如下圖所示:


積木和模組的安裝告一段落,接下來開始接線的部分

接線:
(1) 電源線連接

電源線的連接如下圖所示,連接的詳細說明可參考這篇文章 簡易版。這個範例我們透過9條[5.電源線(B)]將10個模組的電源全部串起來,電源供應的順序如圖箭頭所示:


注意: 如果連結電源線的過程中,遇到電源線不夠長時,可參考這篇[小技巧 : 電源線不夠長怎麼辦呢?]

完成電源線的連接後,可以稍微整理一下走線(走線也是一門藝術喔!),把一些線段藏在模組下方,讓畫面清爽一些,到時候訊號線再加進來時才不會感覺一團亂!

我們順便定義一下光感應模組的代號,由左至右分別為 Do-Re-Mi-Fa-So-La-Si :


(2) 訊號線連接

      Arduino_D12 ===> BCD開關模組_1
      Arduino_D11 ===> BCD開關模組_2
      Arduino_D10 ===> BCD開關模組_4


      Arduino_D2 ===> 蜂鳴器模組_BZ


      Arduino_A1 ===> 光感應模組(DO)_OUT
      Arduino_A2 ===> 光感應模組(RE)_OUT
      Arduino_A3 ===> 光感應模組(MI)_OUT
      Arduino_A4 ===> 光感應模組(FA)_OUT
      Arduino_A5 ===> 光感應模組(SO)_OUT
      Arduino_A6 ===> 光感應模組(LA)_OUT
      Arduino_A7 ===> 光感應模組(SI)_OUT


範例程式:
// 2017/6/12
// Faya-Nugget 範例程式 (DigitalPiano_1.ino)
// 單元: 創意組合-光影電子琴
// 網址: http://fayalab.blogspot.com/2017/06/fayadigitalpiano.html
// 目標 (1) 利用faya電子積塊,製作出光感應電子琴
// (2) 電子琴上共七鍵 [Do][Re][Mi][Fa][So][La][Si]
// (3) 當光感應器光線被遮住時,蜂鳴器模組發出相對應的聲音,從Do~Si共七音
// (4) 利用BCD開關改變音階,共七階
// 接線: Arduino ==> faya模組
// A1 ==> Vout (光感應模組 Do)
// A2 ==> Vout (光感應模組 Re)
// A3 ==> Vout (光感應模組 Mi)
// A4 ==> Vout (光感應模組 Fa)
// A5 ==> Vout (光感應模組 So)
// A6 ==> Vout (光感應模組 La)
// A7 ==> Vout (光感應模組 Si)
// D2 ==> BZ (蜂鳴器模組)
// D12 ==> 1 (BCD開關模組)
// D11 ==> 2 (BCD開關模組)
// D10 ==> 4 (BCD開關模組)
#include "pitches.h"
// 建立矩陣,讀取pitches.h內定義的音頻,每階7個音,共七階
int notes[7][7] = { {NOTE_C1, NOTE_D1, NOTE_E1, NOTE_F1, NOTE_G1, NOTE_A1, NOTE_B1},
{NOTE_C2, NOTE_D2, NOTE_E2, NOTE_F2, NOTE_G2, NOTE_A2, NOTE_B2},
{NOTE_C3, NOTE_D3, NOTE_E3, NOTE_F3, NOTE_G3, NOTE_A3, NOTE_B3},
{NOTE_C4, NOTE_D4, NOTE_E4, NOTE_F4, NOTE_G4, NOTE_A4, NOTE_B4},
{NOTE_C5, NOTE_D5, NOTE_E5, NOTE_F5, NOTE_G5, NOTE_A5, NOTE_B5},
{NOTE_C6, NOTE_D6, NOTE_E6, NOTE_F6, NOTE_G6, NOTE_A6, NOTE_B6},
{NOTE_C7, NOTE_D7, NOTE_E7, NOTE_F7, NOTE_G7, NOTE_A7, NOTE_B7} };
//儲存類比腳位順序至key[]
int key[] = {A1,A2,A3,A4,A5,A6,A7};
//蜂鳴器腳位設定
int Buzzer_pin =2;
//BCD開關腳位設定
int BCD_Pin1 = 12;
int BCD_Pin2 = 11;
int BCD_Pin4 = 10;
//初始化BCD開關狀態
//0=關,1=開
//n1=輸出埠1, n2=輸出埠2, n3=輸出埠3
int n1=0, n2=0, n4=0, n=0;
void setup()
{
Serial.begin(9600);
pinMode(Buzzer_pin,OUTPUT); // 設定蜂鳴器為輸出
pinMode(BCD_Pin1, INPUT); //設定BCD埠1,2,4為輸入
pinMode(BCD_Pin2, INPUT);
pinMode(BCD_Pin4, INPUT);
for (int i=0; i<=6; i++) //設定腳位A0~A6(連接光感應器)為輸入
{
pinMode(key[i], INPUT);
}
}
void loop() {
if(digitalRead(BCD_Pin1) == HIGH) //偵測BCD_輸出埠1狀態
n1 = 1;
else
n1 = 0;
if(digitalRead(BCD_Pin2) == HIGH) //偵測BCD_輸出2狀態
n2 = 2;
else
n2 = 0;
if(digitalRead(BCD_Pin4) == HIGH) //偵測BCD_輸出4狀態
n4 = 4;
else
n4 = 0;
n = n1+n2+n4; // 加總n1, n2, n4可得知BCD目前轉的位置
//Serial.println(n); //檢測BCD轉的位置是否正確
//輪流讀取7個光感測值
for (int thisKey = 0 ; thisKey <= 6; thisKey++) {
int keyReading = analogRead(key[thisKey]); //讀取光感測器的值
// Serial.print(keyReading);
// Serial.print(" ");
if (keyReading <= 750) { //當光感測值小於750時 (變暗)
tone(Buzzer_pin, notes[7-n][thisKey], 20); //撥放相對應音階上的音符
}
}
// Serial.println(" ");
}

備註:
- 程式裡面的語法和各模組的用法都在之前的文章介紹過了,請參考本文前面相關文章的連結
- pitches.h 可在此下載記得把這個檔案和範例檔案放在同一個資料夾,可參考  (模組介紹 : faya蜂鳴器模組)
- 程式裡面有關Serial指令(預設階被註解),可用來監測資料的輸入或輸出狀態,使者可以取消註解,利用序列埠監測視窗(Serial Monitir)除錯
- L77:Serial.println(n);  可查看BCD轉出的數字是否和Serial Monitor相同
- L82, L83, L88: 可查看每個光感應器接收到光的值



- L85: tone(Buzzer_pin, notes[7-n][thisKey], 20);
我們希望BCD開關逆時針方向撥的時候,音階愈來愈高,這樣才和鋼琴鍵盤的音階方向一致,但是逆時針方向撥的時候,數字愈來愈小,因此我們用[7-n],讓程式讀取高音階的部分,最後再取[thisKey],撥放相對位置的音符!

校正光感應靈敏度:
下載成功後,很有可能遇到光影電子琴會一直發出聲音的情形,此時不用緊張,這是由於光感應器的靈敏度尚未調整(光感應器模組的詳細介紹可參考[模組介紹 : faya光感應模組]),
這邊直接介紹如何快速的校正符合現場光線的光感應靈敏度。

(1) 首先確認環境有穩定的光源。
(2) 用螺絲起子輕輕的將可變電阻順時針撥到底,注意要很輕,可變電阻的結構無法承受大力的旋轉。
(3) 用幾根手指將光感應器遮住以擋住光線,擋光的程度隨個人喜好,但注意這個擋光的程度就是觸發此感測器發出聲音的程度!

 
(4) 另一隻手用螺絲起子慢慢的逆時針轉可變電阻,當蜂鳴器一發出聲音馬上停止。
(5) 接著移開螺絲起子和遮住感測器的那隻手,聲音會停止。
(6) 完成後,用手去遮此顆感測器時,會再發出聲音,移開時,聲音停止,此時代表此顆感測器的校正完成了。
(7)以上動作重複七次,校正Do Re Mi Fa So La Si七個音

用影像示範一次Do音的校正:


測試結果:
我們從最低音的Do(Note_C1,BCD開關位置=7)開始測試到最開音的Si(Note_B7,BCD開關位置=1),總共7x7=49個音。


最後,我們利用這台光影電子琴演奏[綠野仙蹤主題曲-Over the Rainbow]的前面一小段!


希望大家能夠順利地組出光影電子琴,並且更改心目中電子琴外型,彈出自己喜愛的音樂,也歡迎大家在底下留言或到我們的粉絲團留言喔!

====================================
fayalab 粉絲團
FB本篇留言版


沒有留言:

張貼留言