2018年3月16日 星期五

創意組合 : 數位FM收音機


學習目標 : 用faya電子積塊組出一能顯示電台的數位FM收音機
學習時間 : 180min
使用模組 : (1) faya brickNano
                   (2) faya FM模組
                   (3) faya 雙聲道喇叭模組
                   (4) faya 串列七段顯示模組
                   (5) faya 編碼器模組
                   (6) 電源濾波模組
 工具 : 樂高積木(相容)
           音源線

====================相關知識====================
這篇文章中所用到的模組使用方式及相關知識整理如下,需進一步了解時可點進去參考:
模組介紹 : faya brickNano
模組介紹 : faya FM模組
模組介紹 :  faya 雙聲道喇叭模組
模組介紹 :  faya 串列七段顯示模組
模組介紹 :  faya 編碼器模組
模組介紹 :  電源濾波模組 

======================開箱======================
數位FM收音機(型號NTG-505)是fayalab的第五款創意組合系列產品,我們的目標是利用現有的faya模組,組出一個能夠選台的FM收音機,選到的電台頻道會顯示在七段顯示模組,接收到的聲音會在雙聲道喇叭模組撥放。

盒內包含了製作FM收音機所需的全部模組及附件:

1.faya brickNano主板       2.FM模組       3.雙聲道喇叭模組      4.串列七段顯示模組
5.編碼器模組        6. 電源濾波模組       7. 積木包        8. 積木柱子      9. 積木蓋子
10.  跳線盒           11. 音源線                 12. micro USB傳輸線              13. 電源線(A)/(B)
14. 積木底板


===================範例實作=====================
目標:
(1) 利用faya電子積塊,製作出FM收音機
(2) 利用編碼器的旋轉功能進行電台搜尋
(3) 利用編碼器的按鈕功能直接選擇喜愛的電台
(4) 接收到的電台顯示於七段顯示模組
(5) 接收到的電台於雙聲道喇叭模組撥放

組裝:

首先把[1.faya brickNano主板]、[2.FM模組]、[3.雙聲道喇叭模組]、[4.串列七段顯示模組]、[5.編碼器模組]、[6. 電源濾波模組]的四個角落裝上[8.積木柱子]與[9. 積木蓋子]。

積木柱子的組裝過程可參考[功能介紹 : faya電子積塊與LEGO積木的結合]
積木蓋子的組裝過程可參考[小技巧 : 積木柱子太鬆時如何處理?]

完成後模組背面照如下圖所示:


模組正面照如下圖所示:


接下來示範線路的連接和積木的組裝,大家可以按照底下的範例跟著做一次,熟悉一下安裝的步驟,之後再按照自己的喜好修改造型。如果照著我們的範例,組完後會長這個樣子:


電源線連接

電源線的連接如下圖所示,連接的詳細說明可參考這篇文章 簡易版。這個範例我們透過9條[5.電源線(B)]將6個模組的電源全部串起來,我們在[模組介紹 : faya 電源濾波模組]解釋過,透過正確的電源串聯順序才能避免雜訊的產生,因此電源線串聯的順序極為重要,順序為:

brickNano > 編碼器模組 > 七段顯示模組 > 電源濾波模組 > FM模組 > 雙聲道喇叭模組

這個順序可以確保七段顯示模組產生的掃描頻率,在干擾FM和喇叭模組之前,就被電源濾波模組濾掉 (請特別注意電源濾波模組的方向,左邊接IN,右邊接OUT)。


接著把[FM模組]、[七段顯示模組]、[faya brickNano]、[編碼器模組]透過積木柱子按照左上、左下、右上、右下固定在圖中底板位置


完成後如下圖所示,先不用裡其他兩個模組


接著我們在下圖中的位置安裝第一層的積木


完成後如下圖所示


接著我們在下圖中的位置安裝第二層的積木


疊上積木後,我們順便把電源線塞到積木與積木間的空隙,完成後如下圖所示。同樣的先把喇叭和電源濾波模組擺一邊,不用理他們。


訊號線連接

FM模組:
     
      Arduino_D2 ===> FM模組_RST
      Arduino_A4 ===> FM模組_SDIO
      Arduino_A5 ===> FM模組_SCLK

大家可以修一下單芯線的長度,或者繞個弧度,讓訊號線不要立起來,最好貼平在模組上,如下圖所示。


編碼器模組:

      Arduino_D12 ===> 編碼器模組_PB
      Arduino_D11 ===> 編碼器模組_A
      Arduino_D10 ===> 編碼器模組_B

訊號線連接編碼器後,將他往下折,從模組的下方,再經過剛剛製作出來的積木溝槽,連接到brickNano的排母座。如此的理線方式所組出的成品會較為美觀。


串列七段顯示模組:

      Arduino_D3 ===> 七段顯示模組_DIN
      Arduino_D4 ===> 七段顯示模組_CLK
      Arduino_D5 ===> 七段顯示模組_LOAD

和編碼器模組同樣的理線方式,完成後如下圖所示


範例程式:

完成了以上的組裝,我們先載入範例程式,測試一下功能是否正常,成功後,再繼續組裝上層的積木。在這邊測試程式的原因是如果等全部組裝完才測試,要是有線路沒連接好的話,還得拆掉查看內部的線路,並且再重新組裝一次。

// 2018/3/6
// Faya-Nugget 範例程式 (FMRadio_1.ino)
// 單元: 創意組合-數位FM收音機
// 網址: https://fayalab.blogspot.com/2018/03/FMradio.html
// 目標 (1) 利用faya電子積塊,製作出FM收音機
// (2) 利用編碼器的旋轉功能進行電台搜尋
// (3) 利用編碼器的按鈕功能直接選擇喜愛的電台
// (4) 接收到的電台於雙聲道喇叭模組撥放
// 接線: Arduino ==> faya模組
// D2 ==> RST (FM模組)
// A4 ==> SDIO (FM模組)
// A5 ==> SCLK (FM模組)
// D12 ==> PB (編碼器模組)
// D11 ==> A (編碼器模組)
// D10 ==> B (編碼器模組)
// D3 ==> DIN (串列七段顯示器)
// D4 ==> CLK (串列七段顯示器)
// D5 ==> LOAD (串列七段顯示器)
#include <Si4703_Breakout.h>
#include <Wire.h>
#include "LedControl.h"
//定義Arduino與七字節模組連接腳位與參數
LedControl faya7seg=LedControl(3,4,5,1); // DIN, CLK, LOAD, 串列數量
//定義Arduino與FM模組連接腳位
Si4703_Breakout radio(2, A4, A5); // reset, SDIO, SCLK
//定義編碼器腳位
int encoder_PB = 12; // 按鍵
int encoder_A = 11; // 相位A
int encoder_B = 10; // 相位B
int encoder_A_Last = HIGH; // 相位A的最後狀態
int state_A; //用來儲存相位A狀態
int state_PB; //用來儲存按鍵PB狀態
//FM電台相關變數
int channel_min = 875; // 最低頻率的FM電台 = 87.5 MHz
int channel_max = 1080; // 最高頻率的FM電台 = 108.0 MHz
int channel; // 用來儲存目前電台
//電台列表 共22台
int station[22]= {897, 901, 905, 909, 913, 917, 921, 931, 943, 963, 977, 981, 989, 997, 1007, 1017, 1033, 1041, 1049, 1059, 1065, 1077};
int list = 17; // 初始電台 [list+1] = 第18台 = 104.1
void setup()
{
pinMode (encoder_PB,INPUT);
pinMode (encoder_A,INPUT);
pinMode (encoder_B,INPUT);
// 初始化FM模組
radio.powerOn(); // 啟動模組功能
radio.setVolume(10); // 設定音量 (0~15)
channel = station[list]; // 設定第[list+1]為預設撥放台
radio.setChannel(channel); // 撥放頻道 - 第[scan+1]台的頻道
// 初始化七字節顯示器
faya7seg.shutdown(0,false); // 第0個元件不要進入省電模式
faya7seg.setIntensity(0,8); // 第0個的元件亮度8 (0~15)
faya7seg.clearDisplay(0); // 清除第0個元件
displayFM(channel); // 顯示頻道 - 第[scan+1]台的頻道
delay(2000);
}
void loop()
{
state_A = digitalRead(encoder_A); //讀取相位A狀態
state_PB = digitalRead(encoder_PB); //讀去按鈕PB狀態
if ((encoder_A_Last == LOW) && (state_A == HIGH)) // 相位A從LOW跳到HIGH時
{
if (digitalRead(encoder_B) == LOW) // **當相位B = LOW ==> 順時針旋轉**
{
if(channel > channel_max) // 每順時轉一格電台+2
channel = channel_min; // 超過最大頻率時
else // 跳到最小頻率
channel = channel + 2;
radio.setChannel(channel); // 設定頻道並撥放
displayFM(channel); // 將目前頻道顯示於七字節
}
else // **當相位B = HIGH ==> 逆時針旋轉**
{
if(channel < channel_min) // 每逆時轉一格電台-2
channel = channel_max; // 低於最小頻率時
else // 跳到最大頻率
channel = channel - 2;
radio.setChannel(channel); // 設定頻道並撥放
displayFM(channel); // 將目前頻道顯示於七字節
}
}
else if (state_PB == HIGH) //偵測到按下編碼器按鍵時
{
list++; //電台跳到下一台,到最大台數時,歸回第1台
if(list == 22)
list = 0;
channel = station[list]; // 設定頻道並撥放
radio.setChannel(channel); // 將目前頻道顯示於七字節
displayFM(channel);
delay(200);
}
encoder_A_Last = state_A; // 把A的目前狀態存到最後狀態
}
void displayFM(int number) // 七字節顯示電台號碼
{
int num1,num2,num3,num4;
num1=number/1000; // 千位數
num2=(number%1000)/100; // 百位數
num3=(number%100)/10; // 十位數
num4=number%10; // 個位數
faya7seg.setDigit(0,3,num1,false);
faya7seg.setDigit(0,2,num2,false);
faya7seg.setDigit(0,1,num3,true); // 十位數位置要有小數點
faya7seg.setDigit(0,0,num4,false);
}
view raw FMRadio_1.ino hosted with ❤ by GitHub


備註:
- 本程式需要用到[Si4703_breakout]函式庫,請下載並解壓縮至Arduino Libraries 資料夾
- 本程式需要用到[LedControl]函式庫,請下載並解壓縮至Arduino Libraries 資料夾
- FM模組的程式控制原理,請參考[模組介紹 : faya FM模組]
- 串列七段顯示模組的程式控制原理,請參考 [模組介紹 :  faya 串列七段顯示模組]
- 編碼器模組的程式控制原理,請參考[模組介紹 :  faya 編碼器模組]
- 本程式針對編碼器判斷了三個動作 (1) 順時針旋轉 (2) 逆時針選轉 (3) 按下按鈕
- L73~L81 : 順時針旋轉編碼器時,會往高頻電台微調,並且立即撥放和顯示該頻道
- L82~L90 : 逆時針旋轉編碼器時,會往低頻電台微調,並且立即撥放和顯示該頻道
- L78、L87 : 每次+2或-2的原因是因為每個電台都相隔200kHz,因此直接跳2即可
- L92~L100 : 按下編碼器按鈕時,依序讀取儲存於Station陣列的電台,街個立即撥放並顯示該電台
- L44 : Station陣列儲存了22個電台頻道,請參考[台灣廣播電台列表]
- L53~L56 : 這四行讓機器一開機時,會撥放所指定的電台

測試:
測試前請記得在喇叭和FM模組間插入音源線


測試時,注意一下順時針轉、逆時針轉、按下編碼器時,有沒有按照我們的規劃動作,同時也注意喇叭是否夾雜高頻掃描音,通常有錯誤時,都是(1) 信號線接錯位置 (2) 電源濾波模組左右裝反了

積木組裝:
測試完成後,剩下的就是積木組裝了,底下的組裝示範,能夠讓剩下的兩個模組穩穩地安置在作品當中,或者大家可以透過自己的創意,組出自己喜歡的造型。

首先在前方完成第三層,裝上4顆4x2的積木,把連接好的線固定在洞洞裏面


後方同樣也往上蓋到第三層,如下圖所示


完成後,我們把電源濾波模組安裝在正前方,注意此步驟我們只利用模組的兩個積木柱子進行安裝,如下圖所示


完成後可以開始組裝第四層積木,請在電源濾波模組的左右邊,裝上1x4和2x4的積木,位置如下圖所示


第四層的後方則繼續往上蓋一層1x4積木


第五層需要用到平板積木,大小為2x6和2x10,位置如下圖所示,使用2x10的目的是要讓前後方的積木連結起來,讓接下來的結構更穩固。


第六層: 請在第五層的上方蓋出如下的結構,此結構的目的是要在圈圈的位置裝上雙聲道喇叭模組


第七層:安裝雙聲道喇叭模組之前,請先用兩片2x6的平板壓住第六層,強化整體結構,位置如下


完成後就可以在剛剛畫藍色圈圈的位置安裝雙聲道喇叭模組了,注意到你可能需要先把電源線拔掉,讓電源線經積木內部繞出,再接回去。


接著組出以下結構



將此結構跨在機體後方,此舉讓後方左右邊的積木結合在一起,強化結構穩定度


到目前為止,我們已經擁有很結實的收音機主體架構了,接下來我們用剩下的積木做一些點綴裝飾,大家可以依照自己的喜好組出自己的收音機外觀。底下是筆者組出的外觀,大家可以參考參考!

背面照:

正面照:


結果演示:


討論:

以下是我們開發此創意組合時得到的經驗,大家可以參考參考
  • 高頻雜音情形: (1) 請確認電源濾波模組是否安裝在正確的位置 (2) 外來的電源裝置,特別是劣質的行動電源或USB充電器,裡面產生的雜訊有機會傳到喇叭,請換上品質優良的電源裝置
  • 收訊不良情形: (1) 室內很多收訊死角,有時候移動一個方位就能解決 (2) 不良的行動電源或USB充電器,也會影響FM收音機的收訊。
底下示範第一次接的是小米行動電源,第二次接的是無牌的行動電源,明顯的發現接上小米行動電源時的品質好很多,我們也不太能斷定原因,如果知道原因的人,希望可以回饋讓我們知道。


歡迎大家在底下留言或到我們的粉絲團留言喔!
====================================
fayalab 粉絲團
FB本篇留言版



沒有留言:

張貼留言