- RDA5807M IC
- IC PT2258
- 回路図
- 必要なコンポーネント
- Googleアシスタントからデータを取得するにはどうすればよいですか?
- コミュニケーションのためのAdafruitアカウントの設定
- FMラジオ用のIFTTTブローカーのセットアップ
- Arduinoのコードと説明
- Arduinoを使用した音声制御FMラジオのテスト
- さらなる強化
今日、私たちのほとんどはスマートフォンで音楽を聴くのが好きです。しかし、数年前はそうではありませんでした。その時点では、FMラジオが音楽、ポッドキャスト、ニュースなどを聴くための最初の選択肢でした。今日では、音楽やニュースなどをラジオで聞く人は誰もいません。おばあちゃんとおじいちゃんは例外です。
そこで、FMラジオの古い栄光を少し復活させるために、このプロジェクトでは、Googleアシスタンス と人気のRDA5870Mスーパーヘテロダイン受信機ICを使用して音声制御のFMラジオを構築します。
また、以前のFMラジオ回路を確認してください。
- ArduinoベースのFMラジオ
- Arduinoを使用したスマートフォン制御のFMラジオ
- シンプルなFMトランスミッタ回路
- FMトランスミッタ回路の作り方
RDA5807M IC
RDA5807Mは、完全に統合されたシンセサイザー、IF選択性、RDS / RBDS、および50MHz〜115MHzの周波数範囲をサポートするMPXデコーダーを備えた非常に最新のシングルチップFMステレオラジオチューナーです。これは非常に安価なシングルチップFM受信機ICであり、機能的に動作するために必要な外付け部品はほとんどありません。このICはI2Cインターフェースを使用して任意のマスターデバイスと通信するため、このすべての機能により、ポータブルデバイスに非常に適しています。
このICには、優れたオーディオ品質を実現するオーディオプロセッサが内蔵されています。
基本的な機能のいくつかは次のとおりです-
- 世界的な周波数帯のサポート
- RDS / RBDSのサポート
- デジタル低IFチューナー
- 完全に統合されたデジタル周波数シンセサイザー
- デジタル自動利得制御(AGC)
- 低音ブースト
- 32Ωの抵抗負荷を直接サポート
- 統合LDOレギュレーターなど
このICの詳細については、RDA5807を使用してこのプロジェクトArduinoベースのFMラジオをご覧ください。
IC PT2258
PT2258は6チャンネル電子ボリュームコントローラーとして使用するために作られたICであり、このICはマルチチャンネルオーディオビデオアプリケーション用に特別に設計されたCMOSテクノロジーを使用しています。
このICは、1dB /ステップで0〜-79dBの減衰範囲を持つI2C制御インターフェースを提供し、20ピンDIPまたはSOPパッケージで提供されます。
基本機能のいくつかは次のとおりです-
- 6-入力および出力チャンネル(5.1ホームオーディオシステムの場合)
- 選択可能なI2Cアドレス(デイジーチェーンアプリケーション用)
- 高チャネル分離(低ノイズアプリケーション用)
- S / N比> 100dB
- 動作電圧は5〜9Vです
このICについては、PT2258デジタルオーディオボリュームコントロールプロジェクトで以前に説明しました。このICについてもっと知りたい場合は、そのプロジェクトを確認できます。
回路図
Googleアシスタント制御FMラジオの回路図を以下に示します。
必要なコンポーネント
- NodeMCUマイクロコントローラー– 1
- PT2258デジタルボリュームコントローラー– 1
- RDA5807 FMラジオモジュール– 1
- SPDTリレー6V– 1
- 1n4007ダイオード– 1
- ネジ留め式端子5mmx2– 1
- 3.5mmヘッドフォンジャック– 1
- ロジックレベルコンバータ– 1
- 10K抵抗、5%-4
- 150K抵抗、5%-4
- 100K抵抗、5%-2
- 10uFコンデンサ– 6
- 0.1uFコンデンサ– 1
- ジャンパーワイヤー-10
Googleアシスタントからデータを取得するにはどうすればよいですか?
上の画像は、GoogleアシスタントとNodeMCU間の通信プロセスの基本的な考え方を示しています。
Googleアシスタントには、Adafruit IOサーバーのデータを変更して、MQTTを使用したIFTTTがブローカーとして機能していることを確認する権限があります。
サーバー側(Adafruit IO)でデータ変更が発生した場合、それはNodeMCU側に反映されます。これを達成するには、以下の指示に従う必要があります-
コミュニケーションのためのAdafruitアカウントの設定
まず、AdafruitIOアカウントを作成します。資格情報を使用してAdafruitIOにログインするか、アカウントをお持ちでない場合はサインアップしてください。以前は、Adafruit IOを使用して、Alexa制御のLED、Raspberry Piホームオートメーション、およびその他の多くのIoTベースのプロジェクトを構築していました。
Adafruitアカウントにログインした後、
[ダッシュボード]をクリックしてから、[ アクション ] > [ 新しいダッシュボードの作成 ]をクリックし ます 。
次に、新しいダッシュボードの新しい名前と簡単な説明を追加します。
ダッシュボードを作成したら、Arduinoコードで必要なため、アカウントからユーザー名とアクティブキーを取得する必要があります。KEYアイコンをクリックすると取得できます。
その後、3つのブロックを作成します。1つのトグルブロック、1つのゲージブロック、1つのテキストブロック。
これらのブロックはグーグルアシスタンスとNodeMCUの間の通信を担当するため、ブロックは非常に重要です。
ブロックを作成するには、右上隅にある+記号をクリックする必要があります。
次に、ブロックを作成します。
次に、すべてのブロックを設定する必要があります。そのためには、特定のブロックにチェックマークを付けて、[次のステップ]をクリックする必要があります。
このプロジェクトでは、トグルボタン以外の設定を変更する必要はありません。
トグルボタンのテキストは大文字です。小文字にして変更を更新する必要があります。
それだけです。adafruitIOで設定する必要があるのはこれだけです。
私の最終画面は次のようになります-
FMラジオ用のIFTTTブローカーのセットアップ
いつものように、アカウントをお持ちでない場合はサインアップし、すでにアカウントをお持ちの場合はサインインしてください。
次に、アプレットを作成する必要があります。そのためには、以下の手順に従ってください。
アプレットを作成するには、アカウントアイコンをクリックし、[作成]をクリックします。
作成画面で、ifの後に+アイコンをクリックします。
その後、Googleアカウントへのアクセスを許可する必要があります。
そのためには、検索バーでGoogleアシスタントを検索し、Googleアシスタントアイコンをクリックする必要があります。
次の画面で、トリガーを選択する必要があります、
Adafruit IOサーバーで3つのブロックを作成したことを思い出してください。これらの3つのブロックに対して、トリガーを作成する必要があります。
まず、ラジオ局ブロックです。そのために、[ テキスト要素を含むフレーズを言う] を選択する必要があります。
次の画面で、 何を言いたいの か、Googleアシスタントが何を返信するのかを入力する必要があります。
次に、[トリガーの作成]ボタンをクリックします。
次の画面は次のようになります。Ifパートが完了し たら 、 then パートの時間です。 その後 、+記号をクリックします。
以下の画像のような画面が表示され、Adafruitを検索して、Adafruitアイコンをクリックします。
次に、IFTTTを使用してAdafruitアカウントを承認し、[接続]をクリックします。
次に、[データをAdafruitIOに送信]をクリックする必要があります。
次に、Adafruitアカウントで以前に作成したフィードのドロップダウンが表示されます。
いずれかを選択して[アクションの作成]をクリックします。3つすべてに対してこれを行う必要があります。
これで、IFTTTプロセスの終了をマークし、最終的なアプレット画面は次のようになります。
Arduinoのコードと説明
Arduinoコードは、IC間のすべての通信とAdafruit IOIFTTTとWIFI間の通信を管理するためにあります。このArduinoNano FMラジオの完全なコードは、このチュートリアルの最後にあります。コードは少し長くて複雑です。ここでは、完全なコードを1行ずつ説明しました。
まず、必要なすべてのライブラリを含める必要があります。それらは次のとおりです。
#include
次に、WI-FIのSSIDとパスワードを定義します。これはルーターのSSIDとパスワードです。
const char * ssid = "Android"; //ルーターのSSIDconst char * password = "12345678"; //ルーターのパスワード
次に、2つのブール値と1つの変数を定義します。ブール値は、ICの通信ステータスを保持するために使用され、音量変数は、音量レベルを設定するために使用されます。
bool potStatus; // 1MCUとICの間で通信が確立された場合boolradioStatus; // MCUとICの間で通信が確立された場合は1int volume = 15; // ICのデフォルトの音量レベルは
次に、 Relay_Pin という名前のGPIOピンを設定して、アンプをオンまたはオフにします。
#define Relay_Pin D7 //このピンは、無線のオンとオフを切り替えるために使用されます
次に、AdafruitIOと通信するために必要なすべての定義を定義する必要があります。
#define AIO_SERVER "io.adafruit.com" #define AIO_SERVERPORT 1883 // SSLに8883を使用#defineAIO_USERNAME "debashis13" //ユーザー名に置き換えます#defineAIO_KEY "aio_Qyal47xo1fYhc55QB1lEPEirnoFp" //プロジェクト認証キーに置き換えます
以下の定義 FIX_BAND は、ライブラリで使用される独自の定義です。
次に定義されるステートメントは、モジュールの内部ボリュームを設定します。
#define FIX_BAND RADIO_BAND_FM // <このスケッチによって調整されるバンドはFMです。#define FIX_RADIO_VOLUME 6 /// <モジュールのデフォルトのボリューム。
次に、PT2258、RDA5807M、およびWiFiClientに必要なオブジェクトを 作成します。
PT2258 digitalPot; // PT2258オブジェクトRDA5807M無線; // RDA5807MオブジェクトWiFiClientクライアント; // WiFiClientオブジェクト
次に、WiFiクライアントとMQTTサーバー、およびログインの詳細を渡して、MQTTクライアントクラスを設定します。
Adafruit_MQTT_Client mqtt(&client、AIO_SERVER、AIO_SERVERPORT、AIO_USERNAME、AIO_KEY);
// WiFiクライアントとMQTTサーバーおよびログインの詳細を渡して、MQTTクライアントクラスをセットアップします。
次に、フィードをサブスクライブする必要があります。 それはあなたに何を尋ねさせるのですか?
Adafruitサーバーで一部の値、一部のパラメーターが変更された場合、その変更はここに反映されます。
Adafruit_MQTT_Subscribe Radio_Station = Adafruit_MQTT_Subscribe(&mqtt、AIO_USERNAME "/ feeds / Radio_Station"); //フィードのサブスクライブに使用されるメソッドAdafruit_MQTT_SubscribeToggle_FM = Adafruit_MQTT_Subscribe(&mqtt、AIO_USERNAME "/ feeds / Toggle_FM"); //フィードのサブスクライブに使用されるメソッドAdafruit_MQTT_SubscribeVolume = Adafruit_MQTT_Subscribe(&mqtt、AIO_USERNAME "/ feeds / Volume"); //フィードのサブスクライブに使用されるメソッド
以下は、 MQTT_connect() 関数の関数プロトタイプです。
void MQTT_connect(); // MQTTConnectの関数プロトタイプ
次に、セットアッププロセスを開始します。まず、beginメソッドでUART通信を開始します。
Serial.begin(9600); // UART開始Serial.println(); //間隔のための余分な行を追加しますSerial.println(); //間隔のための余分な行を追加します次に、WiFIに接続するために通常のすべてのことを行います**************** WiFi接続に必要なすべての通常のもの*********************** / Serial.print( "connecting to"); Serial.println(ssid); WiFi.mode(WIFI_STA); WiFi.begin(ssid、password); while(WiFi.status()!= WL_CONNECTED){delay(500); Serial.print( "。"); } Serial.println( ""); Serial.println( "WiFi接続"); Serial.println( "IPアドレス:"); Serial.println(WiFi.localIP()); / **************** WiFi接続に必要なすべての通常のもの*********************** /
次に、 Wire.begin() メソッドを呼び出してI2C接続をインスタンス化し、 Wire.setClock() メソッドを呼び出してI2C周波数を 100KHz に固定します。これはPT2258ICのフルスピードです。
Wire.begin(); // I2C開始シーケンスを開始しますWire.setClock(100000); // I2Cクロックを100KHzに設定
次に、PT2258ICとRDA5807ICの両方に対して init() メソッドを呼び出し、以前に定義されたブール値に戻りステータスを保持します。
potStatus = digitalPot.init(); radioStatus = radio.init();
次に、MCUがICと通信できたかどうかを確認します。これは、2つの ifelse ステートメントで行います。
if(potStatus){Serial.println( "PT2258デバイスが見つかりました!"); } else {Serial.println( "PT2258の開始に失敗しました"); } if(radioStatus){Serial.println( "RDA5807Mデバイスが見つかりました!"); } else {Serial.println( "RDA5807Mの開始に失敗しました"); }
次に、MQTTライブラリからsubscribeメソッドを呼び出します。サブスクライブしたフィードに変更があった場合は、MQTTサーバーから通知されます。
mqtt.subscribe(&Radio_Station); // Radio_StationフィードのMQTTサブスクリプションを設定しますmqtt.subscribe(&Toggle_FM); // Toggle_FMフィードのMQTTサブスクリプションを設定しますmqtt.subscribe(&Volume); //ボリュームフィードのMQTTサブスクリプションを設定します
次に、リレーピンを出力として設定し、ピンステータスをLOWに設定します。
pinMode(D7、OUTPUT); digitalWrite(D7、LOW);
次に、所定の無線音量を設定します。このパラメータは、RDA5807 ICの内部音量を設定し、セットアッププロセスの終了を示します。
radio.setVolume(FIX_RADIO_VOLUME); //次に、正規化無線ボリュームを設定しますradio.setMono(false); //チップにモノラル出力を与えたくないradio.setMute(false); //開始時にチップをミュートにしたくない
MQTTサーバーへの接続を確立する MQTT_connect() 関数を呼び出すことにより、ループを開始します。
MQTT接続機能では、MQTTサーバーへの接続を3回試行します。
成功した場合は成功メッセージが表示され、成功しなかった場合はエラーメッセージが表示されます。
void MQTT_connect(){int8_t ret; //再試行を格納するための8ビット整数//すでに接続されている場合は停止します。if(mqtt.connected()){return; } Serial.print( "MQTTに接続しています…"); uint8_t再試行= 3; while((ret = mqtt.connect())!= 0){//接続は接続されたSerial.println(mqtt.connectErrorString(ret));に対して0を返します。Serial.println( "5秒でMQTT接続を再試行しています…"); mqtt.disconnect(); delay(5000); // 5秒待って再試行-; if(retries == 0){//基本的に死んで、WDTが私をリセットするのを待つ(1); }} Serial.println( "MQTT Connected!"); }
次に、 Adafruit_MQTT_Subscribe オブジェクトへのポインターを作成することから始めます。これを使用して、受信したサブスクリプションを判別します。
Adafruit_MQTT_Subscribe *サブスクリプション;
次に、サブスクリプションメッセージを待ちます。
mqtt.readSubscription(timeInMilliseconds) は、MQTTサーバーからのメッセージをリッスンします。
タイムアウト前にメッセージを受け取った場合は、サブスクリプションへのポインタで応答するか、タイムアウトして0を返します。その場合、2秒待機します。
while((subscription = mqtt.readSubscription(20000)))
タイムアウトが発生すると、 while ループの塗りつぶしは失敗します。そうでない場合は、どのサブスクリプションを比較し、既知のサブスクリプションを取得します。
このコードでは、サブスクライブされた3つのフィードすべてに対してこれを実行します。
if(subscription ==&Toggle_FM)if(subscription ==&Radio_Station)if(subscription ==&Volume)
これらは、ループセクションで理解する必要がある主な3つのパラメーターでした。
コードのこのセクションは、 Toggle_FM フィードを監視および設定するために使用されます。
if(subscription ==&Toggle_FM)// Toggle_FMフィードからのメッセージ{Serial.print(F( "Got:")); Serial.println((char *)Toggle_FM.lastread); //デバッグのためだけにフィードデータを出力するif(String((char *)Toggle_FM.lastread)== String( "on"))//受信したデータを既知のパラメーターと比較します。この場合、「on "はサーバーから来ています{//しかし、その前に、比較を非常に簡単にする文字列にする必要がありますdigitalWrite(D7、HIGH); //作成しているサーバーから" on "文字列を取得した場合D7ピンHIGH} if(String((char *)Toggle_FM.lastread)== String( "off"))//再び文字列をチェックしていますoff {digitalWrite(D7、LOW); //取得した場合D7ピンをLOWにするサーバーからの「オフ」文字列}}
コードのこのセクションは、 Radio_Station フィードを監視および設定するために使用されます。
if(subscription ==&Radio_Station){Serial.print(F( "Got:")); Serial.println((char *)Radio_Station.lastread); if(String((char *)Radio_Station.lastread)== String( "Big FM"))//文字列をチェックしていると聞きますBig FM {radio.setBandFrequency(FIX_BAND、9270); //上記の条件が真の場合、radoiチャネルを92.7MHzに設定します} //上記の手順は以下に続きますif(String((char *)Radio_Station.lastread)== String( "Red FM")){ radio.setBandFrequency(FIX_BAND、9350); } if(String((char *)Radio_Station.lastread)== String( "Radio Mirchi")){radio.setBandFrequency(FIX_BAND、9830); }}
コードのこのセクションは、ボリュームフィードを監視および設定するために使用されます。
if(subscription ==&Volume)// //文字列Volumeをチェックしていると聞き、それは文字列形式の整数値です// PT2258を使用してボリュームを変更するには、整数に戻す必要がありますIC Serial.print(F( "Got:")); Serial.println((char *)Volume.lastread); volume = atoi((char *)Volume.lastread); // atoi()メソッドを使用して、文字ポインターを整数に変換していますvolume = map(volume、0,100,79,0); // map(value、fromLow、fromHigh、toLow、toHigh)// pt2258はdB単位の整数値のみを理解するため、// 0dB〜79dBの値を0%〜100%にマッピングします。 digitalPot.setChannelVolume(volume、0); //結局のところ、PT2258 ICのチャンネル0の音量を設定していますdigitalPot.setChannelVolume(volume、1); //結局のところ、PT2258ICのチャンネル1の音量を設定しています}}
Arduinoを使用した音声制御FMラジオのテスト
回路をテストするために、次の装置が使用されました-
- 13-0-13タップのトランス
- 負荷として2つの4Ω20Wスピーカー。
- Googleアシスタントを使用するための電話。
前回の記事では、TDA2050 ICを使用してシンプルな2x32ワットのオーディオアンプを作成する方法を紹介しました。これをこのデモにも使用します。
機械式ポテンショメータを乱し、2本の小さなジャンパーケーブルで2本のリード線を短絡しました。さて、2つの押しボタンの助けを借りて、私はアンプの音量を変えることができました。
さらなる強化
この回路に加えることができる多くのさらなる拡張があります。
- オーディオソースがNodeMCUの横で動作しているため、さまざまなノイズの問題があります。そのため、ノイズ耐性を向上させるために追加のシールドを実装する必要があります。
- 回路全体をPCBに構築すると、ノイズ耐性が向上します。
- このICにフィルターを追加して、ノイズを除去することができます。
この記事が気に入って、そこから何か新しいことを学んだことを願っています。疑問がある場合は、以下のコメントで質問するか、フォーラムを使用して詳細なディスカッションを行うことができます。