2018年2月26日 星期一

模組介紹 : faya FM模組


學習目標 : 認識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電台

接線:
(1) 電源線連接如下圖所示,連接的說明請看這篇文章簡易版


(2) 訊號線連接

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

(3) 音源線連接 - 將一音源線插入FM模組和雙聲道喇叭模組的音源座


範例程式:

// 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音量
}
view raw FM_Tuner.ino hosted with ❤ by GitHub

備註:
- 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電台)


範例結果:



討論:
    範例中我們發現搜尋電台時,不一定會找到最清楚的下(上)一電台,根據經驗這和搜尋的地區有關,電台發射的訊號的強弱會影響搜尋結果。另外,本模組透過音源線當成天線,如果收訊不良,大家可以試試使用不同長度的音源線,並且試試不同的擺放位置。

也歡迎大家在底下留言或到我們的粉絲團留言喔!
====================================

沒有留言:

張貼留言