Industriële fabricage
Industrieel internet der dingen | Industriële materialen | Onderhoud en reparatie van apparatuur | Industriële programmering |
home  MfgRobots >> Industriële fabricage >  >> Manufacturing Technology >> Productieproces

FM-radio

Componenten en benodigdheden

SparkFun FM-tuner Basic Breakout - Si4703
× 1
SparkFun-luidspreker - 0,5 watt (8 ohm)
Een geweldig klinkende luidspreker voor een klein radioproject
× 1
Adafruit Monochrome 0,96" 128x64 OLED grafisch display
Een cool klein scherm met een zeer goed contrast
× 1
Texas Instruments LM386 - Audioversterker - DIP-8
Beroemde op-amp voor kleine batterij-aangedreven audioprojecten
× 1
Arduino Nano R3
× 1
Adafruit Membraan 1x4 toetsenbord
× 2
Adafruit 4-kanaals I2C bidirectionele logische niveauconverter
Ik heb die nog niet gebruikt, maar het zou moeten werken
× 1
Telescopische antenne FM voor F-connector
× 1
kenable Paneelmontage F-type schroef
× 1

Over dit project

Als kind bouwde ik AM-radio's, maar het lukte me nooit om FM-radio's te bouwen. Ze waren gewoon te ingewikkeld. Tegenwoordig kun je een complete FM-radiotuner op een chip krijgen, maar deze chips zijn componenten voor opbouwmontage en moeilijk voor een hobbyist om mee te werken. Gelukkig maakt Sparkfun een doorbraak voor de Silicon Laboratories Si4703 FM-radiotunerchip (datasheet), die alle pinnen doorbreekt. Ik zal je laten zien hoe je een complete FM-radio rond deze breakout kunt bouwen en een Arduino kunt gebruiken om de tunerfuncties te bedienen via de ingebouwde tweedraads besturingsinterface. Sparkfun biedt een complete bibliotheek waardoor dit gemakkelijk te programmeren is.

Tegelijkertijd heb ik een cool klein OLED-scherm aan het project toegevoegd met een zeer hoog contrast en een zeer laag stroomverbruik. Last but not least laat ik je zien hoe je uit een minimum aan onderdelen een geweldig klinkende mono-audioversterker kunt bouwen. De afgewerkte radio werkt vele, vele uren op drie AA-batterijen.

Sparkfun FM Tuner Basic Breakout en I2C seriële bus

De basisuitbraak is gemakkelijk om mee te werken. Soldeer eerst op de mannelijke header om de breakout te kunnen gebruiken met een breadboard. Zie pin-indeling hieronder. Soldeer op een meter dunne draad werkt voorlopig als antenne voor ANT.

  • LOUT en ROUT zijn de linker- en rechteruitgangskanalen die we op onze versterker zullen aansluiten.

(Als je niet je eigen versterker wilt bouwen, kun je in plaats daarvan het evaluatiebord kopen, dat je direct met je koptelefoon kunt gebruiken).

  • De voedingsspanning Vcc is +3,3 Volt.
  • GND is aarde of 0 Volt.

De Si4703 heeft een tweedraadsinterface, een seriële bus waarmee de tuner vanaf een Arduino via seriële communicatie kan worden bestuurd. Nauwkeuriger gezegd, de bus wordt I2C (Inter-geïntegreerd circuit; uitgesproken als I-kwadraat-C of I-two-C) genoemd en gebruikt slechts twee bidirectionele lijnen:

  • Seriële datalijn (SDA) en
  • Seriële kloklijn (SCL).
  • Daarnaast komt de Reset-lijn (RST).

In de Si4703 wordt SDA SDIO genoemd en SCL SCLK. Alle Arduino's hebben ingebouwde I2C. Als je meer wilt weten over de I2C-bus, hebben Tom Igoe en Jeff Feddersen een geweldige video gemaakt. Op onze I2C-bus fungeert de Arduino als master, terwijl zowel de Si4703 als het OLED-display als slaves fungeren.

I2C-busspanningen en keuze van Arduino

De gebruikte spanningen van de Si4703 en het OLED-display op de I2C-bus zijn 3,3 Volt. Om die reden adviseert Sparkfun in hun aansluitgids om een ​​3.3 Volt Arduino te gebruiken. Dit betekent dat je een Arduino Pro Mini moet gebruiken die iets moeilijker te programmeren is omdat hij geen USB-connector heeft en moet worden geprogrammeerd met een FTDI-breakout. Maar er is nog een probleem:de Arduino Pro Mini draait op 8 MHz, de helft van de snelheid van een Arduino Uno of Nano. Uit mijn tests bleek dat dit te langzaam is om het OLED-scherm aan te sturen. Omdat ik het display echt wilde behouden, besloot ik een Arduino Nano (16 MHz) te gebruiken met een signaalniveau van 5 Volt op de I2C-bus en bidirectionele I2C Logic Level Converters (I2C-shifters) te gebruiken om verbinding te maken met de 3,3 Volt bussignalen van het display en de radiochip. Ik had wat I2C-shifters liggen met elk twee signalen die ik in het project gebruikte. We moeten in totaal drie signalen van niveau verschuiven:SDA, SCL en RST. Ik moest twee I2C-shifters gebruiken. (In de beschrijving hierboven heb ik een I2C-shifter gekoppeld met 4 signalen die je kunnen helpen om wat bekabeling te besparen).

De Nano is bijna identiek aan de Uno, maar op een veel kleinere voetafdruk. Als je wilt, kun je in plaats daarvan de Uno gebruiken. Dat deed ik voor de eerste test. Beide hebben USB-aansluitingen en zijn gemakkelijk te gebruiken met de Arduino IDE.

Schema's Arduino-verbindingen met radio en display

Laten we vervolgens eens kijken naar de bedrading rond de Nano en de details van de I2C-busverbindingen. (Als er geen punt is, kruisen de draden elkaar gewoon).

Zoals je kunt zien wordt het project gevoed door drie AA-batterijen (4,5 Volt). De batterijen worden rechtstreeks aangesloten op de 5 Volt-pin van de Arduino Nano, waarbij de spanningsregelaar wordt omzeild. Zo loopt een Nano met plezier op 3 AA-batterijen. WAARSCHUWING! Koppel altijd de batterijen los voordat je de Nano via USB op je computer aansluit! Anders wordt de 5 Volt van uw computer kortgesloten met uw batterijen. Voer tijdens de eerste testfase het circuit uit vanaf de USB-voeding zonder batterijen! Als je op veilig wilt spelen, gebruik dan zes AA-batterijen (9 Volt) en sluit de pluspool aan op de VIN-pin (in plaats van de 5 Volt-pin) van de Nano . Zo schakelt het energiebeheer van de Nano de batterijen automatisch uit wanneer je de USB-kabel aansluit. (U kunt in plaats daarvan een 9 Volt blokbatterij gebruiken, maar deze gaat mogelijk maar een paar uur mee).

Arduino SDA (A4) en SCL (A5) worden aangesloten op de 5 Volt zijde van de I2C-shifter. Daarnaast gebruiken we D2 als RST-signaal. Aan de 3,3 Volt kant van de I2C-shifter sluiten we aan op SDIO, SCLK en RST van de Si4703. Voor het OLED-display is het voldoende om verbinding te maken met SDA en SCL. (Ik kocht de mijne op banggood.com omdat hij tweekleurig was:geel (bovenste rijen) en blauw en er was geen RST-pin).

Sluit alle componenten aan op de 3,3 Volt uitgang van de Nano en op Ground. De I2C-shifter heeft verder 5 Volt nodig aan de hoogspanningszijde.

De IO-pinnen D5-D12 zijn verbonden met de twee keypads. Door op een knop te drukken, wordt de ingang met aarde verbonden.

Laagspannings-audioversterker LM386

Ik heb de LM386-chip gebruikt om een ​​monoversterker te bouwen. De LM386 bestaat al sinds de jaren zeventig. Het is een eindversterker ontworpen voor gebruik in laagspanningsconsumententoepassingen (datasheet). De versterking is intern ingesteld op 20 om het aantal externe onderdelen laag te houden, maar de toevoeging van een externe weerstand en condensator tussen pinnen 1 en 8 zal de versterking verhogen tot elke waarde van 20 tot 200. We zullen werken met de laagste versterking van 20, wat meer dan hoog genoeg is als je een speaker van 8 Ohm gebruikt.

De schema's voor het audioversterkergedeelte van het project worden hierna gegeven:

Laten we eerst naar de Si4703 kijken. Aan de linkerkant zijn de I2C-signaalverbindingen naar de Arduino aangegeven. De audio-uitgangskanalen moeten als volgt worden aangesloten:de weerstand R4 moet worden aangesloten op LOUT en R5 op ROUT. De twee signalen worden vervolgens gecombineerd tot een MONO-signaal. Er zijn condensatoren op de uitgangen op het breakout-bord, dus we hoeven er geen toe te voegen. R2 en R3 definiëren een spanningsdeler om het ingangssignaalniveau in de versterker te verlagen. Je zou natuurlijk R2 en R3 kunnen vervangen door een potmeter en daarmee het volume regelen. Maar we willen het volume digitaal regelen. Het uitgangsniveau van de Si4703 kan via I2C stapsgewijs worden verhoogd van 1 tot 15. Met R2/R3 kun je dit afstemmen op de versterker door te experimenteren met verschillende weerstanden. Als u bijvoorbeeld R3 verhoogt, neemt het volume toe.

De schakeling komt rechtstreeks uit de datasheet. C2 moet minimaal 220 µF zijn. Kleinere waarden dempen de basrespons. Als je de bas wilt versterken, bekijk dan de datasheet. Bouw de schakeling op een breadboard en experimenteer met het toevoegen/verwijderen van componenten:C3 moet dicht bij de chip worden geplaatst. C3 en C1 zijn optioneel.

Er zijn veel video's op YouTube over LM386-projecten en velen klagen over slecht geluid. De meesten van hen hebben waarschijnlijk geen goede grondindeling. Als je naar de schema's kijkt, zie je hoe ik de ingangsaarde gescheiden heb gehouden van de uitgangsaarde, wat erg belangrijk is. Ze ontmoeten elkaar op pin 4, de grondpin van de chip. Als je hier meer over wilt weten, bekijk dan deze video van JohnAudioTech (en deze voor een compleet LM386-project).

De LM386N-1 heeft minimaal 4 Volt nodig en levert een paar honderd mWatt. Ik gebruik deze met 3 AA-batterijen (4,5 Volt) en kan het volume variëren tussen 1 en 10 en het klinkt erg goed. Voor zo'n lage voedingsspanning is het echter best belangrijk om een ​​8 Ohm (niet 4 Ohm) luidspreker te gebruiken. Als ik het volume op 15 zet, begint het vervormd te klinken. Als je je radio heel hard wilt spelen, verhoog dan de voedingsspanning naar 9 Volt.

Prototyping

Ik raad je ten zeerste aan om het hele project eerst op twee breadboards op te bouwen. Houd de Arduino, I2C-shifter en OLED-display samen op één breadbord, terwijl je de Si4703 breakout en de audioversterker dicht bij elkaar hebt op het andere breadboard om akoestische vervormingen tot een minimum te beperken. In mijn eerste prototype had ik de Si4703 dicht bij de Arduino met lange signaalkabels naar het audiogedeelte (zie foto) en dit veroorzaakte vervormingen.

Voed de Arduino vanaf USB met de gereguleerde 3,3 Volt-uitgang van de Arduino die het display en de radiochip van stroom voorziet. Voorzie de LM386 van batterijen (4,5 - 9 Volt).

De programmacode

De volgende bibliotheken moeten worden opgenomen:

#include  #include  #include  #include  #include   

Als je niet weet hoe je bibliotheken moet installeren, bekijk dan de volgende handleiding. De Sparkfun-bibliotheek is hier te vinden en biedt functies op hoog niveau om met de Si4703 te praten zonder dat u zich zorgen hoeft te maken over alle kleine details. De Adafruit-displaybibliotheken met zelfstudie zijn hier te vinden.

Vervolgens moeten we enkele definities maken:

// Invoerknoppen op radio #define volDown 9 #define volUp 10 #define channelDown 11 #define channelUp 12 // Si4703 radiochip #define resetPin 2 #define SDIO A4 #define SCLK A5 Si4703_Breakout radio(resetPin, SDIO, SCLK); #define SI4703Address 0x10 // Si4703 I2C-adres.  

Het gebruik van #define is een manier om de broncode leesbaarder te maken. Nadat je voor eens en voor altijd hebt gedefinieerd dat volDown naar pin 9 verwijst, schrijf je volDown elke keer dat je D9 bedoelt.

Vervolgens kijken we naar het setup-gedeelte:

// Variabelen definitie int kanaal; int-volume; void setup () {// Stel interne pull-up-weerstanden in op de ingangen pinMode (volDown, INPUT_PULLUP); pinMode (volUp, INPUT_PULLUP); pinMode(channelUp, INPUT_PULLUP); pinMode (kanaalomlaag, INPUT_PULLUP); // Initialiseer radio radio.powerOn(); kanaal =882; radio.setChannel(kanaal); volume =4; radio.setVolume(volume); }  

Pinnen 9-12 worden gedefinieerd als invoerpinnen. De parameter INPUT_PULLUP verbindt een interne pullup-weerstand (in de ATmega-chip) van +5V met de ingangspen. Als gevolg hiervan zal het signaalniveau van de pin HOOG zijn, tenzij u op de knop drukt (knop ingedrukt =LAAG).

De Sparkfun-bibliotheek maakt het eenvoudig om de radio te bedienen via I2C met de hoofdfuncties powerOn(), setChannel() en setVolume().

De hoofdlus luistert of er op een knop wordt gedrukt en onderneemt vervolgens actie:

void loop() { // Volume omlaag if (digitalRead(volDown) ==LOW) { if (volume> 0) volume--; radio.setVolume(volume); BijwerkenWeergave(); vertraging (100); } // Volume omhoog if (digitalRead (volUp) ==LAAG) { if (volume <15) volume++; radio.setVolume(volume); BijwerkenWeergave(); vertraging (100); } // Kanaal omlaag if (digitalRead (channelDown) ==LAAG) { channel =radio.seekDown (); BijwerkenWeergave(); vertraging (100); } // Kanaal omhoog als (digitalRead (channelUp) ==LAAG) { channel =radio.seekUp (); BijwerkenWeergave(); vertraging (100); } }  

Bekijk hieronder de volledige broncode. Het bevat vier knoppen voor vooraf ingestelde stations (waar je je favoriete stations in kunt zetten) en alle code die nodig is om het OLED-display bij te werken, dat bijna al het beschikbare RAM-geheugen gebruikt. Als je meer wilt weten over de SSD1306-bibliotheek, verwijs ik je naar de uitstekende Adafruit-tutorial. Houd er rekening mee dat de bibliotheek de schermgrootte van uw beeldscherm niet via software kan bepalen. Je moet het specificeren nadat je Adafruit_SSD1306.h hebt geïnstalleerd. Open het bibliotheekbestand, lees de instructie in de opmerkingen en bewerk het bestand dienovereenkomstig.

Er is één "geavanceerde" functie in de broncode om het batterijniveau te meten door deze te vergelijken met een interne 1,1 Volt-referentie in de AVR-chip. Omdat we op batterijen werken, hebben we geen constante referentiespanning van 5 volt om de batterijspanning tegen te meten. Als je meer wilt weten, verwijs ik je naar de volgende artikelen:Secret Arduino Voltmeter en het Gammon-forum.

Van breadboard-prototype tot afgewerkte radio

Als je zo ver bent gekomen, heb je een volledig functioneel prototype op twee breadboards. Laten we het circuit overzetten naar twee perfboards en de hele radio in een mooie projectdoos krijgen. Als je dit nog niet eerder hebt gedaan, wees dan niet bang om het te proberen. Er is niets dat je echt verkeerd kunt doen en je leert de nodige vaardigheden terwijl je verder gaat. Collin van Adafruit heeft twee leuke introductievideo's gemaakt die je kunt bekijken:Breadboards&perfboards en Perfboard prototyping.

Ik besloot de Nano samen met de I2C-shifters (ik moest twee shifters gebruiken, zie hierboven) op één perfboard te plaatsen:

Om dit prototype perfboard te maken, heb ik een tutorial gevolgd, die ik aanbeveel om in detail te bestuderen:Hoe een prototype te maken zonder printplaten te gebruiken. Vooral belangrijk is Stap 3:maak je bedradingsplan! Planning is de belangrijkste stap en het verschil tussen falen en succes. Nog wat tips:Ik gebruikte zwarte 22 AWG draad, die was te dik en moeilijk om mee te werken zoals je op de foto kunt zien. Koop in plaats daarvan wat dunne "Wire Wrapping Wire" (30 AWG) in verschillende kleuren. En gebruik een groter perfboard! Ik heb pin headers gemaakt en Dupont jumperdraden gebruikt om de verschillende onderdelen met elkaar te verbinden.

Plaats de Si4703 en de audioversterker samen op een tweede perfboard. Hier is een kleine tutorial voor een LM386-versterker, die je als inspiratie kunt gebruiken:Van Schema's tot Veroboard. Ik zou echter aanraden om een ​​IC-socket te gebruiken voor de LM386! Als alternatief heeft JohnAudioTech een mooie video gemaakt voor een compleet LM386-versterkerproject met een goede lay-out inbegrepen, waarbij de voedingsaarde gescheiden is van de signaalaarde.

Vervolgens heb je een mooie projectbehuizing nodig voor je radio. Nogmaals, Collin laat in deze video zien hoe je het moet doen. Ik vond vooral het idee met de afplakband om te markeren waar te boren leuk. Ik heb schilderstape gekocht die niet te plakkerig is. Gebruik naast plakband en een boormachine ook een lijmpistool. Lijm gewoon luidspreker, perfboards, batterijpakket enz. in de behuizing en verbind de onderdelen vervolgens met Dupont-jumpers. Het eindproduct ziet er als volgt uit:

Ik was te optimistisch en kocht een vrij kleine projectdoos zoals je kunt zien. Om een ​​vierkante opening voor het display in het voorpaneel te maken, heb ik van binnenuit met een stanleymes gesneden (om lelijke vlekken aan de buitenkant te voorkomen). Niet erg elegant, maar het werkte prima. Daarna heb ik het display met hete lijm in de opening gelijmd. Ik markeerde de maat van de luidspreker op het voorpaneel, boorde veel gaten van 3 mm voor het geluid en lijmde de luidspreker vanaf de achterkant vast.

Op de foto is de antennedraad nog te zien. Vervolgens kocht ik een op een paneel gemonteerde F-type connector en een telescopische FM-antenne. Hoewel de antenne slechts 50 cm lang is, is de ontvangst erg goed en klinkt het speakertje verrassend goed. Het meest verbazingwekkende is echter het feit dat ik de batterijen nog niet één keer heb vervangen, hoewel ik al vele dagen naar mijn kleine radio luister.

Andere radioprojecten

Ik was aanvankelijk geïnspireerd om dit project te doen toen ik de video zag van Great Scott, die in een latere video ook een mooie houten projectdoos voor zijn radio bouwde. Veel dichter in de buurt van mijn radio is echter de Si4703 Pocket FM Radio van John Owen, aangezien hij de Sparkfun breakout gebruikt en je zou zijn projectbeschrijving eens goed moeten bekijken. Ik heb zijn broncode gebruikt voor de Mono-functie en voor het meten van de batterijspanning.

Code

FM-radio
Github-repository met broncode voor Arduino Nanohttps://github.com/Notthemarsian/FM-radio

Schema's

Fritzing diagrammen FM-radio
Zowel originele Fritzing-bestanden als afbeeldingen / PDFhttps://github.com/Notthemarsian/FM-radio/tree/master/Fritzing%20diagrams

Productieproces

  1. Klasse B audioversterker
  2. 555 hysteretische oscillator
  3. Radiocircuits
  4. Principes van radio
  5. Radio
  6. Grond tot grond radiovoortplanting
  7. UnifiedWater v1
  8. Pi-Arduino internetradio
  9. Op Arduino gebaseerde FM-radio voor douchecabine
  10. Mobiele stembus
  11. Atom-gebaseerde radiocommunicatie