- RDA5807M IC
- IC PT2258
- Schema
- Erforderliche Komponenten
- Wie erhalten wir Daten von Google Assistant?
- Einrichten eines Adafruit-Kontos für die Kommunikation
- Einrichten eines IFTTT-Brokers für FM-Radio
- Arduino Code und Erklärung
- Testen des sprachgesteuerten FM-Radios mit Arduino
- Weitere Verbesserung
Heutzutage hören die meisten von uns gerne Musik mit ihren Smartphones. Vor einigen Jahren war dies jedoch nicht der Fall. Zu diesem Zeitpunkt waren FM-Radios die erste Wahl, um Musik, Podcasts, Nachrichten und andere zu hören. Heutzutage hört niemand mehr Radio, Musik, Nachrichten und andere im Radio, Oma und Opa sind eine Ausnahme.
Um den alten Glanz des UKW-Radios ein wenig wiederzubeleben, werde ich in diesem Projekt ein sprachgesteuertes UKW-Radio mit Google Assistance und dem beliebten Superheterodyne Receiver IC RDA5870M bauen.
Überprüfen Sie auch unsere vorherigen FM-Radiokreise:
- Arduino-basiertes FM-Radio
- Smartphonegesteuertes FM-Radio mit Arduino
- Einfache FM-Senderschaltung
- So bauen Sie eine FM-Senderschaltung auf
RDA5807M IC
Der RDA5807M ist ein sehr moderner Single-Chip-FM-Stereoradio-Tuner mit vollständig integriertem Synthesizer, ZF-Selektivität, RDS / RBDS und MPX-Decoder, der den Frequenzbereich von 50 MHz bis 115 MHz unterstützt. Es ist ein sehr billiger Single-Chip-FM-Empfänger-IC, der nur sehr wenige externe Komponenten benötigt, um funktionsfähig zu sein. Dieser IC verwendet die I2C-Schnittstelle, um mit jedem Master-Gerät zu kommunizieren. All diese Funktionen machen ihn daher sehr gut für tragbare Geräte geeignet.
Dieser IC verfügt über einen internen Audioprozessor, der für seine hervorragende Audioqualität verantwortlich ist.
Einige der Grundfunktionen umfassen:
- Unterstützung für weltweite Frequenzbänder
- Unterstützung für RDS / RBDS
- Digitaler Low-IF-Tuner
- Voll integrierter digitaler Frequenzsynthesizer
- Digitale automatische Verstärkungsregelung (AGC)
- Bass Boost
- Unterstützt direkt die Widerstandsbelastung mit 32 Ω
- Integrierter LDO-Regler & mehr
Sie können mehr über diesen IC erfahren, indem Sie dieses Projekt Arduino-basiertes FM-Radio mit RDA5807 durchgehen.
IC PT2258
Der PT2258 ist ein IC, der als elektronischer 6-Kanal- Lautstärkeregler verwendet wird. Dieser IC verwendet die CMOS-Technologie, die speziell für Mehrkanal-Audio-Video-Anwendungen entwickelt wurde.
Dieser IC bietet eine I2C-Steuerschnittstelle mit einem Dämpfungsbereich von 0 bis -79 dB bei 1 dB / Schritt und wird in einem 20-poligen DIP- oder SOP-Gehäuse geliefert.
Einige der grundlegenden Funktionen umfassen:
- 6-Eingangs- und Ausgangskanäle (für 5.1 Home Audio-Systeme)
- Wählbare I2C-Adresse (für Daisy-Chain-Anwendungen)
- Hohe Kanaltrennung (für rauscharme Anwendung)
- S / N-Verhältnis von> 100 dB
- Die Betriebsspannung beträgt 5 bis 9V
Wir haben diesen IC bereits im PT2258 Digital Audio Volume Control Project erläutert. Sie können dieses Projekt überprüfen, wenn Sie mehr über diesen IC erfahren möchten.
Schema
Der Schaltplan für Google Assistant Controlled FM Radio ist unten angegeben:
Erforderliche Komponenten
- NodeMCU-Mikrocontroller - 1
- PT2258 Digital Volume Controller - 1
- FM-Radiomodul RDA5807 - 1
- SPDT-Relais 6V - 1
- 1n4007 Diode - 1
- Schraubklemme 5mmx2 - 1
- 3,5 mm Kopfhörerbuchse - 1
- Logikpegelwandler - 1
- 10K Widerstand, 5% - 4
- 150K Widerstand, 5% - 4
- 100K Widerstand, 5% - 2
- 10uF Kondensator - 6
- 0,1 uF Kondensator - 1
- Überbrückungskabel - 10
Wie erhalten wir Daten von Google Assistant?
Das obige Bild gibt Ihnen einen Überblick über den Kommunikationsprozess zwischen dem Google-Assistenten und der NodeMCU.
Der Google-Assistent hat die Berechtigung, Daten auf dem Adafruit IO-Server so zu ändern, dass IFTTT mit MQTT als Broker fungiert.
Wenn auf der Serverseite Datenänderungen auftreten (Adafruit IO), wird dies auf der NodeMCU-Seite angezeigt. Um dies zu erreichen, müssen Sie die folgenden Anweisungen befolgen:
Einrichten eines Adafruit-Kontos für die Kommunikation
Erstellen Sie zunächst ein Adafruit IO-Konto. Melden Sie sich mit Ihren Anmeldeinformationen bei Adafruit IO an oder melden Sie sich an, wenn Sie kein Konto haben. Wir haben zuvor Adafruit IO verwendet, um Alexa-gesteuerte LED, Raspberry Pi-Hausautomation und viele andere IoT-basierte Projekte zu erstellen.
Nachdem Sie sich bei Adafruit angemeldet haben, Klicken Sie auf Dashboards und dann auf Aktion> Neues Dashboard erstellen .
Als nächstes werden wir einen neuen Namen und eine kurze Beschreibung unseres neuen Dashboards hinzufügen .
Nachdem Sie das Dashboard erstellt haben, müssen Sie den Benutzernamen und den aktiven Schlüssel von Ihrem Konto abrufen, wie dies im Arduino-Code erforderlich ist. Sie können dies erhalten, indem Sie auf das KEY-Symbol klicken.
Machen Sie danach drei Blöcke; ein Kippblock, ein Messblock, ein Textblock.
Die Blöcke sind sehr wichtig, da diese Blöcke für die Kommunikation zwischen der Google-Unterstützung und der NodeMCU verantwortlich sind.
Um einen Block zu erstellen, müssen Sie auf das + -Zeichen in der oberen rechten Ecke klicken.
Als nächstes werden wir die Blöcke machen.
Als nächstes Sie müssen dafür jeden Block, einzurichten, müssen Sie kreuzen auf einen bestimmten Block und klicken Sie auf Nächster Schritt.
Für dieses Projekt müssen keine Einstellungen außer der Umschalttaste geändert werden.
Der Text in der Umschalttaste ist in Großbuchstaben geschrieben. Sie müssen einen kleinen Buchstaben daraus machen und die Änderungen aktualisieren.
Das war's, es sind alles Dinge, die Sie im Adafruit IO einrichten müssen.
Mein letzter Bildschirm sieht so aus:
Einrichten eines IFTTT-Brokers für FM-Radio
Wie immer Anmelden, wenn Sie kein Konto haben, oder Anmelden, wenn Sie bereits ein Konto haben.
Jetzt müssen Sie ein Applet erstellen. Befolgen Sie dazu die folgenden Schritte:
Um ein Applet zu erstellen, klicken Sie auf Ihr Kontosymbol und dann auf Erstellen.
Klicken Sie im Erstellungsbildschirm nach if auf das Symbol +.
Danach müssen Sie den Zugriff auf Ihr Google-Konto zulassen .
Dazu müssen Sie in der Suchleiste nach Google Assistant suchen und auf das Google Assistant-Symbol klicken.
Im nächsten Bildschirm müssen wir einen Auslöser auswählen, Denken Sie daran, wir haben drei Blöcke im Adafruit IO-Server erstellt. Wir müssen dort Trigger für diese drei Blöcke erstellen.
Zuerst den Radiosenderblock, dafür müssen wir Sprich eine Phrase mit einer Textzutat auswählen .
Im nächsten Bildschirm müssen wir eingeben, was Sie sagen möchten und mit was der Google-Assistent Ihnen antworten soll.
Klicken Sie dann auf die Schaltfläche Trigger erstellen.
Der nächste Bildschirm sieht ungefähr so aus, wie Sie den Abschluss Wenn ein Teil, ist es Zeit für die dann Teil klicken Sie auf das + Zeichen nach dann .
Es wird ein Bildschirm wie im folgenden Bild angezeigt. Suchen Sie nach Adafruit und klicken Sie auf das Adafruit-Symbol.
Autorisieren Sie anschließend Ihr Adafruit-Konto bei IFTTT und klicken Sie dann auf Verbinden.
Als nächstes müssen Sie auf Daten an Adafruit IO senden klicken .
Anschließend wird eine Dropdown-Liste mit Feeds angezeigt, die Sie zuvor im Adafruit-Konto erstellt haben.
Wählen Sie eine aus und klicken Sie auf Aktion erstellen. Sie müssen dies für alle drei tun.
Und damit, markiert das Ende des IFTTT-Prozesses, sieht mein letzter Applet-Bildschirm so aus:
Arduino Code und Erklärung
Der Arduino-Code dient zur Verwaltung der gesamten Kommunikation zwischen dem IC und der Kommunikation zwischen Adafruit IO IFTTT und WIFI. Der vollständige Code für dieses Arduino Nano FM-Radio finden Sie am Ende dieses Tutorials. Der Code ist etwas langwierig und komplex, hier haben wir den vollständigen Code Zeile für Zeile erklärt.
Zuerst müssen wir alle erforderlichen Bibliotheken einschließen, sie sind:
#einschließen
Definieren Sie dann die SSID und das Kennwort für das WI-FI. Dies ist die SSID und das PASSWORT Ihres Routers.
const char * ssid = "Android"; // SSID Ihres Routers const char * password = "12345678"; // Passwort Ihres Routers
Dann definieren wir zwei Boolesche Werte und eine Variable, die Booleschen Werte werden verwendet, um den Kommunikationsstatus der ICs zu speichern, und die Volumenvariable wird verwendet, um den Lautstärkepegel einzustellen.
bool potStatus; // 1 wenn die Kommunikation zwischen der MCU und dem IC hergestellt wird bool radioStatus; // 1 wenn die Kommunikation zwischen der MCU und dem IC hergestellt ist int volume = 15; // Standardlautstärke mit dem IC beginnt mit
Dann haben wir einen GPIO-Pin namens Relay_Pin eingerichtet , um den Verstärker ein- oder auszuschalten.
#define Relay_Pin D7 // Mit diesem Pin wird das Radio ein- und ausgeschaltet
Als Nächstes müssen wir alle erforderlichen Definitionen definieren, um mit Adafruit IO zu kommunizieren.
#define AIO_SERVER "io.adafruit.com" #define AIO_SERVERPORT 1883 // 8883 für SSL verwenden #define AIO_USERNAME "debashis13" // Ersetzen Sie es durch Ihren Benutzernamen #define AIO_KEY "aio_Qyal47xo1fYhc55QB1lEPEirnoFp //"
Die folgenden Definitionen FIX_BAND ist eine proprietäre Definition, die von der Bibliothek verwendet wird.
Die nächste definierte Anweisung legt das interne Volume des Moduls fest.
#define FIX_BAND RADIO_BAND_FM // <Das Band wird durch diese Skizze gestimmt und ist FM. #define FIX_RADIO_VOLUME 6 /// <Standardvolume des Moduls.
Erstellen Sie als Nächstes die erforderlichen Objekte für den PT2258, den RDA5807M und den WiFiClient.
PT2258 digitalPot; // PT2258 Objekt RDA5807M radio; // RDA5807M Object WiFiClient client; // WiFiClient-Objekt
Richten Sie dann die MQTT-Clientklasse ein, indem Sie den WiFi-Client und den MQTT-Server übergeben und die Anmeldedaten angeben.
Adafruit_MQTT_Client mqtt (& client, AIO_SERVER, AIO_SERVERPORT, AIO_USERNAME, AIO_KEY);
// Richten Sie die MQTT-Client-Klasse ein, indem Sie den WiFi-Client und den MQTT-Server übergeben und die Anmeldedaten angeben.
Dann müssen wir einen Feed abonnieren. Was lässt Sie das fragen?
Wenn sich einige Werte und Parameter auf dem Adafruit-Server ändern, werden die Änderungen hier wiedergegeben.
Adafruit_MQTT_Subscribe Radio_Station = Adafruit_MQTT_Subscribe (& mqtt, AIO_USERNAME "/ feeds / Radio_Station"); // Methoden zum Abonnieren eines Feeds Adafruit_MQTT_Subscribe Toggle_FM = Adafruit_MQTT_Subscribe (& mqtt, AIO_USERNAME "/ feeds / Toggle_FM"); // Methoden zum Abonnieren eines Feeds Adafruit_MQTT_Subscribe Volume = Adafruit_MQTT_Subscribe (& mqtt, AIO_USERNAME "/ feeds / Volume"); // Methoden zum Abonnieren eines Feeds
Unten sehen Sie den Funktionsprototyp für die Funktion MQTT_connect () .
void MQTT_connect (); // Funktionsprototyp für MQTT Connect
Dann beginnen wir unseren Einrichtungsprozess. Zunächst starten wir die UART-Kommunikation mit der Methode begin.
Serial.begin (9600); // UART begin Serial.println (); // fügt eine zusätzliche Zeile für den Abstand hinzu Serial.println (); // fügt eine zusätzliche Zeile für den Abstand hinzu Als Nächstes tun wir alles Übliche, um eine Verbindung zu WiFI herzustellen **************** alle üblichen Dinge, die für eine WiFi-Verbindung erforderlich sind *********************** / Serial.print ("Herstellen einer Verbindung zu"); Serial.println (ssid); WiFi.mode (WIFI_STA); WiFi.begin (ssid, Passwort); while (WiFi.status ()! = WL_CONNECTED) {delay (500); Serial.print ("."); } Serial.println (""); Serial.println ("WiFi verbunden"); Serial.println ("IP-Adresse:"); Serial.println (WiFi.localIP ()); / **************** alle üblichen Dinge, die für eine WiFi-Verbindung erforderlich sind *********************** /
Rufen Sie als Nächstes die Wire.begin () -Methode auf, um eine I2C-Verbindung zu instanziieren, und rufen Sie die Wire.setClock () -Methode auf, um die I2C-Frequenz auf 100 kHz festzulegen, da dies die volle Geschwindigkeit des PT2258-IC ist.
Wire.begin (); // beginne die I2C Startsequenz Wire.setClock (100000); // I2C-Takt auf 100KHz einstellen
Rufen Sie als Nächstes die Methode init () sowohl für den PT2258- als auch für den RDA5807-IC auf und halten Sie den Rückgabestatus in den zuvor definierten Booleschen Werten.
potStatus = digitalPot.init (); radioStatus = radio.init ();
Überprüfen Sie anschließend, ob die MCU mit dem IC kommunizieren konnte oder nicht. Wir machen das mit zwei if else- Anweisungen.
if (potStatus) {Serial.println ("PT2258-Gerät gefunden!"); } else {Serial.println ("PT2258 konnte nicht initiiert werden"); } if (radioStatus) {Serial.println ("RDA5807M-Gerät gefunden!"); } else {Serial.println ("RDA5807M konnte nicht initiiert werden"); }}
Rufen Sie als Nächstes die Methode subscribe aus der MQTT-Bibliothek auf. Wir werden vom MQTT-Server benachrichtigt, wenn Änderungen an unseren abonnierten Feeds vorgenommen wurden.
mqtt.subscribe (& Radio_Station); // MQTT-Abonnement für Radio_Station-Feed einrichten mqtt.subscribe (& Toggle_FM); // MQTT-Abonnement für Toggle_FM-Feed einrichten mqtt.subscribe (& Volume); // MQTT-Abonnement für Volume-Feed einrichten
Als nächstes setzen wir den Relais-Pin als Ausgang und den Pin-Status auf LOW
PinMode (D7, OUTPUT); digitalWrite (D7, LOW);
Stellen Sie als Nächstes eine vorgegebene Funklautstärke ein. Dieser Parameter legt die interne Lautstärke des RDA5807-IC fest, die das Ende unseres Einrichtungsprozesses markiert.
radio.setVolume (FIX_RADIO_VOLUME); // Als nächstes setzen wir das normalize Radio Volume Radio.setMono (false); // Wir wollen nicht, dass der Chip Mono-Ausgang gibt radio.setMute (false); // Wir wollen nicht, dass der Chip beim Start stumm geschaltet wird
Wir starten die Schleife, indem wir die Funktion MQTT_connect () aufrufen, die eine Verbindung zum MQTT-Server herstellt.
In der MQTT-Verbindungsfunktion versuchen wir dreimal, eine Verbindung zum MQTT-Server herzustellen.
Wenn es erfolgreich ist, erhalten wir eine Erfolgsmeldung, andernfalls erhalten wir eine Fehlermeldung.
void MQTT_connect () {int8_t ret; // 8-Bit-Ganzzahl zum Speichern der Wiederholungsversuche // Stopp, wenn bereits verbunden. if (mqtt.connected ()) {return; } Serial.print ("Verbindung zu MQTT herstellen…"); uint8_t wiederholt = 3; while ((ret = mqtt.connect ())! = 0) {// connect gibt 0 für verbundenes Serial.println zurück (mqtt.connectErrorString (ret)); Serial.println ("MQTT-Verbindung in 5 Sekunden wiederholen…"); mqtt.disconnect (); Verzögerung (5000); // warte 5 Sekunden retries--; if (retries == 0) {// im Grunde sterben und warten, bis WDT mich zurücksetzt, während (1); }} Serial.println ("MQTT Connected!"); }}
Erstellen Sie als Nächstes einen Zeiger auf ein Adafruit_MQTT_Subscribe- Objekt. Wir werden dies verwenden, um festzustellen, welches Abonnement erhalten wurde.
Adafruit_MQTT_Subscribe * -Abonnement;
Als nächstes warten wir auf eine Abonnementnachricht.
mqtt.readSubscription (timeInMilliseconds) wartet zu einer bestimmten Zeit auf Nachrichten, die vom MQTT-Server kommen.
Wenn es vor dem Timeout eine Nachricht erhält, antwortet es mit einem Zeiger auf das Abonnement oder es läuft nur ab und gibt 0 zurück. In diesem Fall wartet es 2 Sekunden.
while ((Abonnement = mqtt.readSubscription (20000)))
Wenn eine Zeitüberschreitung auftritt, schlägt die Füllung der while- Schleife fehl. Wenn nicht, vergleichen wir welches Abonnement und erhalten unsere bekannten Abonnements.
In diesem Code tun wir dies für alle drei unserer abonnierten Feeds.
if (Abonnement == & Toggle_FM) if (Abonnement == & Radio_Station) if (Abonnement == & Volume)
Dies waren die drei wichtigsten Parameter, die Sie im Abschnitt "Schleife" verstehen müssen.
Dieser Abschnitt des Codes wird zum Überwachen und Festlegen des Toggle_FM- Feeds verwendet.
if (Abonnement == & Toggle_FM) // ist es eine Nachricht aus dem Toggle_FM-Feed {Serial.print (F ("Got:")); Serial.println ((char *) Toggle_FM.lastread); // drucke die Feed-Daten nur zum Debuggen aus, wenn (String ((char *) Toggle_FM.lastread) == String ("on")) // wir die empfangenen Daten mit einem bekannten Parameter vergleichen, in diesem Fall erwarten wir, dass "on "kommt vom Server {//, aber bevor wir das tun, müssen wir daraus einen String machen, der den Vergleich super einfach macht digitalWrite (D7, HIGH); // wenn wir einen" on "-String von dem Server bekommen, den wir machen der D7-Pin HIGH} if (String ((char *) Toggle_FM.lastread) == String ("off")) // erneut suchen wir nach dem String off {digitalWrite (D7, LOW); // wenn wir a erhalten "off" -String vom Server machen wir den D7-Pin LOW}}
Dieser Abschnitt des Codes wird zum Überwachen und Einstellen des Radio_Station- Feeds verwendet.
if (Abonnement == & Radio_Station) {Serial.print (F ("Got:")); Serial.println ((char *) Radio_Station.lastread); if (String ((char *) Radio_Station.lastread) == String ("Big FM")) // höre, wir suchen nach dem String Big FM {radio.setBandFrequency (FIX_BAND, 9270); // Wenn die obige Bedingung erfüllt ist, setzen wir den Radoi-Kanal auf 92,7 MHz.} // Der oben erwähnte Vorgang wird unten fortgesetzt, wenn (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); }}
Dieser Abschnitt des Codes wird zum Überwachen und Einstellen des Lautstärkevorschubs verwendet.
if (Abonnement == & Volume) // // hören, dass wir nach dem String-Volume suchen und es sich um einen ganzzahligen Wert in einem String-Format handelt // Wir müssen ihn zurück in eine Ganzzahl konvertieren, um das Volume mithilfe des PT2258 zu ändern IC Serial.print (F ("Got:")); Serial.println ((char *) Volume.lastread); volume = atoi ((char *) Volume.lastread); // Wir verwenden die Methode atoi (), um einen Zeichenzeiger in eine Ganzzahl zu konvertieren. Volume = map (volume, 0,100,79,0); // map (value, fromLow, fromHigh, toLow, toHigh) // da der pt2258 nur ganzzahlige Werte in dB versteht // ordnen wir den Wert 0dB - 79dB 0% - 100% zu. digitalPot.setChannelVolume (Volume, 0); // nach all dem stellen wir die Lautstärke für den Kanal 0 des PT2258 IC digitalPot.setChannelVolume (Lautstärke, 1) ein; // nach all dem stellen wir die Lautstärke für Kanal 1 des PT2258 IC ein}}
Testen des sprachgesteuerten FM-Radios mit Arduino
Zum Testen der Schaltung wurde die folgende Vorrichtung verwendet:
- Ein Transformator mit einem 13-0-13 Tap
- Zwei 4Ω 20W Lautsprecher als Last.
- Telefon, um Google Assistant zu verwenden.
In einem früheren Artikel habe ich Ihnen gezeigt, wie man einen einfachen 2x32-Watt-Audioverstärker mit TDA2050-IC herstellt. Ich werde das auch für diese Demonstration verwenden.
Ich habe das mechanische Potentiometer gestört und zwei Kabel mit zwei kleinen Überbrückungskabeln kurzgeschlossen. Jetzt konnte ich mit Hilfe von zwei Drucktasten die Lautstärke des Verstärkers ändern.
Weitere Verbesserung
Es gibt viele weitere Verbesserungen, die an dieser Schaltung vorgenommen werden können.
- Es gibt verschiedene Rauschprobleme, da neben der NodeMCU eine Audioquelle arbeitet. Daher müssen wir eine zusätzliche Abschirmung implementieren, um die Störfestigkeit zu verbessern.
- Durch den Aufbau der Gesamtschaltung auf einer Leiterplatte wird die Störfestigkeit verbessert.
- Diesem IC können zusätzliche Filter hinzugefügt werden, um Rauschen zu vermeiden.
Ich hoffe, Ihnen hat dieser Artikel gefallen und Sie haben etwas Neues daraus gelernt. Wenn Sie Zweifel haben, können Sie in den Kommentaren unten nachfragen oder unsere Foren für detaillierte Diskussionen nutzen.