- RDA5807M IC
- IC PT2258
- Schematisch
- Componenten vereist
- Hoe krijgen we gegevens van Google Assistant?
- Een Adafruit-account opzetten voor communicatie
- Een IFTTT-makelaar opzetten voor FM-radio
- Arduino-code en uitleg
- De spraakgestuurde FM-radio testen met Arduino
- Verdere verbetering
Tegenwoordig luisteren de meesten van ons graag naar muziek met onze smartphones. Maar een paar jaar geleden was dit niet het geval, op dat moment waren FM-radio's de eerste keuze voor het luisteren naar muziek, podcasts, nieuws en andere. Tegenwoordig luistert niemand naar de radio voor muziek, nieuws en andere, en opa en oma vormen een uitzondering.
Dus om de oude glorie van de FM-radio een beetje nieuw leven in te blazen, ga ik in dit project een spraakgestuurde FM-radio bouwen met Google Assistance en de populaire RDA5870M Superheterodyne Receiver IC.
Bekijk ook onze vorige FM-radiocircuits:
- Op Arduino gebaseerde FM-radio
- Slimme telefoongestuurde FM-radio met Arduino
- Eenvoudig FM-zendercircuit
- Hoe een FM-zendercircuit te bouwen
RDA5807M IC
De RDA5807M is een zeer moderne single-chip FM-stereoradiotuner met een volledig geïntegreerde synthesizer, IF-selectiviteit, RDS / RBDS en MPX-decoder die het frequentiebereik van 50MHz tot 115MHz ondersteunt. Het is een zeer goedkope single-chip FM-ontvanger-IC die zeer weinig externe componenten nodig heeft om functioneel te werken. Dit IC gebruikt de I2C-interface om te communiceren met elk master-apparaat, dus al deze functies maken het zeer geschikt voor draagbare apparaten.
Dit IC heeft een interne audioprocessor die verantwoordelijk is voor zijn geweldige audiokwaliteit.
Enkele van de basisfuncties zijn:
- Ondersteuning voor wereldwijde frequentiebanden
- Ondersteuning voor RDS / RBDS
- Digitale low-IF tuner
- Volledig geïntegreerde digitale frequentiesynthesizer
- Digitale automatische versterkingsregeling (AGC)
- Basversterking
- Ondersteunt direct 32Ω weerstandsbelasting
- Geïntegreerde LDO-regelaar en meer
U kunt meer over dit IC te weten komen door dit project op Arduino gebaseerde FM-radio te doorlopen met behulp van RDA5807.
IC PT2258
De PT2258 is een IC die is gemaakt om te gebruiken als een 6-kanaals elektronische volumeregelaar, deze IC gebruikt CMOS-technologie die speciaal is ontworpen voor meerkanaals audio-videotoepassingen.
Dit IC biedt een I2C-besturingsinterface met een dempingsbereik van 0 tot -79dB bij 1dB / stap en wordt geleverd in een 20-pins DIP- of SOP-pakket.
Enkele van de basisfuncties zijn:
- 6-ingangs- en uitgangskanalen (voor 5.1 Home Audio-systemen)
- Selecteerbaar I2C-adres (voor Daisy-Chain-toepassing)
- Hoge kanaalscheiding (voor toepassing met weinig ruis)
- S / R-verhouding van> 100dB
- Bedrijfsspanning is 5 tot 9V
We hebben dit IC eerder uitgelegd in het PT2258 Digital Audio Volume Control Project. U kunt dat project bekijken als u meer wilt weten over dit IC.
Schematisch
Het schakelschema voor door Google Assistent bestuurde FM-radio wordt hieronder gegeven:
Componenten vereist
- NodeMCU-microcontroller - 1
- PT2258 digitale volumeregelaar - 1
- RDA5807 FM-radiomodule - 1
- SPDT-relais 6V - 1
- 1n4007 Diode - 1
- Schroefaansluiting 5mmx2 - 1
- 3,5 mm koptelefoonaansluiting - 1
- Logisch niveau-omzetter - 1
- 10K weerstand, 5% - 4
- 150K weerstand, 5% - 4
- 100K weerstand, 5% - 2
- 10uF condensator - 6
- 0.1uF condensator - 1
- Overbruggingsdraad - 10
Hoe krijgen we gegevens van Google Assistant?
De bovenstaande afbeelding geeft je het basisidee van het communicatieproces tussen de Google Assistent en de NodeMCU.
De Google Assistent heeft de bevoegdheid om gegevens in de Adafruit IO-server te wijzigen om dat IFTTT met MQTT als makelaar te doen.
Als er een gegevenswijziging optreedt aan de serverkant (Adafruit IO), wordt dat weerspiegeld aan de NodeMCU-kant. Om dit te bereiken, moet u de onderstaande instructie volgen-
Een Adafruit-account opzetten voor communicatie
Maak eerst een Adafruit IO-account. Log in op Adafruit IO met uw inloggegevens of meld u aan als u geen account heeft. We gebruikten eerder Adafruit IO om Alexa-gestuurde LED, Raspberry Pi-domotica en vele andere op IoT gebaseerde projecten te bouwen.
Nadat u zich hebt aangemeld bij Adafruit-account, Klik op Dashboards en klik vervolgens op Actie> Nieuw dashboard maken .
Vervolgens gaan we een nieuwe naam en een korte beschrijving van ons nieuwe Dashboard toevoegen.
Nadat je het dashboard hebt gemaakt, moet je de gebruikersnaam en de actieve sleutel uit je account halen, zoals vereist in de Arduino-code. U kunt dat krijgen door op het SLEUTEL-pictogram te klikken.
Maak daarna drie blokken; één schakelblok, één eindmaat, één tekstblok.
De blokken zijn erg belangrijk, omdat deze blokken verantwoordelijk zijn voor de communicatie tussen Google Assistentie en de NodeMCU.
Om een blok te maken, moet u op het + -teken in de rechterbovenhoek klikken.
Vervolgens gaan we de blokken maken.
Vervolgens moet u elk blok instellen, daarvoor moet u een bepaald blok aanvinken en op Volgende stap klikken .
Voor dit project is het niet nodig om instellingen te wijzigen, behalve de schakelknop.
De tekst in de schakelknop is in hoofdletters, u moet er een kleine letter van maken en de wijzigingen bijwerken.
Dat is alles, het zijn alle dingen die u nodig hebt om in de adafruit IO in te stellen.
Mijn laatste scherm ziet er zo uit:
Een IFTTT-makelaar opzetten voor FM-radio
Zoals altijd, meld je aan als je geen account hebt of meld je aan als je al een account hebt.
Nu moet u een applet maken. Volg daarvoor de onderstaande stappen:
Om een applet te maken, klikt u op uw accountpictogram en klikt u op Maken.
Klik in het aanmaakscherm op het + pictogram na if.
Daarna moet u toegang tot uw Google-account verlenen .
Daarvoor moet je naar Google Assistant zoeken in de zoekbalk en op het Google Assistant-pictogram klikken.
In het volgende scherm moeten we een trigger kiezen, Onthoud dat we drie blokken hebben gemaakt in de Adafruit IO Server, we moeten er triggers maken voor die drie blokken.
Eerst, het radiostationblok, daarvoor moeten we Zeg een zin met een tekstingrediënt selecteren .
In het volgende scherm moeten we typen wat u wilt zeggen en waarmee de Google-assistent u moet antwoorden.
Klik vervolgens op de knop Create trigger.
In het volgende scherm ziet er ongeveer zo, zoals u het hebt voltooid Als deel, het is tijd voor het vervolgens deel, klikt u op het + teken na dan .
U krijgt een scherm te zien zoals de onderstaande afbeelding, zoek naar Adafruit en klik op het Adafruit-pictogram.
Autoriseer vervolgens uw Adafruit-account bij IFTTT en klik vervolgens op Verbinden.
Vervolgens moet u op Gegevens verzenden naar Adafruit IO klikken .
Vervolgens krijgt u een vervolgkeuzelijst met feeds te zien die u eerder in het Adafruit-account heeft aangemaakt .
Kies een willekeurige en klik op actie maken, u moet dit voor alle drie doen.
En daarmee, markeert het einde van het IFTTT-proces, mijn laatste applet-scherm ziet er als volgt uit:
Arduino-code en uitleg
De Arduino-code is er om alle communicatie tussen de IC en de communicatie tussen Adafruit IO IFTTT en WIFI te beheren. De volledige code voor deze Arduino Nano FM-radio wordt aan het einde van deze tutorial gegeven. De code is een beetje lang en ingewikkeld, hier hebben we de volledige code regel voor regel uitgelegd.
Ten eerste moeten we alle vereiste bibliotheken opnemen, dit zijn:
# omvatten
Definieer vervolgens de SSID en het wachtwoord voor de WI-FI, dit is de SSID en het PASWOORD van uw router.
const char * ssid = "Android"; // SSID van uw router const char * password = "12345678"; // Wachtwoord van uw router
Vervolgens definiëren we twee booleans en een variabele, de booleans worden gebruikt om de communicatiestatus van de IC's vast te houden en de volumevariabele wordt gebruikt om het volumeniveau in te stellen.
bool potStatus; // 1 wanneer communicatie tot stand is gebracht tussen de MCU en de IC bool radioStatus; // 1 wanneer communicatie tot stand is gebracht tussen de MCU en het IC int volume = 15; // standaard volumeniveau met de IC begint met
Vervolgens hebben we een GPIO-pin met de naam Relay_Pin ingesteld om de versterker in of uit te schakelen.
#define Relay_Pin D7 // Deze pin wordt gebruikt om de radio aan en uit te zetten
Vervolgens moeten we alle noodzakelijke definities definiëren om met Adafruit IO te communiceren.
#define AIO_SERVER "io.adafruit.com" #define AIO_SERVERPORT 1883 // gebruik 8883 voor SSL #define AIO_USERNAME "debashis13" // Vervang het door uw gebruikersnaam #define AIO_KEY "aio_Qyal47xo1fYhc55QB1lEPEIRnoFp" // Vervang door uw project
De onderstaande definities FIX_BAND is een eigen definitie die door de bibliotheek wordt gebruikt.
De volgende gedefinieerde instructie stelt het interne volume van de module in.
#define FIX_BAND RADIO_BAND_FM // <De band zal worden afgestemd door deze sketch is FM. #define FIX_RADIO_VOLUME 6 /// <Standaardvolume van de module.
Maak vervolgens de benodigde objecten voor de PT2258, de RDA5807M en de WiFiClient.
PT2258 digitalPot; // PT2258 Object RDA5807M radio; // RDA5807M Object WiFiClient-client; // WiFiClient-object
Stel vervolgens de MQTT-clientklasse in door de WiFi-client en de MQTT-server en inloggegevens door te geven.
Adafruit_MQTT_Client mqtt (& client, AIO_SERVER, AIO_SERVERPORT, AIO_USERNAME, AIO_KEY);
// Stel de MQTT-clientklasse in door de WiFi-client en de MQTT-server en inloggegevens door te geven.
Dan moeten we ons abonneren op een feed. Wat vraagt u zich misschien af?
Als sommige waarden, sommige parameters veranderen in de Adafruit-server, worden de wijzigingen hier weergegeven.
Adafruit_MQTT_Subscribe Radio_Station = Adafruit_MQTT_Subscribe (& mqtt, AIO_USERNAME "/ feeds / Radio_Station"); // Methoden die worden gebruikt om te abonneren op een feed Adafruit_MQTT_Subscribe Toggle_FM = Adafruit_MQTT_Subscribe (& mqtt, AIO_USERNAME "/ feeds / Toggle_FM"); // Methoden die worden gebruikt om te abonneren op een feed Adafruit_MQTT_Subscribe Volume = Adafruit_MQTT_Subscribe (& mqtt, AIO_USERNAME "/ feeds / Volume"); // Methoden die worden gebruikt om zich te abonneren op een feed
Hieronder ziet u het functie-prototype voor de functie MQTT_connect () .
void MQTT_connect (); // Functieprototype voor MQTT Connect
Daarna beginnen we met ons installatieproces. In eerste instantie starten we de UART-communicatie met de beginmethode.
Serial.begin (9600); // UART begin Serial.println (); // voegt een extra regel toe voor afstand Serial.println (); // voegt een extra regel toe voor afstand Vervolgens doen we al het gebruikelijke om verbinding te maken met WiFI **************** alle gebruikelijke dingen die nodig zijn voor een wifi-verbinding ************************ / Serial.print ("verbinden met"); Serial.println (ssid); WiFi.mode (WIFI_STA); WiFi.begin (ssid, wachtwoord); while (WiFi.status ()! = WL_CONNECTED) {vertraging (500); Serial.print ("."); } Serial.println (""); Serial.println ("WiFi verbonden"); Serial.println ("IP-adres:"); Serial.println (WiFi.localIP ()); / **************** alle gebruikelijke dingen die nodig zijn voor een wifi-verbinding ************************ /
Vervolgens bellen met de Wire.begin () methode om een I2C-verbinding instantiëren en we bellen met de Wire.setClock () methode om de I2C frequentie 100KHz te repareren, want het is de volledige snelheid van de PT2258 IC.
Wire.begin (); // begin de I2C-startsequentie Wire.setClock (100000); // de I2C-klok instellen op 100 KHz
Vervolgens belt de init () werkwijze voor zowel de PT2258 en RDA5807 IC en houd de statusterugmelding in de eerder gedefinieerde booleans.
potStatus = digitalPot.init (); radioStatus = radio.init ();
Controleer vervolgens of de MCU in staat was om met de IC te communiceren of niet. We doen dit met twee if else- statements.
if (potStatus) {Serial.println ("PT2258-apparaat gevonden!"); } else {Serial.println ("Kan PT2258 niet starten"); } if (radioStatus) {Serial.println ("Gevonden RDA5807M-apparaat!"); } else {Serial.println ("Kan RDA5807M niet starten"); }
Roep vervolgens de abonneermethode aan vanuit de MQTT-bibliotheek. We worden door de MQTT-server op de hoogte gebracht als er wijzigingen zijn opgetreden in onze geabonneerde feeds.
mqtt.subscribe (& Radio_Station); // MQTT-abonnement instellen voor Radio_Station-feed mqtt.subscribe (& Toggle_FM); // MQTT-abonnement instellen voor Toggle_FM-feed mqtt.subscribe (& Volume); // MQTT-abonnement instellen voor volumefeed
Vervolgens stellen we de Relay-pin in als output en de pin-status op LAAG
pinMode (D7, OUTPUT); digitalWrite (D7, LOW);
Stel vervolgens een vooraf bepaald radiovolume in, deze parameter stelt het interne volume van de RDA5807 IC in, wat het einde markeert van ons installatieproces.
radio.setVolume (FIX_RADIO_VOLUME); // vervolgens stellen we het normaliseren van het radiovolume in radio.setMono (false); // we willen niet dat de chip mono output radio.setMute (false) geeft; // we willen niet dat de chip bij het starten wordt gedempt
We starten de lus door de functie MQTT_connect () aan te roepen die een verbinding tot stand brengt met de MQTT-server.
In de MQTT connect-functie proberen we drie keer om verbinding te maken met de MQTT-server.
Als het lukt, krijgen we een succesbericht, anders krijgen we een foutbericht.
leegte MQTT_connect () {int8_t ret; // 8 bit geheel getal om de nieuwe pogingen op te slaan // Stop indien al verbonden. if (mqtt.connected ()) {terugkeer; } Serial.print ("Verbinden met MQTT…"); uint8_t nieuwe pogingen = 3; while ((ret = mqtt.connect ())! = 0) {// connect retourneert 0 voor verbonden Serial.println (mqtt.connectErrorString (ret)); Serial.println ("MQTT-verbinding opnieuw proberen over 5 seconden…"); mqtt.disconnect (); vertraging (5000); // wacht 5 seconden nieuwe pogingen--; if (retries == 0) {// ga in feite dood en wacht tot WDT me reset while (1); }} Serial.println ("MQTT Connected!"); }
Begin vervolgens met het maken van een pointer naar een Adafruit_MQTT_Subscribe- object. We gebruiken dit om te bepalen welk abonnement is ontvangen.
Adafruit_MQTT_Subscribe * abonnement;
Vervolgens wachten we op een abonnementsbericht.
mqtt.readSubscription (timeInMilliseconds) zal naar een bepaalde tijd luisteren voor alle berichten die van de MQTT-server komen.
Als het een bericht krijgt vóór de time-out, zal het antwoorden met een pointer naar het abonnement of het zal gewoon een time-out geven en 0 retourneren. In dat geval zal het 2 seconden wachten.
while ((abonnement = mqtt.readSubscription (20000)))
Als er een time-out optreedt, mislukt het vullen van de while- lus. Zo niet, dan vergelijken we welk abonnement en krijgen we onze bekende abonnementen.
In deze code doen we dit voor alle drie onze geabonneerde feeds.
if (abonnement == & Toggle_FM) if (abonnement == & Radio_Station) if (abonnement == & Volume)
Dit waren de drie belangrijkste parameters die u in de loop-sectie moet begrijpen.
Dit gedeelte van de code wordt gebruikt om de Toggle_FM- feed te controleren en in te stellen.
if (abonnement == & Toggle_FM) // is het een bericht van de Toggle_FM Feed {Serial.print (F ("Got:")); Serial.println ((char *) Toggle_FM.lastread); // print de feedgegevens alleen voor foutopsporing if (String ((char *) Toggle_FM.lastread) == String ("on")) // we vergelijken de ontvangen gegevens met een bekende parameter, in dit geval verwachten we dat "on "komt van de server {// maar voordat we dat doen, moeten we er een string van maken die de vergelijking supereenvoudig maakt digitalWrite (D7, HIGH); // als we een" on "string krijgen van de server die we maken de D7-pin HIGH} if (String ((char *) Toggle_FM.lastread) == String ("off")) // we controleren opnieuw de string uit {digitalWrite (D7, LOW); // als we een "off" -tekenreeks van de server, we maken de D7-pin LOW}}
Dit gedeelte van de code wordt gebruikt om de Radio_Station- feed te controleren en in te stellen.
if (abonnement == & Radio_Station) {Serial.print (F ("Got:")); Serial.println ((char *) Radio_Station.lastread); if (String ((char *) Radio_Station.lastread) == String ("Big FM")) // horen we controleren op de string Big FM {radio.setBandFrequency (FIX_BAND, 9270); // als de bovenstaande voorwaarde waar is, stellen we het radoi-kanaal in op 92,7 MHz} // Het bovengenoemde proces wordt hieronder voortgezet 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); }}
Dit gedeelte van de code wordt gebruikt om de volumefeed te controleren en in te stellen.
if (abonnement == & Volume) // // hoor, we zoeken naar de string Volume en het is een geheel getal in een stringformaat // We moeten het terug converteren naar een geheel getal om het volume te veranderen met behulp van de PT2258 IC Serial.print (F ("Got:")); Serial.println ((char *) Volume.lastread); volume = atoi ((char *) Volume.lastread); // We gebruiken de atoi () methode om een karakter pointer om te zetten in een geheel getal volume = map (volume, 0,100,79,0); // map (value, fromLow, fromHigh, toLow, toHigh) // aangezien de pt2258 alleen integerwaarden in dB begrijpt // brengen we de waarde 0dB - 79dB in kaart naar 0% - 100%. digitalPot.setChannelVolume (volume, 0); // tenslotte stellen we het volume in voor het kanaal 0 van de PT2258 IC digitalPot.setChannelVolume (volume, 1); // we zijn tenslotte het volume aan het instellen voor kanaal 1 van de PT2258 IC}}
De spraakgestuurde FM-radio testen met Arduino
Om het circuit te testen, werd het volgende apparaat gebruikt:
- Een transformator met een 13-0-13 Tap
- Twee 4Ω 20W-luidsprekers als belasting.
- Telefoon om Google Assistant te gebruiken.
In een vorig artikel heb ik je laten zien hoe je een Simple 2x32 Watt Audio Amplifier maakt met TDA2050 IC, die ga ik ook gebruiken voor deze demonstratie, Ik heb de mechanische potentiometer ontregeld en twee draden kortgesloten met twee kleine startkabels. Nu kon ik met behulp van twee drukknoppen het volume van de versterker veranderen.
Verdere verbetering
Er zijn veel verdere verbeteringen die aan dit circuit kunnen worden aangebracht.
- Er zijn verschillende ruisproblemen omdat een audiobron naast de NodeMCU werkt, dus we moeten extra afscherming implementeren om de ruisimmuniteit te verbeteren.
- Door het algehele circuit op een PCB te bouwen, wordt de ruisimmuniteit verbeterd.
- Extra filters kunnen aan dit IC worden toegevoegd om ruis te elimineren.
Ik hoop dat je dit artikel leuk vond en er iets nieuws van hebt geleerd. Als u twijfelt, kunt u dit in de onderstaande opmerkingen stellen of onze forums gebruiken voor een gedetailleerde discussie.