Industrielle Fertigung
Industrielles Internet der Dinge | Industrielle Materialien | Gerätewartung und Reparatur | Industrielle Programmierung |
home  MfgRobots >> Industrielle Fertigung >  >> Manufacturing Technology >> Herstellungsprozess

Ein zuverlässiges FM-Radio mit SparkFun & Arduino-Komponenten bauen

Komponenten und Materialien

Komponente Menge Hinweise
SparkFun FM Tuner Basic Breakout - Si4703 1 FM-Radio-Tuner-Chip auf Breakout-Platine
SparkFun Lautsprecher - 0,5 Watt (8 Ohm) 1 Guter Klang für kleines Radioprojekt
Adafruit Monochrom 0,96" 128x64 OLED Grafikdisplay 1 Hoher Kontrast, sehr geringer Stromverbrauch
Texas Instruments LM386 - Audioverstärker - DIP-8 1 Klassischer OP-Amp für batteriebetriebene Audio-Projekte
Arduino Nano R3 1 Steuerung über I2C-Bus
Adafruit Membran 1x4 Tastenfeld 2 Für Lautstärke- und Sendersuche
Adafruit 4-Kanal I2C bidirektionaler Logic Level Converter 1 Für 3,3V/5V Pegelanpassung am I2C-Bus
Teleskopantenne FM für F-Stecker 1 Für guten Empfang
Panel-mount F-Typ Schraubanschluss 1 Antennenanschluss am Gehäuse

Über dieses Projekt

Als Kind baute ich AM-Radios, aber FM-Radios waren mir immer zu komplex. Heute gibt es komplette FM-Radio-Tuner auf einem Chip, doch diese sind SMD-Bauteile und für Hobbyisten schwer zu löten. Glücklicherweise bietet SparkFun einen Breakout für den Silicon Laboratories Si4703 FM-Tuner-Chip an, der alle Pins zugänglich macht. Ich zeige, wie man ein komplettes FM-Radio um diesen Breakout herum aufbaut und die Tuner-Funktionen über die eingebaute Zwei-Draht-Schnittstelle mit einem Arduino steuert. SparkFun stellt eine vollständige Bibliothek bereit, die die Programmierung stark vereinfacht.

Zusätzlich habe ich ein kleines OLED-Display mit sehr hohem Kontrast und extrem geringem Stromverbrauch integriert. Last but not least zeige ich, wie man aus minimalen Bauteilen einen gut klingenden Mono-Audioverstärker baut. Das fertige Radio läuft mit drei AA-Batterien viele Stunden lang.

SparkFun FM Tuner Basic Breakout und I2C-Serialbus

Der Basic Breakout ist einfach zu handhaben. Zuerst werden die Stiftleisten angelötet, um ihn auf einem Breadboard nutzen zu können. Ein etwa ein Meter langer dünner Draht an ANT dient vorläufig als Antenne.

Der Si4703 besitzt eine Zwei-Draht-Schnittstelle – genauer den I2C-Bus (Inter-Integrated Circuit, ausgesprochen „I-quadrat-C“ oder „I-zwei-C“). Er nutzt nur zwei bidirektionale Leitungen:

Hinzu kommt die Reset-Leitung (RST). Beim Si4703 heißen diese Pins SDIO (SDA) und SCLK (SCL). Alle Arduinos haben I2C onboard. Auf unserem Bus agiert der Arduino als Master, während Si4703 und OLED-Display als Slaves fungieren.

I2C-Bus-Spannungen und Arduino-Wahl

Si4703 und OLED-Display arbeiten am I2C-Bus mit 3,3 Volt. SparkFun empfiehlt daher einen 3,3-Volt-Arduino (z. B. Arduino Pro Mini). Dieser hat jedoch keinen USB-Anschluss und muss über einen FTDI-Adapter programmiert werden. Zudem läuft er nur mit 8 MHz – halb so schnell wie ein Uno oder Nano. Meine Tests zeigten, dass dies für das OLED-Display zu langsam ist.

Da ich das Display unbedingt behalten wollte, entschied ich mich für einen Arduino Nano (16 MHz, 5V Pegel) und bidirektionale I2C-Logic-Level-Converter (I2C-Shifter), um die 5V-Signale des Nano auf 3,3V für Display und Radiochip zu pegeln. Wir müssen drei Signale pegeln: SDA, SCL und RST. Dafür reichen zwei 2-Kanal-Shifter (oder ein 4-Kanal-Modul, das Kabel spart).

Der Nano ist fast identisch zum Uno, aber deutlich kompakter. Für erste Tests kann auch ein Uno verwendet werden – beide haben USB und lassen sich einfach mit der Arduino IDE programmieren.

Schaltplan: Arduino-Verbindungen zu Radio und Display

Das Projekt wird mit drei AA-Batterien (4,5 V) betrieben. Diese werden direkt an den 5V-Pin des Nano angeschlossen, wodurch der onboard-Regler umgangen wird. Ein Nano läuft so problemlos mit 3 AA-Zellen.

WICHTIG! Batterien immer trennen, bevor der Nano per USB mit dem PC verbunden wird! Andernfalls werden die 5V vom USB-Port mit den Batterien kurzgeschlossen. In der Testphase das Circuit nur über USB-Stromversorgung betreiben (ohne Batterien). Sicherer: Sechs AA-Batterien (9 V) an den VIN-Pin (statt 5V-Pin) anschließen – dann schaltet die Nano-Stromverwaltung die Batterien automatisch ab, sobald USB angeschlossen wird. (Ein 9V-Block geht auch, hält aber nur wenige Stunden.)

Arduino SDA (A4) und SCL (A5) gehen auf die 5V-Seite des I2C-Shifters. Zusätzlich nutzen wir D2 als RST-Signal. Auf der 3,3V-Seite des Shifters verbinden wir SDIO, SCLK und RST des Si4703. Für das OLED-Display genügen SDA und SCL (meines von banggood.com hat keinen RST-Pin und ist zweifarbig: gelb/blau).

Alle Komponenten werden an den 3,3V-Ausgang des Nano und an Masse angeschlossen. Der I2C-Shifter benötigt zudem 5V auf der High-Voltage-Seite. Die I/O-Pins D5–D12 gehen an die beiden Tastenfelder; ein Tastendruck zieht den Eingang auf Masse.

Niedervolt-Audioverstärker LM386

Für den Mono-Verstärker nutze ich den LM386 – einen Klassiker seit den 70ern, entwickelt für Niedervolt-Konsumanwendungen. Der interne Gain ist auf 20 festgelegt, lässt sich aber durch einen externen RC-Kreis zwischen Pin 1 und 8 auf 20–200 erhöhen. Wir bleiben bei Gain 20, was für einen 8-Ohm-Lautsprecher mehr als ausreichend ist.

Die Audiosignale LOUT und ROUT des Si4703 werden über Vorwiderstände (R4, R5) zusammengefasst zu einem Monosignal. Auf dem Breakout sind bereits Ausgangskondensatoren vorhanden. R2 und R3 bilden einen Spannungsteiler, um das Eingangssignal des Verstärkers anzupassen. Statt eines Potis steuern wir die Lautstärke digital: Der Si4703-Ausgangspegel ist über I2C in 15 Stufen einstellbar. Mit R2/R3 lässt sich dies durch Experimentieren an den Verstärker anpassen (größeres R3 = lauter).

Die Schaltung stammt direkt aus dem Datenblatt. C2 muss mindestens 220 µF betragen (kleinere Werte dämpfen den Bass). C3 muss nah am Chip platziert werden; C3 und C1 sind optional.

Viele LM386-Projekte auf YouTube klagen über schlechten Klang – meist fehlt ein sauberes Ground-Layout. Wichtig: Eingangsmasse und Ausgangsmasse getrennt führen, sie treffen sich erst am Masse-Pin 4 des Chips. Dazu empfehle ich das Video von JohnAudioTech.

Der LM386N-1 benötigt mindestens 4 V und liefert einige hundert mW. Mit 3 AA-Zellen (4,5 V) lässt sich die Lautstärke zwischen 1 und 10 sehr gut regeln. Wichtig: 8-Ohm-Lautsprecher verwenden (keine 4 Ohm!). Bei Lautstärke 15 setzt Verzerrung ein. Für höhere Lautstärke Versorgungsspannung auf 9 V erhöhen.

Prototyping

Zuerst den kompletten Aufbau auf zwei Breadboards testen: Arduino, I2C-Shifter und OLED auf einem Board; Si4703-Breakout und Audioverstärker nah beieinander auf dem zweiten, um akustische Störungen zu minimieren. In meinem ersten Prototyp lagen lange Signalkabel zwischen Si4703 und Audio-Teil – das verursachte Verzerrungen.

Arduino per USB mit 3,3V-Ausgang für Display und Radiochip versorgen. LM386 separat von Batterien (4,5–9 V) speisen.

Der Programmcode

Benötigte Bibliotheken:

#include <SparkFunSi4703.h>
#include <SPI.h>
#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>

Die SparkFun-Bibliothek bietet High-Level-Funktionen für den Si4703, die Adafruit-Bibliotheken steuern das Display. Installation siehe jeweilige Tutorials.

Definitionen:

// Eingabetasten
#define volDown 9
#define volUp 10
#define channelDown 11
#define channelUp 12

// Si4703 Radio Chip
#define resetPin 2
#define SDIO A4
#define SCLK A5
Si4703_Breakout radio(resetPin, SDIO, SCLK);
#define SI4703Address 0x10

#define macht den Code lesbarer: Statt Pin-Nummern schreibt man sprechende Namen.

Setup:

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);
}

INPUT_PULLUP aktiviert interne Pullup-Widerstände: Der Pin ist HIGH, solange der Taster nicht gedrückt ist (gedrückt = LOW).

Die SparkFun-Bibliothek macht die I2C-Steuerung einfach: powerOn(), setChannel(), setVolume().

Hauptloop – Tastenabfrage:

void loop() {
  // Lautstärke runter
  if (digitalRead(volDown) == LOW) {
    if (volume > 0) volume--;
    radio.setVolume(volume);
    UpdateDisplay();
    delay(100);
  }
  // Lautstärke rauf
  if (digitalRead(volUp) == LOW) {
    if (volume < 15) volume++;
    radio.setVolume(volume);
    UpdateDisplay();
    delay(100);
  }
  // Sender runter suchen
  if (digitalRead(channelDown) == LOW) {
    channel = radio.seekDown();
    UpdateDisplay();
    delay(100);
  }
  // Sender rauf suchen
  if (digitalRead(channelUp) == LOW) {
    channel = radio.seekUp();
    UpdateDisplay();
    delay(100);
  }
}

Der vollständige Code (siehe GitHub-Link unten) enthält vier Speichertasten für Lieblingssender und die komplette OLED-Ansteuerung, die fast den gesamten RAM verbraucht. Zur SSD1306-Bibliothek siehe das hervorragende Adafruit-Tutorial. Wichtig: Die Bibliothek erkennt die Displaygröße nicht per Software – nach Installation von Adafruit_SSD1306.h muss die Datei geöffnet, die Anleitung in den Kommentaren gelesen und die Datei entsprechend editiert werden.

Eine „fortgeschrittene“ Funktion misst den Batteriestand, indem sie ihn mit der internen 1,1-V-Referenz des AVR-Chips vergleicht. Da wir batteriebetrieben sind, haben wir keine konstante 5V-Referenz. Details: Secret Arduino Voltmeter und Gammon Forum.

Vom Breadboard-Prototyp zum fertigen Radio

Wenn der Prototyp auf zwei Breadboards läuft, geht es ans Übertragen auf Lochrasterplatinen und in ein schickes Projektgehäuse. Keine Sorge – man kann kaum etwas falsch machen und lernt die nötigen Fertigkeiten dabei. Collin von Adafruit hat zwei gute Einführungsvideos: Breadboards & Perfboards und Perfboard Prototyping.

Ich setzte Nano und I2C-Shifter (zwei Stück, siehe oben) auf eine Lochrasterplatine. Wichtig: Vorher einen Verdrahtungsplan erstellen (Schritt 3 im verlinkten Tutorial) – Planung ist der Unterschied zwischen Erfolg und Misserfolg. Tipps: Statt dickem 22 AWG Draht besser dünnen „Wire Wrapping Wire“ (30 AWG) in verschiedenen Farben nutzen. Größere Lochrasterplatine verwenden. Ich nutzte Stiftleisten und Dupont-Jumper für die Verbindungen zwischen den Modulen.

Si4703 und Audioverstärker kommen auf eine zweite Lochrasterplatine. Als Inspiration: From Schematics to Veroboard (LM386-Tutorial). Ich empfehle einen IC-Sockel für den LM386! Alternativ: JohnAudioTech hat ein gutes Video mit sauberem Layout (getrennte Signal-/Leistungsmasse).

Für das Gehäuse: Wieder Collin's Video anschauen. Besonders die Idee mit Malerkrepp zum Markieren der Bohrlöcher gefiel mir. Ich nutzte Malerkrepp (nicht zu klebrig), Bohrmaschine und Heißklebepistole. Lautsprecher, Platinen, Batteriehalter einfach einkleben und per Dupont-Kabel verbinden. Das Ergebnis:

Das Gehäuse war etwas zu klein. Für den Display-Ausschnitt schnitt ich von innen mit einem Teppichmesser (keine hässlichen Spuren außen). Display mit Heißkleber einsetzen. Lautsprechergröße auf Frontplatte markieren, viele 3-mm-Löcher für den Schall bohren, Lautsprecher von hinten ankleben.

Zum Schluss: Panel-mount F-Stecker und Teleskopantenne (50 cm) montiert. Empfang ist sehr gut, der kleine Lautsprecher klingt überraschend gut. Am beeindruckendsten: Die Batterien halten seit vielen Tagen Betrieb noch immer.

Weitere Radio-Projekte

Inspiration kam von Great Scott (später auch Holzgehäuse). Detaillierter ähnlich ist das Si4703 Pocket FM Radio von John Owen – er nutzt denselben SparkFun-Breakout, sein Projekt lohnt sich genau anzusehen. Ich habe seinen Code für die Mono-Funktion und Batteriemessung verwendet.

Code

GitHub-Repository mit Quellcode für Arduino Nano:
https://github.com/Notthemarsian/FM-radio

Schaltpläne

Fritzing-Diagramme (Originaldateien, Bilder, PDF):
GitHub Fritzing-Ordner

Herstellungsprozess

  1. Hochleistungs-Class-B-Push-Pull-Audioverstärker mit TL082 Op-Amp bauen
  2. 555 Hysterese-Oszillator – Klassischen RC-Multivibrator bauen
  3. Kristall‑ und Transistorradio‑Schaltungen: Vom einfachen Detektor zum integrierten AM/FM‑Empfänger
  4. Grundlagen der Funktechnik: Wie elektromagnetische Wellen erzeugt und übertragen werden
  5. Entwicklung und Technik der Radiotechnologie
  6. Ground-to-Ground-Funkausbreitung: Verständnis der Auswirkungen auf Wireless Links
  7. UnifiedWater v1 – Komplettes Arduino Wasserqualitäts-Sensorkit
  8. WLAN-Internetradio mit Raspberry Pi & Arduino bauen: Weltweite Sender streamen
  9. Wasserdichtes Duschradio mit Arduino Nano, RDA5807, Nokia 5110 LCD & PAM8403
  10. Atomarer Funksensor enthüllt Signalrichtung für sauberere Kommunikation