學習目標 : 認識faya FM模組的功能及使用方式
學習時間 : 35mins
示範模組 : (1) faya brickNano
(2) faya FM模組
(3) faya雙聲道喇叭模組 (或自備耳機)
工具 : 積木底板
====================功能介紹====================
faya FM模組使用了一顆FM解碼晶片(代號Si4702),透過簡單的接線後,只要對第三方所提供的函式下指令,就能接收聽FM頻道,函示庫可以到這裡下載,解壓縮後放在Arduino資料夾裡的library裡面。
介紹指令前,先看一下faya FM模組的外觀,它的左邊有六個埠,分別是RST、SEN、SCLK、SDIO、GPIO1、GPIO2,其中SCLK與SDIO是I2C通訊協定,用來和Arduion互相溝通。
Arduino 的I2C通訊有固定的腳位,對於 faya brickNano而言,我們要把SCLK接在A5的位置、SDIO接在A4的位置。
- #include <Si4703_Breakout.h>
使用FM模組函示庫,還需要引入I2C 的函示庫。
- #include <Wire.h>
引入I2C介面。
- Si4703_Breakout 物件名稱;
此指令建構了FM模組的物件,物件名稱 : 可自行命名。
- 物件名稱.powerOn();
啟動FM模組。
- 物件名稱.setVolume();
設定FM模組的音量。
- 物件名稱.seekUp();
對FM模組向上掃頻。
- 物件名稱.seekDown();
對FM模組向下掃頻。
- 物件名稱.setChannel();
設定FM模組頻段。其他函式如靜音等等功能,大家可以透過Libraries裡的.h檔案,查看呼叫方式
====================原理知識====================
以下解釋提供給有需要知道背後原理的人:
Si4702將FM接收電路(濾波器/震盪電路/頻率合成器/類比數位轉換/雜訊抑制等等......)整合在一個系統晶片內,並且搭載一DSP控制器,負責處理內部訊號以及外界的溝通。使用者只要外接電阻、電容以及震盪器,就能利用外部的控制器 (Arduino)控制並接收訊號。需要詳細資訊的讀者,可以參考官方的datasheet。
模組電路圖如下所示,我們在電路裡加了TPA6111A2 雙聲道放大器IC,讓使用者收聽品質可以更好。
====================範例實作(一)====================
了解模組功能(原理)後,我們用以下範例來展示模組的功能:
目標:
目標:
(1) 使用Serial Monitor,控制FM模組音量及頻道
(2) 利用faya雙聲道喇叭模組撥放接收的FM電台
(2) 利用faya雙聲道喇叭模組撥放接收的FM電台
接線:
範例程式:
This file contains hidden or 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/02/26 | |
// Faya-Nugget 範例程式 (FM_Tuner.ino) | |
// 單元: 模組介紹-FM模組 | |
// 網址: https://fayalab.blogspot.com/2018/02/FMTuner.html | |
// 目標: (1)於模組上收聽 FM 頻道 | |
// 接線: Arduino ==> faya模組 | |
// A4 ==> SDIO (FM模組) | |
// A5 ==> SCLK (FM模組) | |
// D2 ==> RST (FM模組) | |
#include <Si4703_Breakout.h> //匯入Si4703 library | |
#include <Wire.h> //匯入Wire library | |
int resetPin = 2; //腳位定義 | |
int SDIO = A4; | |
int SCLK = A5; | |
Si4703_Breakout radio(resetPin, SDIO, SCLK); //定義物件類別 | |
int channel; //定義頻道 | |
int volume = 1; //預設音量 = 1 | |
void setup() | |
{ | |
Serial.begin(9600); | |
Serial.println("\n\nSi4703_Breakout Test Sketch"); //印出模組有哪些功能 | |
Serial.println("==========================="); | |
Serial.println("a b Favourite stations"); | |
Serial.println("+ - Volume (max 15)"); | |
Serial.println("u d Seek up / down"); | |
Serial.println("Send me a command letter."); | |
radio.powerOn(); //FM模組啟動 | |
radio.setVolume(volume); //音量設為1 | |
} | |
void loop() | |
{ | |
if (Serial.available()) //針對所輸入的字元做出相對應的動作 | |
{ | |
char ch = Serial.read(); // u : 搜尋下一個電台 | |
if (ch == 'u') | |
{ | |
channel = radio.seekUp(); | |
displayInfo(); | |
} | |
else if (ch == 'd') // d : 搜尋上一個電台 | |
{ | |
channel = radio.seekDown(); | |
displayInfo(); | |
} | |
else if (ch == '+') // + : 提高音量 | |
{ | |
volume ++; | |
if (volume == 16) volume = 15; | |
radio.setVolume(volume); | |
displayInfo(); | |
} | |
else if (ch == '-') // - : 降低音量 | |
{ | |
volume --; | |
if (volume < 0) volume = 0; | |
radio.setVolume(volume); | |
displayInfo(); | |
} | |
else if (ch == 'a') // a : 預設電台(1) | |
{ | |
channel = 997; // 99.7 愛樂電台 | |
radio.setChannel(channel); | |
displayInfo(); | |
} | |
else if (ch == 'b') // b : 預設電台(2) | |
{ | |
channel = 1007; // 100.7 ICRT電台 | |
radio.setChannel(channel); | |
displayInfo(); | |
} | |
} | |
} | |
void displayInfo() // 副程式 - 顯示電台與音量 | |
{ | |
Serial.print("Channel:"); Serial.print(channel); //印出CHANNEL頻段 | |
Serial.print(" Volume:"); Serial.println(volume); //印出Volume音量 | |
} |
備註:
- L18: 把連接FM模組的reset, SDIO, SCLK腳位定義好後,就能輕鬆呼叫函式控制模組
- L41~45 : 利用字元 'u' 搜尋下一電台
- L46~50 : 利用字元 'd' 搜尋上一電台
- L51~57 : 利用字元 '+' 提高音量,最高音量15
- L58~64 : 利用字元 '-' 降低音量,最低音量0
- L65~70 : 利用字元 'a' 設定最愛台 (99.7 - 台北愛樂電台)
- L71~76 : 利用字元 'b' 設定最愛台 (100.7 - ICRT電台)
範例結果:
- 範例中我們發現搜尋電台時,不一定會找到最清楚的下(上)一電台,根據經驗這和搜尋的地區有關,電台發射的訊號的強弱會影響搜尋結果。另外,本模組透過音源線當成天線,如果收訊不良,大家可以試試使用不同長度的音源線,並且試試不同的擺放位置。
也歡迎大家在底下留言或到我們的粉絲團留言喔!
沒有留言:
張貼留言