- FM-radio algemeen werken
- Componenten vereist
- RDA5807 Ontvanger
- Geluidsversterker
- Schakelschema Arduino FM-ontvanger
- Arduino FM Radio Code Uitleg
- Werking van Arduino FM-radio
Tegenwoordig gebruikt bijna iedereen zijn mobiele telefoon om naar muziek, nieuws, podcasts, enz. Te luisteren. Maar niet lang geleden waren we allemaal afhankelijk van lokale FM-radio's om het laatste nieuws en liedjes te ontvangen, langzaamaan verliezen deze radio's aan populariteit, maar in noodsituaties wanneer internet is uitgevallen, spelen radio's een belangrijke rol om informatie naar de gebruikers te verzenden. Radiosignalen zijn altijd aanwezig in de lucht (die worden uitgezonden door de stations), en alles wat we nodig hebben is een FM-ontvangercircuit om die radiosignalen op te vangen en om te zetten in audiosignalen. In onze vorige tutorials hebben we ook enkele andere FM-zenders en -ontvangers gebouwd die hieronder worden vermeld.
- Raspberry Pi FM-zender
- Raspberry Pi FM-ontvangerradio
- FM-zender circuit
- FM-zendercircuit zonder inductor
In deze tutorial gaan we een Arduino FM-ontvanger bouwen en deze toevoegen aan ons projectarsenaal. We zullen de RDA5807 FM-ontvanger IC gebruiken met Arduino en deze zo programmeren, spelen elk FM-radiostation af dat door de gebruiker kan worden afgestemd met een potentiometer. We zullen ook een audioversterker gebruiken samen met het circuit om het uitgangsvolume van onze Arduino FM-radio te regelen, klinkt interessant toch? Dus laten we beginnen.
FM-radio algemeen werken
De radiostations zetten elektrische signalen om in radiosignalen, en deze signalen moeten worden gemoduleerd voordat ze door de antenne worden verzonden. Er zijn twee manieren waarop een signaal kan worden gemoduleerd, namelijk AM en FM. Zoals de naam al aangeeft, moduleert amplitudemodulatie (AM) de amplitude voordat een signaal wordt verzonden, terwijl bij frequentiemodulatie (FM) de frequentie van het signaal wordt gemoduleerd voordat het door de antenne wordt verzonden. Bij de radiostations gebruiken ze frequentiemodulatie om het signaal te moduleren en vervolgens de gegevens te verzenden. Nu hoeven we alleen nog maar een ontvanger te bouwen die op bepaalde frequenties kan worden afgestemd, die signalen ontvangt en later deze elektrische signalen in audiosignalen kan omzetten. We gaan deRDA5807 FM-ontvangermodule in dit project, wat ons circuit vereenvoudigt.
Componenten vereist
- Arduino Nano
- RDA5807 ontvanger
- Geluidsversterker
- Draden aansluiten
- Pot - 100K
- Perf bord
RDA5807 Ontvanger
RDA5807 is een FM-stereoradiotunermodule met één chip met een volledig geïntegreerde synthesizer. De module ondersteunt de wereldwijde frequentieband van 50 - 115 MHz, volumeregeling en mute, programmeerbare demping (50 / 75us), ontvangstsignaalsterkte-indicator en SNR, 32,768 kHz kristaloscillator, digitale automatische versterkingsregeling, enz. blokschema van de RDA5807M tuner.
Het heeft een digitale lage IF-architectuur en integreert een versterker met lage ruis (LNA), die de FM-omroepband (50 tot 115 MHz) ondersteunt, een programmeerbare versterkingsregeling (PGA), een analoog-naar-digitaalomzetter met hoge resolutie en een high-fidelity digitaal-naar-analoog converters (DAC's). De limiter voorkomt overbelasting en beperkt het aantal intermodulatieproducten dat door aangrenzende kanalen wordt gecreëerd. De PGA versterkt het uitgangssignaal van de mixer en wordt vervolgens gedigitaliseerd met ADC's. De DSP-kern beheert de kanaalselectie, FM-demodulatie, stereo MPX-decoder en het audiosignaal. Het RDA5807-pinout- diagram voor de IC wordt hieronder gegeven.
De module werkt op de voeding van 1,8 - 3,3V. Wanneer de module tot rust komt en de besturingsinterface is geselecteerd, reset de module zichzelf wanneer VIO is ingeschakeld en ondersteunt ook een zachte reset door de trigger van bit1 van 0 naar 1 van het 02H-adres. De module gebruikt I2C-communicatie om met de MCU te communiceren en de interface begint met de startvoorwaarde, een opdrachtbyte en databytes. De RDA5807 heeft 13 16-bits registers die elk een bepaalde functie vervullen. De registeradressen beginnen met 00H, die wordt toegewezen aan chip-ID en eindigen met 0FH. In alle 13 registers zijn sommige bits gereserveerd, terwijl andere R / W zijn. Elk register voert taken uit zoals het variëren van het volume, het wijzigen van kanalen, enz. Afhankelijk van de bits die eraan zijn toegewezen.
We kunnen de module niet direct gebruiken wanneer we deze op een circuit aansluiten, omdat de pinnen zijn gesloten. Dus ik gebruikte een perf-board en enkele mannelijke pinnen en soldeerde elke pin van de module op elke mannelijke pin, zoals weergegeven in de onderstaande afbeelding.
Geluidsversterker
Een audioversterker is een elektronisch apparaat dat elektronische audiosignalen met laag vermogen versterkt tot een niveau waarop het hoog genoeg is om luidsprekers of koptelefoons aan te sturen. We hebben een eenvoudige audioversterker gebouwd met behulp van LM386, het circuit voor hetzelfde wordt hieronder weergegeven en je kunt ook de link bekijken voor meer informatie over dit circuit, en ook andere circuits voor audioversterkers bekijken.
Schakelschema Arduino FM-ontvanger
We gebruikten twee potentiometers om de FM-band af te stemmen en het volume van de audioversterker te regelen. Om het volume te veranderen kun je ofwel de pot variëren, die tussen de 1 en 8 ste pin van LM386 zit, of de pot, die is aangesloten op pin 3 van de LM386. De onderstaande foto toont het volledige schakelschema voor Arduino FM-radio.
Ik heb kleine veranderingen aangebracht in de versterker. In plaats van twee potentiometers in de versterker te gebruiken, heb ik er maar één gebruikt. Ik heb de pot, die wordt gebruikt om de versterking te veranderen, verwisseld met een weerstand. Dus nu heeft ons project twee potentiometers, een om af te stemmen en een om het volume te veranderen. De potmeter, die wordt gebruikt om het kanaal af te stemmen, is verbonden met de Arduino nano. De middelste pin van de pot is verbonden met de A0-pin van de Arduino nano, en een van de resterende twee pinnen is verbonden met de 5V en de andere is verbonden met de GND. Een andere pot wordt gebruikt om het volume van de radio te regelen en wordt aangesloten zoals weergegeven in de bovenstaande afbeelding.
De pin A4 en A5 van de Arduino zijn verbonden met SDA en SCL pin van de RDA5807M. Houd er rekening mee dat de ontvangermodule alleen werkt op 3.3V. Sluit dus de 3v3-pin van de Nano aan op de VCC-pin van de ontvangermodule. Toen de verbindingen eenmaal waren gemaakt, zag mijn opstelling er zo uit
Arduino FM Radio Code Uitleg
De code zal de ontvangermodule initialiseren en vervolgens het kanaal instellen met de vooraf ingestelde frequentie. Wanneer de waarde die door de nano op de A0-pin wordt gelezen, verandert (door de pot te veranderen), verandert de frequentie waardoor het kanaal verandert. De volledige code staat aan het einde van de pagina.
We beginnen ons programma door de vereiste draadbibliotheek toe te voegen voor communicatie met RDA5807. Vervolgens stellen we in de variabele “kanaal” de waarde van het kanaal in. Elke keer dat de radio start, wordt deze automatisch op dit kanaal afgestemd.
# omvatten
Vervolgens laden we bytes naar elk register op onze RDA5807 IC om onze initiële configuratie in te stellen. Op dit punt zijn we de ontvanger aan het resetten.
uint8_t boot_config = {/ * register 0x02 * / 0b11000001, 0b00000011, / * register 0x03 * / 0b00000000, 0b00000000, / * register 0x04 * / 0b00001010, 0b00000000, / * register 0x05 * / 0b10001000, 0b00 * register 0x04 * / 0b00001010, 0b00000000, / * register 0x05 * / 0b10001000, 0b00 * register 0x04 0b00000000, 0b00000000, / * register 0x07 * / 0b01000010, 0b00000010,};
Nadat we het apparaat hebben gereset, kunnen we het apparaat afstemmen. Om het kanaal af te stemmen, hoeven we alleen de eerste 4 bytes te programmeren. Dit deel van de code verandert het kanaal naar de gewenste frequentie. In I2C beginnen we eerst met de verzending, schrijven of lezen we de gegevens en beëindigen we de verzending. In dit ontvanger-IC hoeven we het adres niet op te geven, aangezien de datasheet duidelijk aangeeft dat de I2C-interface een vast startregister heeft, dwz 0x02h voor een schrijfbewerking en 0x0Ah voor een leesbewerking.
uint8_t tune_config = {/ * register 0x02 * / 0b11000000, 0b00000001, / * register 0x03 * / (kanaal >> 2), ((kanaal & 0b11) << 6) - 0b00010000};
In de setup initialiseren we de opstartconfiguratie (reset) en stemmen we vervolgens af op een kanaal door afstemconfiguratiebytes naar de RDA5807M te schrijven.
ongeldige setup () {Serial.begin (9600); pinMode (A0, INPUT); / * Verbind met 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 (); }
Toen ik pot gebruikte om op een frequentie af te stemmen, had ik een probleem gehad. De waarden die worden gelezen door de A0-pin zijn niet constant. Er is een knuppel met de gewenste waarde. Ik heb een 0.1uF keramische condensator gebruikt die is aangesloten tussen A0 en GND, hoewel de ruis is geminimaliseerd, is het niet op het gewenste niveau. Dus ik moest enkele wijzigingen in de code aanbrengen. In eerste instantie heb ik de metingen genoteerd die worden beïnvloed door de ruis. Ik kwam erachter dat de maximale waarde van de ruis 10 is. Dus ik heb het programma zo geschreven dat het alleen rekening houdt met de nieuwe waarde als het verschil tussen de nieuwe waarde en de oude waarde van diezelfde pin groter is dan 10 en stemt vervolgens af op het gewenste kanaal.
void loop () {int channel1 = 187, avg = 0, newA; statische int oldA = 0; int resultaat = 0; newA = analogRead (A0); if ((newA - oldA)> 10 - (oldA - newA)> 10) {Serial.println (newA); if (newA! = oldA) {channel = channel1 + (newA / 10); myChangeChannel (kanaal); oldA = newA; }}} // lus einde
Deze functie wordt gebruikt om de bytes van de tune_config- array in te stellen en verzendt de gegevens vervolgens naar de RDA5807M IC met behulp van het I2C-protocol.
void myChangeChannel (int kanaal) {/ * void als er niets anders wordt geretourneerd int * / tune_config = (kanaal >> 2); tune_config = ((kanaal & 0b11) << 6) - 0b00010000; Wire.begin (); Wire.beginTransmission (RDA5807M_ADDRESS); Wire.write (tune_config, TUNE_CONFIG_LEN); Wire.endTransmission (); }
Werking van Arduino FM-radio
Wanneer de module wordt ingeschakeld, reset onze code de RDA5807-M IC en stelt deze in op een kanaal van de gewenste gebruiker (Let op: deze frequentie wordt genomen als de basisfrequentie waarop de frequentie wordt verhoogd). Door de potentiometer te veranderen (verbonden met A0), veranderen de waarden die door de Arduino Nano worden gelezen. Als het verschil tussen de nieuwe en oude waarde groter is dan 10, houdt onze code rekening met deze nieuwe waarde. Het kanaal wordt gewijzigd afhankelijk van de verandering in de nieuwe waarde ten opzichte van de oude waarde. Het volume verhogen of verlagen is afhankelijk van de potentiometer, die tussen pin 3 en GND is aangesloten.
Aan het einde van de constructie en codering heeft u uw eigen FM-radio. De volledige werking van de FM-radio is te vinden in de video die onderaan deze pagina is gelinkt. Ik hoop dat je genoten hebt van het project en iets nuttigs hebt geleerd. Als je vragen hebt om dit project te laten werken, kun je deze achterlaten in het commentaargedeelte of onze forums gebruiken voor andere technische hulp.