學習目標 : 用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
和編碼器模組同樣的理線方式,完成後如下圖所示
範例程式:
完成了以上的組裝,我們先載入範例程式,測試一下功能是否正常,成功後,再繼續組裝上層的積木。在這邊測試程式的原因是如果等全部組裝完才測試,要是有線路沒連接好的話,還得拆掉查看內部的線路,並且再重新組裝一次。
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
// 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); | |
} |
備註:
- 本程式需要用到[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本篇留言版
沒有留言:
張貼留言