Bouw een Betrouwbare FM-Radio met SparkFun- en Arduino-Componenten
Onderdelen en Benodigdheden
| Onderdeel | Aantal | Opmerking |
|---|---|---|
| SparkFun FM Tuner Basic Breakout - Si4703 | 1 | FM-radio tuner op breakout-board |
| SparkFun Speaker - 0,5 Watt (8 Ohm) | 1 | Goed klinkende luidspreker voor kleine radioprojecten |
| Adafruit Monochrome 0,96" 128x64 OLED-grafisch display | 1 | Compact display met uitstekende contrast |
| Texas Instruments LM386 - Audio-versterker - DIP-8 | 1 | Klassieke op-amp voor batterij-aangedreven audio |
| Arduino Nano R3 | 1 | Compacte Arduino met USB-interface |
| Adafruit Membrane 1x4 Keypad | 2 | Voor bediening (volume, zender) |
| Adafruit 4-kanaals I2C bidirectionele logic level converter | 1 | Nodig voor 3,3V/5V I2C-communicatie |
| Telescopische FM-antenne voor F-connector | 1 | Betere ontvangst dan draadantenne |
| Panel-mount F-type schroefconnector | 1 | Voor antenne-aansluiting op behuizing |
Over dit Project
Als kind bouwde ik AM-radios, maar FM-radios waren te complex. Tegenwoordig kun je een complete FM-tuner op een chip kopen, maar deze SMD-chips zijn lastig voor hobbyisten. SparkFun biedt een breakout-board voor de Silicon Laboratories Si4703-chip (datasheet), waarmee alle pinnen toegankelijk zijn. In dit project bouw je een complete FM-radio rondom deze breakout en controleer je de tuner-functies met een Arduino via de ingebouwde twee-draads I2C-interface. SparkFun levert een complete library die programmeren eenvoudig maakt.
Daarnaast voegde ik een compact OLED-display toe met hoge contrast en laag stroomverbruik. Ten slotte laat ik zien hoe je een goed klinkende mono-audioversterker bouwt met minimaal aantal onderdelen. De radio draait urenlang op drie AA-batterijen.
SparkFun FM Tuner Basic Breakout en I2C-seriële Bus
De basis-breakout is eenvoudig te gebruiken. Soldeer eerst de mannelijke headers voor breadboard-gebruik. Zie de pin-layout hieronder. Een meter dunne draad op de ANT-pin werkt als antenne.


- LOUT en ROUT: linker- en rechter-audio-uitgang, te verbinden met de versterker.
- Vcc: voedingsspanning +3,3V.
- GND: massa (0V).
De Si4703 gebruikt een twee-draads interface (I²C - Inter-Integrated Circuit) met twee bidirectionele lijnen:
- Serial Data Line (SDA) - op de Si4703 SDIO genoemd
- Serial Clock Line (SCL) - op de Si4703 SCLK genoemd
Daarnaast is er een Reset-lijn (RST). Alle Arduinos hebben ingebouwde I²C-ondersteuning. Op onze I²C-bus fungeert de Arduino als master; zowel de Si4703 als het OLED-display zijn slaves.
I²C-bus Spanningen en Keuze van Arduino
De Si4703 en het OLED-display werken op 3,3V-logic op de I²C-bus. SparkFun adviseert in hun hookup-guide een 3,3V Arduino (bijv. Arduino Pro Mini). Dit heeft echter twee nadelen: het ontbreekt een USB-connector (programmeren vereist FTDI-breakout) en draait op 8 MHz - half zo snel als een Uno/Nano. Mijn tests toonden aan dat 8 MHz te traag is voor het OLED-display.
Ik koos voor een Arduino Nano (16 MHz, 5V logica) en gebruik bidirectionele I²C Logic Level Converters (I²C-shifters) om de 5V signalen van de Nano om te zetten naar 3,3V voor display en radiochip. We moeten drie signalen level-shiften: SDA, SCL en RST. Hiervoor gebruikte ik twee 2-kanaals shifters (een 4-kanaals shifter bespaart bedrading).
De Nano is vrijwel identiek aan de Uno maar op een kleiner formaat. Beide hebben USB en werken direct met de Arduino IDE.
Schema: Arduino Verbindingen met Radio en Display

Het project wordt gevoed door drie AA-batterijen (4,5V), aangesloten direct op de 5V-pin van de Nano, waarbij de spanningsregelaar wordt overgeslagen. WAARSCHUWING: Altijd batterijen loskoppelen voordat je de Nano via USB met de computer verbindt! Anders kortsluit je de 5V van de computer met de batterijen. Tijdens testen voed je het circuit via USB zonder batterijen. Veiliger: gebruik zes AA-batterijen (9V) op de VIN-pin - de Nano schakelt dan automatisch over op USB-voeding wanneer aangesloten.
Arduino SDA (A4) en SCL (A5) gaan naar de 5V-kant van de I²C-shifter. D2 dient als RST-signaal. Op de 3,3V-kant verbinden we SDIO, SCLK en RST van de Si4703. Voor het OLED-display zijn SDA en SCL voldoende (mijn display had geen RST-pin). Alle componenten worden gevoed vanuit de 3,3V-uitgang van de Nano en GND. De I²C-shifter krijgt 5V op de hoog-spanningskant. De I/O-pinnen D5-D12 gaan naar de twee keypads; een ingedrukte knop verbindt de ingang met GND.
Laagspannings Audio-versterker LM386
Ik gebruikte de LM386-chip voor een mono-versterker. De LM386 bestaat al sinds de zeventigerjaren en is ontworpen voor laagspannings-consumertoepassingen (datasheet). De versterking is intern ingesteld op 20x om het aantal externe componenten laag te houden, maar met een externe weerstand en condensator tussen pin 1 en 8 kan de versterking tot 200x worden verhoogd. We werken met de minimale versterking van 20x, wat meer dan voldoende is voor een 8-Ohm luidspreker.


De audio-uitgangen van de Si4703: R4 naar LOUT, R5 naar ROUT. Beide signalen worden gecombineerd tot een MONO-signaal. Op de breakout zitten al uitgangscondensatoren, dus er hoeven geen extra te. R2 en R3 vormen een spanningsdeler om het invoerniveau van de versterker te verlagen. Je kunt R2/R3 vervangen door een potentiometer voor handmatig volume, maar we regelen volume digitaal via I²C (stappen 1-15). Met R2/R3 pas je dit aan de versterker aan door te experimenteren met weerstandswaarden (bijv. hogere R3 = harder volume).
Het circuit komt rechtstreeks uit de datasheet. C2 moet minimaal 220 µF zijn; kleinere waarden dempen de bas. C3 moet dicht bij de chip geplaatst worden. C3 en C1 zijn optioneel.
Veel LM386-projecten op YouTube klagen over slecht geluid, vaak door slechte massa-layout. In het schema zie je hoe ik de invoer-massa gescheiden houd van de uitvoer-massa - ze komen alleen samen bij pin 4 (massa van de chip). Dit is cruciaal. Zie de video's van JohnAudioTech voor meer uitleg.
De LM386N-1 heeft minimaal 4V nodig en levert enkele honderden mW. Ik voed met 3 AA-batterijen (4,5V) en kan volume 1-10 prima gebruiken; bij 15 begint vervorming. Voor harder geluid: verhog de voedingsspanning naar 9V. Belangrijk: gebruik een 8-Ohm (niet 4-Ohm) luidspreker bij lage voedingsspanning.
Prototyping
Bouw eerst de volledige opstelling op twee breadboards. Houd Arduino, I²C-shifter en OLED-display op één breadboard; plaats de Si4703-breakout en audio-versterker dicht bij elkaar op de andere breadboard om akoestische vervorming te minimaliseren. In mijn eerste prototype had ik de Si4703 bij de Arduino met lange signaalkabels naar het audio-deel - dit veroorzaakte vervorming.

Voed de Arduino via USB (geregelde 3,3V-uitgang voor display en radiochip). Voed de LM386 van batterijen (4,5-9V).
De Programmacode
Benodigde libraries:
#include <SparkFunSi4703.h>
#include <SPI.h>
#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>
De SparkFun-library (GitHub) biedt hoog-niveau functies voor de Si4703. De Adafruit-display libraries met tutorial vind je hier.
Definities:
// Invoerknooppen
#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
Setup-sectie:
int channel;
int volume;
void setup() {
pinMode(volDown, INPUT_PULLUP);
pinMode(volUp, INPUT_PULLUP);
pinMode(channelUp, INPUT_PULLUP);
pinMode(channelDown, INPUT_PULLUP);
radio.powerOn();
channel = 882; // 88,2 MHz
radio.setChannel(channel);
volume = 4;
radio.setVolume(volume);
}
Pinnen 9-12 zijn ingangen met interne pull-up weerstanden (HIGH tenzij ingedrukt = LOW). De SparkFun-library maakt besturing eenvoudig met powerOn(), setChannel() en setVolume().
Hoofdlus luistert naar knopindrukken:
void loop() {
// Volume omlaag
if (digitalRead(volDown) == LOW) {
if (volume > 0) volume--;
radio.setVolume(volume);
UpdateDisplay();
delay(100);
}
// Volume omhoog
if (digitalRead(volUp) == LOW) {
if (volume < 15) volume++;
radio.setVolume(volume);
UpdateDisplay();
delay(100);
}
// Zender omlaag (seek)
if (digitalRead(channelDown) == LOW) {
channel = radio.seekDown();
UpdateDisplay();
delay(100);
}
// Zender omhoog (seek)
if (digitalRead(channelUp) == LOW) {
channel = radio.seekUp();
UpdateDisplay();
delay(100);
}
}
De complete broncode (inclusief 4 preset-zenders en OLED-displaycode die bijna alle RAM gebruikt) vind je op de GitHub-repository. Raadpleeg de Adafruit SSD1306-tutorial voor display-programmering. Let op: de library kan de schermgrootte niet via software detecteren; je moet deze na installatie van Adafruit_SSD1306.h handmatig instellen in het library-bestand (lees de instructies in de comments).
Er is een "geavanceerde" functie om het batterijniveau te meten door te vergelijken met de interne 1,1V-referentie van de AVR-chip. Zie "Secret Arduino Voltmeter" en het Gammon-forum voor details.
Van Breadboard-prototype naar Afgeronde Radio
Als je een werkend prototype hebt, verplaats het circuit naar twee experimenteerprintplaten (perfboards) en monteer alles in een mooie projectbehuizing. Als je dit nog niet gedaan hebt: durf het aan! Er is niet veel mis te gaan en je leert de vaardigheden onderweg. Collin van Adafruit heeft twee goede introductievideos: Breadboards & Perfboards en Perfboard Prototyping.
Ik plaatste de Nano met de I²C-shifters (ik had er twee nodig) op één perfboard:


Voor het maken van deze perfboard volgde ik deze tutorial: How to Prototype without using printed circuit boards. Stap 3 (maak je bedradingsplan!) is het meest kritisch. Tips: gebruik dunne "Wire Wrapping Wire" (30 AWG) in verschillende kleuren in plaats van dikke 22 AWG-draad. Gebruik een groter perfboard. Ik maakte pin-headers en gebruikte Dupont-jumperkabels voor verbindingen tussen de delen.
Plaats de Si4703 en audio-versterker op een tweede perfboard. Een tutorial voor LM386 op veroboard: From Schematics to Veroboard. Ik raad een IC-socket voor de LM386 aan. JohnAudioTech heeft een goede video met een layout die stroom-massa scheidt van signaal-massa.
Voor de behuizing: Collin laat zien hoe je dit aanpakt. Ik gebruikte schildersband (niet te kleverig) om boorgaten te markeren, een boormachine en een lijmpistool. Plak luidspreker, perfboards, batterijhouder etc. in de behuizing en verbind met Dupont-kabels. Het eindresultaat:

Ik had een te kleine behuizing gekocht. Voor het display-venster sneed ik van binnenuit met een Stanley-mes (om vlekkes aan de buitenkant te voorkomen) en plakte het display met lijm. Voor de luidspreker boorde ik veel 3mm-gaten en plakte deze achterin.
Vervolgens kocht ik een panel-mount F-connector en een telescopische FM-antenne. Ondanks 50 cm lengte is de ontvangst uitstekend en klinkt de luidspreker verrassend goed. Het meest verbazingwekkende: ik heb de batterijen nog niet een keer hoeven vervangen na dagenlang luisteren.
Andere Radioprojecten
Inspiratie kwam van Great Scott's video (die later een houten behuizing maakte). Dichter bij mijn project is de Si4703 Pocket FM Radio van John Owen - hij gebruikt ook de SparkFun-breakout en zijn projectbeschrijving is de moeite waard. Ik heb zijn broncode gebruikt voor de mono-functie en batterijspanningsmeting.
Code
FM-radio
GitHub-repository met broncode voor Arduino Nano:
https://github.com/Notthemarsian/FM-radio
Schema's
Fritzing-diagrammen FM-radio
Originele Fritzing-bestanden en afbeeldingen/PDF:
https://github.com/Notthemarsian/FM-radio/tree/master/Fritzing%20diagrams
Productieproces
- De Evolutie en Engineering van Radiotechnologie
- UnifiedWater v1 – Complete Arduino Waterkwaliteit Sensor Kit
- Bouw een Wi‑Fi Internetradio met Raspberry Pi en Arduino: Stream Wereldwijde Zenders
- Waterdichte FM-radio voor de douche bouwen met Arduino Nano, RDA5807, Nokia LCD & PAM8403
- Draagbaar stemstysteem met GSM-connectiviteit
- Hoogpresterende Klasse-B Push-Pull Audioversterker Bouwen met TL082 Op-amp
- 555 Hysterese Oscillator – Bouw een Klassieke RC Multivibrator
- Kristal‑ en Transistor‑Radio Circuits: Van Basis Detectors tot Geïntegreerde AM/FM Ontvangers
- Radio fundamentals: hoe elektromagnetische golven gegenereerd en getransmitteerd worden
- Atoom-gebaseerde Radio Sensor Onthult Signaalrichting voor Schonere Communicatie
- Grond‑tot‑grond radiovortplanting: impact op draadloze links begrijpen