今日、ほとんどの人が携帯電話を使って音楽、ニュース、ポッドキャストなどを聴いています。しかし、少し前までは、地元のFMラジオに頼って最新のニュースや曲を入手していました。これらのラジオは徐々に人気を失っていますが、インターネットの緊急事態ではダウンしている場合、ラジオはユーザーに情報を送信するために重要な役割を果たします。ラジオ信号は常に空中に存在し(ステーションによって放送されます)、必要なのはそれらのラジオ信号をキャッチしてオーディオ信号に転送するためのFM受信機回路だけです。以前のチュートリアルでは、以下にリストされている他のいくつかのFMトランスミッターとレシーバーも作成しました。
- ラズベリーパイFMトランスミッター
- ラズベリーパイFM受信機ラジオ
- FMトランスミッタ回路
- インダクタなしのFMトランスミッタ回路
このチュートリアルでは、Arduino FMレシーバーを構築し、それをプロジェクトの兵器庫に追加します。ArduinoでRDA5807FMレシーバーICを使用してプログラムし、ポテンショメーターを使用してユーザーが調整できるFMラジオ局を再生します。また、回路と一緒にオーディオアンプを使用して、Arduino FMラジオの出力音量を制御します。興味深いですね。それでは、始めましょう。
FMラジオの一般的な作業
ラジオ局は電気信号をラジオ信号に変換します。これらの信号は、アンテナを介して送信される前に変調する必要があります。信号を変調する方法には、AMとFMの2つがあります。名前が示すように、振幅変調(AM)は信号を送信する前に振幅を変調しますが、周波数変調(FM)では、信号の周波数はアンテナを介して送信する前に変調されます。ラジオ局では、周波数変調を使用して信号を変調し、データを送信します。さて、私たちが構築する必要があるのは、特定の周波数に調整してそれらの信号を受信し、後でこれらの電気信号をオーディオ信号に変換できる受信機だけです。を使用しますこのプロジェクトのRDA5807FM受信機モジュール。これにより回路が簡素化されます。
必要なコンポーネント
- Arduino Nano
- RDA5807レシーバー
- オーディオアンプ
- 接続線
- ポット– 100K
- パフォーマンスボード
RDA5807レシーバー
RDA5807は、完全に統合されたシンセサイザーを備えたシングルチップFMステレオラジオチューナーモジュールです。このモジュールは、50〜115MHzの世界的な周波数帯域、ボリューム制御とミュート、プログラム可能なディエンファシス(50 / 75us)、受信信号強度インジケーターとSNR、32.768KHz水晶発振器、デジタル自動ゲイン制御などをサポートします。RDA5807Mチューナーのブロック図。
デジタル低IFアーキテクチャを備え、FM放送帯域(50〜115 MHz)をサポートする低ノイズアンプ(LNA)、プログラム可能なゲイン制御(PGA)、高解像度のアナログ-デジタルコンバーター、および忠実度の高いデジタル-アナログコンバーター(DAC)。リミッターは、過負荷を防ぎ、隣接するチャネルによって作成される相互変調積の数を制限します。 PGAはミキサー出力信号を増幅し、ADCでデジタル化します。 DSPコアは、チャネル選択、FM復調、ステレオMPXデコーダー、および出力オーディオ信号を管理します。ICのRDA5807ピン配置図を以下に示します。
モジュールは1.8〜3.3Vの電源で動作します。静止して制御インターフェースが選択されると、モジュールはVIOの電源投入時に自身をリセットし、02Hアドレスの0から1へのビット1のトリガーによるソフトリセットもサポートします。モジュールはI2C通信を使用してMCUと通信し、インターフェイスは開始条件、コマンドバイト、およびデータバイトで始まります。 RDA5807には13個の16ビットレジスタがあり、それぞれが特定の機能を実行します。レジスタアドレスは00Hで始まり、チップIDに割り当てられ、0FHで終わります。 13個のレジスタすべてで、一部のビットは予約されていますが、一部はR / Wです。各レジスタは、割り当てられたビットに応じて、音量の変更、チャネルの変更などのタスクを実行します。
モジュールを回路に接続する場合、ピンが閉じているため、モジュールを直接使用することはできません。そこで、下の写真に示すように、パフォーマンスボードといくつかのオスピンを使用して、モジュールの各ピンを各オスピンにはんだ付けしました。
オーディオアンプ
オーディオアンプは、低電力の電子オーディオ信号を、スピーカーやヘッドホンを駆動するのに十分な高さまで増幅する電子デバイスです。LM386を使用して簡単なオーディオアンプを構築しました。その回路を以下に示します。リンクを確認してこの回路の詳細を確認したり、他のオーディオアンプ回路を確認したりすることもできます。
ArduinoFM受信機の回路図
FM帯域の調整とオーディオアンプの音量の制御には、 2つのポテンショメータを使用しました。音量を変更するには、LM386の1〜8番目のピンに接続されているポットまたはLM386のピン3に接続されているポットを変更します。以下の写真は、ArduinoFMラジオの完全な回路図を示しています。
アンプは少し変更しました。アンプで2つのポテンショメータを使用する代わりに、1つだけを使用しました。ゲイン変更に使用するポットを抵抗器に交換しました。これで、プロジェクトには2つのポテンショメータがあります。1つは調整用で、もう1つは音量を変更するためのものです。チャネルを調整するために使用されるポテンショメータは、Arduinonanoに接続されています。ポットの中央のピンはArduinonanoのA0ピンに接続され、残りの2つのピンのいずれかは5Vに接続され、もう一方はGNDに接続されます。別のポットはラジオの音量を制御するために使用され、上の図に示すように接続されています。
ArduinoのピンA4とA5は、RDA5807MのSDAピンとSCLピンに接続されています。レシーバーモジュールは3.3Vでのみ動作することに注意してください。したがって、Nanoの3v3ピンをレシーバーモジュールのVCCピンに接続します。接続が確立されると、私のセットアップは次のようになりました
ArduinoFMラジオコードの説明
コードは受信機モジュールを初期化し、次にプリセット周波数でチャンネルを設定します。nanoがA0ピンで読み取った値が(ポットを変更することによって)変更されると、周波数が変更され、チャネルが変更されます。完全なコードはページの最後にあります。
プログラムは、RDA5807との通信に必要なワイヤーライブラリを追加することから始めます。次に、変数「channel」でチャネルの値を設定します。ラジオが起動するたびに、このチャンネルに自動的に調整されます。
#include
次に、RDA5807 ICの各レジスタにバイトをロードして、初期構成を設定します。この時点で、レシーバーをリセットしています。
uint8_t boot_config = {/ *レジスタ0x02 * / 0b11000001、0b00000011、/ *レジスタ0x03 * / 0b00000000、0b00000000、/ *レジスタ0x04 * / 0b00001010、0b00000000、/ *レジスタ0x05 * / 0b10001000、0b00001111、/ *レジスタ0x06 * / 0b00000000、0b00000000、/ *レジスタ0x07 * / 0b01000010、0b00000010、};
デバイスをリセットした後、デバイスを調整できます。チャネルを調整するには、最初の4バイトをプログラムするだけで済みます。コードのこの部分は、チャネルを目的の周波数に変更します。I2Cでは、最初に送信を開始し、データの書き込みまたは読み取りを行ってから、送信を終了します。このレシーバICでは、I2Cインターフェイスに固定の開始レジスタ(書き込み操作の場合は0x02h、読み取り操作の場合は0x0Ah)があることがデータシートに明確に記載されているため、アドレスを指定する必要はありません。
uint8_t tune_config = {/ *レジスタ0x02 * / 0b11000000、0b00000001、/ *レジスタ0x03 * /(チャネル>> 2)、((チャネル&0b11)<< 6)-0b00010000};
セットアップでは、ブート構成を初期化(リセット)してから、調整構成バイトをRDA5807Mに書き込むことによってチャネルに調整します。
void setup(){Serial.begin(9600); pinMode(A0、INPUT); / * RDA5807M FMチューナーに接続:* / 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(); }
ポットを使って周波数をチューニングするとき、私は問題に直面していました。 A0ピンによって読み取られる値は一定ではありません。希望の値でクラブされたノイズがあります。 A0とGNDの間に0.1uFのセラミックコンデンサを接続して使用しましたが、ノイズは最小限に抑えられましたが、希望のレベルには達していません。そのため、コードにいくつかの変更を加える必要がありました。最初に、ノイズの影響を受ける測定値を書き留めました。ノイズの最大値が10であることがわかりました。そこで、同じピンの新しい値と古い値の差が10より大きい場合にのみ、新しい値を考慮するようにプログラムを作成しました。次に、目的のチャンネルにチューニングします。
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; }}} //ループ終了
この関数は、 tune_config 配列のバイトを設定し、I2Cプロトコルを使用してデータをRDA5807MICに送信するために使用されます。
void myChangeChannel(int channel){/ *何も返されない場合はvoidint * / tune_config =(channel >> 2); tune_config =((channel&0b11)<< 6)-0b00010000; Wire.begin(); Wire.beginTransmission(RDA5807M_ADDRESS); Wire.write(tune_config、TUNE_CONFIG_LEN); Wire.endTransmission(); }
ArduinoFMラジオの動作
モジュールの電源がオンになると、コードはRDA5807-M ICをリセットし、ユーザーが希望するチャネルに設定します(注:この周波数は、周波数が増分される基本周波数と見なされます)。ポテンショメータ(A0に接続)を変更すると、ArduinoNanoによって読み取られる値が変更されます。新しい値と古い値の差が10より大きい場合、コードはこの新しい値を考慮します。古い値から新しい値への変更に応じて、チャネルが変更されます。音量の増減は、ピン3とGNDの間に接続されているポテンショメータによって異なります。
構築とコーディングの最後に、独自のFMラジオを使用することになります。FMラジオの完全な動作は、このページの下部にリンクされているビデオで見つけることができます。あなたがプロジェクトを楽しんで、何か役に立つことを学んだことを願っています。このプロジェクトを機能させるために質問がある場合は、コメントセクションに残すか、フォーラムを使用して他の技術的なヘルプを参照してください。