幾乎每個人都使用手機(jī)收聽音樂、新聞、播客等。但是不久以前,我們都依靠當(dāng)?shù)氐腇M廣播電臺來獲取最新的新聞和歌曲,這些廣播電臺逐漸失去了知名度,但是在互聯(lián)網(wǎng)出現(xiàn)緊急情況時處于關(guān)閉狀態(tài)時,收音機(jī)在將信息傳輸?shù)接脩舴矫姘缪葜匾巧o線電信號始終存在于空中(由電臺廣播),我們所需要的只是一個FM接收器電路,以捕獲這些無線電信號并將其轉(zhuǎn)換為音頻信號。
在本篇文章中,我們將制作一個Arduino FM接收器。我們將基于Arduino使用RDA5807 FM接收器IC并對它進(jìn)行編程,以便播放任何可由用戶使用電位計進(jìn)行調(diào)諧的FM廣播電臺。我們還將使用音頻放大器和電路來控制Arduino FM收音機(jī)的輸出音量,聽起來有趣嗎?讓我們開始吧。
FM調(diào)頻廣播的工作原理
無線電臺將電信號轉(zhuǎn)換為無線電信號,并且這些信號在通過天線傳輸之前必須進(jìn)行調(diào)制??梢哉{(diào)制信號的方法有兩種,即AM和FM。顧名思義,調(diào)幅(AM)在發(fā)送信號之前先對幅度進(jìn)行調(diào)制,而在調(diào)頻(FM)中,信號的頻率要在通過天線發(fā)送之前進(jìn)行調(diào)制。在無線電臺,它們使用調(diào)頻來調(diào)制信號,然后發(fā)送數(shù)據(jù)。現(xiàn)在,我們需要制作的是一個可以調(diào)諧到特定頻率的接收器,接收這些信號,然后再將這些電信號轉(zhuǎn)換為音頻信號。我們將在本文中使用RDA5807 FM接收器模塊,從而簡化了電路。
所需組件
● Arduino Nano開發(fā)板
● RDA5807接收器
● 音頻放大器
● 連接線
● 100K電位器
● 面包板
RDA5807接收器
RDA5807是具有完全集成的合成器的單芯片FM立體聲無線電調(diào)諧器模塊。該模塊支持全球范圍內(nèi)的50 – 115MHz頻帶、音量控制和靜音,可編程去加重(50 / 75us),接收信號強(qiáng)度指示器和SN??R,32.768KHz晶體振蕩器,數(shù)字自動增益控制等。下圖顯示了RDA5807M調(diào)諧器的框圖。
它具有數(shù)字低中頻架構(gòu),并集成了一個低噪聲放大器(LNA),該放大器支持FM廣播頻段(50至115 MHz)、可編程增益控制(PGA)、高分辨率模數(shù)轉(zhuǎn)換器和高保真數(shù)模轉(zhuǎn)換器(DAC)。限幅器可防止過載,并限制相鄰?fù)ǖ喇a(chǎn)生的互調(diào)產(chǎn)物的數(shù)量。 PGA放大混頻器輸出信號,然后用ADC數(shù)字化。 DSP內(nèi)核管理通道選擇、FM解調(diào)、立體聲MPX解碼器和輸出音頻信號。該IC的RDA5807引腳排列圖如下。
該模塊工作在1.8 – 3.3V的電源。當(dāng)進(jìn)入靜止?fàn)顟B(tài)并選擇了控制接口時,模塊會在VIO上電時進(jìn)行復(fù)位,并且還支持通過觸發(fā)02H地址的0到1中的bit1進(jìn)行軟復(fù)位。該模塊使用I2C通信與MCU進(jìn)行通信,并且連接以啟動條件、命令字節(jié)和數(shù)據(jù)字節(jié)開始。 RDA5807具有13個16位寄存器,每個寄存器執(zhí)行特定功能。寄存器地址以00H開頭,該地址分配給芯片ID,以0FH結(jié)尾。在所有13個寄存器中,有些位保留,而有些則是R / W。每個寄存器根據(jù)分配給它們的位執(zhí)行諸如改變音量、改變通道等任務(wù)。
將模塊連接到電路時,由于模塊引腳是焊盤形式,我們無法直接使用該模塊。因此,我使用一塊洞洞板和一些插針,將模塊的每個引腳焊接到插針上,如下圖所示。
音頻放大器
音頻放大器是一種電子設(shè)備,可將低功率電子音頻信號放大到足以驅(qū)動揚(yáng)聲器或耳機(jī)的電平。我們使用LM386構(gòu)建了一個簡單的音頻放大器,其電路如下所示。
Arduino FM接收器電路圖
我們使用了兩個電位器來調(diào)節(jié)FM頻段和控制音頻放大器的音量。要更改音量,您可以改變電位器,電位器連接在LM386的1至8號引腳之間,也可以改變電位器,其連接在LM386的3號引腳之間。下圖顯示了Arduino FM收音機(jī)的完整電路圖。
我在放大器上做的一些微小改動。我沒有在放大器中使用兩個電位器,而是僅使用一個。我用電阻互換了用來改變增益的電位器。因此,現(xiàn)在我們的項目有兩個電位器,一個用于調(diào)節(jié),另一個用于改變音量。用于調(diào)節(jié)通道的電位器與Arduino nano連接。電位器的中心引腳連接到Arduino nano的A0引腳,其余兩個引腳中的一個連接到5V,另一個連接到GND。另一個電位器用于控制收音機(jī)的音量,并按上圖所示進(jìn)行連接。
Arduino的引腳A4和A5連接到RDA5807M的SDA和SCL引腳。請記住,接收器模塊只能在3.3V電壓下工作。因此,將Nano的3v3引腳連接到接收器模塊的VCC引腳。建立連接后,設(shè)置如下所示
Arduino FM收音機(jī)代碼說明
該代碼將初始化接收器模塊,然后以預(yù)設(shè)頻率設(shè)置頻道。當(dāng)nano在A0引腳上讀取的值發(fā)生變化(通過改變電位器)時,頻率也會發(fā)生變化,從而改變通道。完整的代碼在頁面末尾給出。
我們在程序開始時添加與RDA5807通信所需的wire庫。然后,定義變量“channel”,設(shè)置頻道。每當(dāng)收音機(jī)啟動時,它都會自動調(diào)諧到該頻道。
#include
uint16_t channel = 187;
接下來,我們將字節(jié)加載到RDA5807 IC上的每個寄存器以設(shè)置我們的初始配置。然后,我們復(fù)位接收器。
uint8_t boot_config[] = {
/* register 0x02 */
0b11000001,
0b00000011,
/* register 0x03 */
0b00000000,
0b00000000,
/* register 0x04 */
0b00001010,
0b00000000,
/* register 0x05 */
0b10001000,
0b00001111,
/* register 0x06 */
0b00000000,
0b00000000,
/* register 0x07 */
0b01000010,
0b00000010,
};
復(fù)位設(shè)備后,我們可以調(diào)諧設(shè)備。要調(diào)整頻道,我們只需要編程前4個字節(jié)。這部分代碼會將頻道更改為所需的頻率。首先在I2C中,我們開始傳輸,寫入或讀取數(shù)據(jù),然后結(jié)束傳輸。在該接收器IC中,我們無需指定地址,因為數(shù)據(jù)表清楚地表明I2C接口具有固定的起始寄存器,即用于寫入操作的0x02h和用于讀取操作的0x0Ah。
uint8_t tune_config[] = {
/* register 0x02 */
0b11000000,
0b00000001,
/* register 0x03 */
(channel >> 2),
((channel & 0b11) << 6 ) | 0b00010000
};
在setup函數(shù)中,我們初始化引導(dǎo)配置,然后通過將調(diào)整配置字節(jié)寫入RDA5807M來調(diào)整至通道。
void setup()
{
Serial.begin(9600);
pinMode(A0,INPUT);
/* Conect to RDA5807M FM Tuner: */
Wire.begin();
Wire.beginTransmission(RDA5807M_ADDRESS);
Wire.write(boot_config, BOOT_CONFIG_LEN);
Wire.endTransmission();
Wire.beginTransmission(RDA5807M_ADDRESS);
Wire.write(tune_config, TUNE_CONFIG_LEN);
Wire.endTransmission();
}
當(dāng)使用電位器調(diào)諧到某個頻率時,我遇到了一個問題。 A0引腳讀取的值不是恒定的。噪聲與所需的值成比例。我使用了一個連接在A0和GND之間的0.1uF陶瓷電容器,盡管該噪聲已降至最低,但仍未達(dá)到所需的水平。因此,我必須對代碼進(jìn)行一些更改。首先,我記下了受噪聲影響的讀數(shù)。我發(fā)現(xiàn)噪聲的最大值是10。因此,我以這樣的方式編寫程序,即只有在同一引腳的新值和舊值之間的差大于10時,它才會考慮新值。然后調(diào)諧到所需的頻道。
void loop()
{
int channel1 =187 ,avg=0, newA;
static int oldA = 0;
int result = 0;
newA = analogRead(A0);
if ((newA - oldA) > 10 || (oldA - newA) > 10){
Serial.println(newA);
if(newA!= oldA){
channel = channel1+(newA/10);
myChangeChannel(channel);
oldA=newA;
}
}
}//loop end
以下函數(shù)用于設(shè)置tune_config數(shù)組的字節(jié),然后使用I2C協(xié)議將數(shù)據(jù)發(fā)送到RDA5807M。
void myChangeChannel(int channel){ /* void if nothing is returned else int */
tune_config[2] = (channel >> 2);
tune_config[3] = ((channel & 0b11) << 6 ) | 0b00010000;
Wire.begin();
Wire.beginTransmission(RDA5807M_ADDRESS);
Wire.write(tune_config, TUNE_CONFIG_LEN);
Wire.endTransmission();
}
Arduino FM收音機(jī)的工作過程
當(dāng)模塊上電時,我們的代碼會復(fù)位RDA5807-M并將其設(shè)置為所需用戶的通道(注意:該頻率被視為將增加頻率的基準(zhǔn)頻率)。通過更改電位器(連接到A0),Arduino Nano讀取的值會更改。如果新值和舊值之間的差大于10,我們的代碼將考慮該新值。根據(jù)新值與舊值之間的變化來更改通道。增大或減小音量取決于連接在引腳3和GND之間的電位器。
電路搭建和代碼編寫完成后,您將擁有自己的FM收音機(jī)。希望您喜歡本篇文章并學(xué)到一些有用的東西。
編輯:hfy
-
音頻放大器
+關(guān)注
關(guān)注
39文章
898瀏覽量
52985 -
無線電臺
+關(guān)注
關(guān)注
1文章
26瀏覽量
13702 -
無線電信號
+關(guān)注
關(guān)注
1文章
50瀏覽量
12785 -
Arduino
+關(guān)注
關(guān)注
187文章
6458瀏覽量
186504
發(fā)布評論請先 登錄
相關(guān)推薦
評論