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

Retro-FM-Radio mit TEA5767 Modul selbst bauen – Schritt-für-Schritt Anleitung

Komponenten und Zubehör

Komponente Beschreibung Anzahl
Arduino Nano R3 Mikrocontroller 1
TEA5767 FM-Radio-Modul FM-Empfänger-Chip 1
Analogmessgeräte aus altem Radio Für Signalstärke und Frequenzanzeige 2
Adafruit Standard LCD - 16x2 Weiß auf Blau Digitalanzeige mit analoger Skala 1
Stereo-Potentiometer 10k log Lautstärkeregelung 1
D-Klasse Audioverstärker-Modul 2x3W Leistungsverstärker 1
Lautsprecher: 3W, 4 Ohm Hauptlautsprecher 2
Lautsprecher: 0,25W, 8 Ohm Hochtöner 2
Drehencoder mit Taster Frequenzwahl, Modus-Umschaltung 1
Taster 12mm (SparkFun) Speichertasten (Memory) 4
1µF Kondensator Frequenzweiche für Hochtöner 2
LED (generic) Stereo/Automatik-Anzeige 3

Apps und Online-Dienste

Über dieses Projekt

Basis ist der Code von Rodolfo Broco Manin (RodLophus auf GitHub) mit einer schönen analogen Skala auf 16x2 LCD. Ich habe ihn um zwei Analogmessgeräte für Signalstärke und Frequenz, eine „Stereo“-LED und eine „Auto/Manuell-Suche“-LED erweitert. Als Retro-Detail kamen vier Speichertasten mit im Code vordefinierten Frequenzen hinzu – so erhält das Radio ein vollständig antikes Aussehen.

Die Audioausgänge des TEA5767 gehen über das Stereo-Potentiometer zum D-Klasse-Leistungsverstärker (2x3W), der zwei 2-Wege-Lautsprecher versorgt. Der Hochtöner ist über 1µF-Kondensatoren vom Tiefmitteltöner getrennt. Die Analogmessgeräte stammen aus einem defekten Altgerät, jeder Messwerk-Typ funktioniert. Vollausschlag der Nadeln wird per Trimmer-Potentiometer justiert. Stromversorgung durch zwei Li-Ion-Akkus in Reihe über 7805-Regler (stabilisierte 5V).

Bild des fertigen Radios im Gehäuse ist im Originalprojekt enthalten.

TEA5767 Arduino Library: GitHub. Schaltplan und Code unten.

Hinweis: Frequenzmesser-Nadel wird diskret pro 1 MHz aktualisiert (Bibliotheksbedingung). Bei schwachen Sendern wäre ein Stereo/Mono-Schalter nötig wegen häufiger Umschaltung. Geplant: „Stereo/Mono“- und „Mute“-Schalter im nächsten Code-Update.

Gesamtbau in passendem Gehäuse mit Teleskopantenne → komplettes FM-Stereo-Radio mit Retro-Look.

Code

Code (Arduino)

/* Simple radio tuner using Arduino Leonardo and the Philips TEA5767 module (Arduino Uno version) */
#include <LiquidCrystal.h>
#include <Wire.h>
#include <TEA5767.h>

#define ENCODER_SW 2
#define ENCODER_A 3
#define ENCODER_B 4
#define button_freq1 A0
#define button_freq2 A1
#define button_freq3 A2
#define button_freq4 A3

#define SCALE_CLEAR 5
#define STEREO_CHAR_S 6
#define STEREO_CHAR_T 7

#define ST_AUTO 0
#define ST_STEREO 1
#define ST_GO_UP 2
#define ST_GO_DOWN 3
#define ST_SEARCH 4

const int LED = 0;
int analogsignal=0, analogscale=0, stereoled=0;
TEA5767 Radio;
float frequency = 88;
byte status = 0;
LiquidCrystal lcd(13, 12, 11, 10, 9, 8);

void updateScale() {
  int lcdBase = (frequency - 88) * 4;
  if(lcdBase > 79) lcdBase = 79;
  int lcdMajor = lcdBase / 5;
  int lcdMinor = lcdBase % 5;
  if(lcdMajor > 0) {
    lcd.setCursor(lcdMajor - 1, 0);
    lcd.write(SCALE_CLEAR);
  } else lcd.setCursor(lcdMajor, 0);
  lcd.write(lcdMinor);
  if(lcdMajor < 15) lcd.write(SCALE_CLEAR);
}

void isrEncoder() {
  delay(50);
  if(digitalRead(ENCODER_B) == HIGH) bitWrite(status, ST_GO_UP, 1);
  else bitWrite(status, ST_GO_DOWN, 1);
}

void isrSwitch() {
  delay(50);
  if(bitRead(status, ST_AUTO)) bitWrite(status, ST_AUTO, 0);
  else bitWrite(status, ST_AUTO, 1);
}

void setup() {
  Serial.end();
  pinMode(button_freq1, INPUT); digitalWrite(button_freq1,LOW);
  pinMode(button_freq2, INPUT); digitalWrite(button_freq2,LOW);
  pinMode(button_freq3, INPUT); digitalWrite(button_freq3,LOW);
  pinMode(button_freq4, INPUT); digitalWrite(button_freq4,LOW);
  pinMode(LED, OUTPUT);
  pinMode(6,OUTPUT); pinMode(7,OUTPUT); pinMode(5,OUTPUT);
  int i;
  byte needleChar[8];
  byte stereoChar1[8] = { 0b01111, 0b11000, 0b11011, 0b11101, 0b11110, 0b11000, 0b01111, 0b00000 };
  lcd.createChar(STEREO_CHAR_S, stereoChar1);
  byte stereoChar2[8] = { 0b11110, 0b00011, 0b10111, 0b10111, 0b10111, 0b10111, 0b11110, 0b00000 };
  lcd.createChar(STEREO_CHAR_T, stereoChar2);
  byte scaleChar[8] = { 0b00000, 0b00000, 0b00000, 0b00000, 0b00000, 0b00100, 0b10101, 0b10101 };
  lcd.createChar(SCALE_CLEAR, scaleChar);
  for(int j = 0; j < 5; j++) {
    for(i = 0; i < 8; i++) needleChar[i] = scaleChar[i] | (0b10000 >> j);
    lcd.createChar(j, needleChar);
  }
  lcd.begin(16, 2); lcd.clear();
  for(i = 0; i < 16; i++) lcd.write(SCALE_CLEAR);
  pinMode(ENCODER_SW, INPUT); digitalWrite(ENCODER_SW, HIGH);
  pinMode(ENCODER_A, INPUT); digitalWrite(ENCODER_A, HIGH);
  pinMode(ENCODER_B, INPUT); digitalWrite(ENCODER_B, HIGH);
  attachInterrupt(0, isrSwitch, RISING);
  attachInterrupt(1, isrEncoder, RISING);
  Wire.begin(); Radio.init(); Radio.set_frequency(frequency);
}

void loop() {
  unsigned char buf[5];
  int stereo, signalLevel, searchDirection, i = 0;
  lcd.setCursor(12, 1); lcd.write(bitRead(status, ST_AUTO) ? 'A' : 'M');
  if bitRead(status, ST_AUTO) digitalWrite(LED, LOW); else digitalWrite(LED, HIGH);
  if (Radio.read_status(buf) == 1) {
    frequency = floor(Radio.frequency_available(buf) / 100000 + .5) / 10;
    stereo = Radio.stereo(buf);
    signalLevel = (Radio.signal_level(buf) * 100) / 15;
    analogsignal = map(signalLevel, 0, 100, 0, 255);
    analogscale = map(frequency, 88, 114, 0, 255);
    stereoled = map(stereo, 0.7, 1, 0, 255);
    analogWrite(5, analogsignal);  // Signal-Meter
    analogWrite(6, analogscale);   // Frequenz-Meter
    analogWrite(7, stereoled);     // Stereo-LED
    updateScale();
    lcd.setCursor(0, 1); lcd.write(183);
    if(signalLevel < 100) lcd.write(' ');
    lcd.print(signalLevel); lcd.write('%');
    lcd.setCursor(6, 1);
    if(frequency < 100) lcd.write(' ');
    lcd.print(frequency, 1);
    lcd.setCursor(14, 1);
    if(stereo){ lcd.write(STEREO_CHAR_S); lcd.write(STEREO_CHAR_T); }
    else lcd.print(" ");
  }
  if(bitRead(status, ST_SEARCH)) {
    if(Radio.process_search(buf, searchDirection) == 1) bitWrite(status, ST_SEARCH, 0);
  }
  if(digitalRead(button_freq2)==HIGH){ // Memory-Tasten
    if(frequency > 94.8) { frequency=94.8; Radio.set_frequency(frequency); bitWrite(status, ST_GO_DOWN, 0); }
    else { frequency=94.8; Radio.set_frequency(frequency); bitWrite(status, ST_GO_UP, 0); }
    precrtajScale();
  }
  if(digitalRead(button_freq1)==HIGH){
    if(frequency > 92) { frequency=92; Radio.set_frequency(frequency); bitWrite(status, ST_GO_DOWN, 0); }
    else { frequency=92; Radio.set_frequency(frequency); bitWrite(status, ST_GO_UP, 0); }
    precrtajScale();
  }
  if(digitalRead(button_freq3)==HIGH){
    if(frequency > 97) { frequency=97; Radio.set_frequency(frequency); bitWrite(status, ST_GO_DOWN, 0); }
    else { frequency=97; Radio.set_frequency(frequency); bitWrite(status, ST_GO_UP, 0); }
    precrtajScale();
  }
  if(digitalRead(button_freq4)==HIGH){
    if(frequency > 101.2) { frequency=101.2; Radio.set_frequency(frequency); bitWrite(status, ST_GO_DOWN, 0); }
    else { frequency=101.2; Radio.set_frequency(frequency); bitWrite(status, ST_GO_UP, 0); }
    precrtajScale();
  }
  if(bitRead(status, ST_GO_UP)) {
    if(bitRead(status, ST_AUTO) && !bitRead(status, ST_SEARCH)) {
      bitWrite(status, ST_SEARCH, 1);
      searchDirection = TEA5767_SEARCH_DIR_UP;
      Radio.search_up(buf); delay(50);
    } else {
      if(frequency < 108) { frequency += 0.1; Radio.set_frequency(frequency); }
    }
    bitWrite(status, ST_GO_UP, 0);
  }
  if(bitRead(status, ST_GO_DOWN)) {
    if(bitRead(status, ST_AUTO) && !bitRead(status, ST_SEARCH)) {
      bitWrite(status, ST_SEARCH, 1);
      searchDirection = TEA5767_SEARCH_DIR_DOWN;
      Radio.search_down(buf); delay(50);
    } else {
      if(frequency > 88) { frequency -= 0.1; Radio.set_frequency(frequency); }
    }
    bitWrite(status, ST_GO_DOWN, 0);
  }
}

void precrtajScale() {
  int i; lcd.clear();
  for(i = 0; i < 16; i++) lcd.write(SCALE_CLEAR);
}

Schaltplan

Schaltplan-Bild ist im Originalprojekt enthalten.

Herstellungsprozess

  1. Bluetooth Mesh Design Entscheidungen: Module vs. Diskrete Devices
  2. DIY NEST-ähnlicher Smart Thermostat mit Node-RED auf Raspberry Pi bauen
  3. Robuste Temperatur- & Sensor-API auf Raspberry Pi mit GY-91 Modul bauen
  4. Günstiger Raspberry Pi Babyphone mit Schreierkennung – DIY-Anleitung
  5. Retro-Numitron-Uhr mit Arduino bauen: Einfach, zuverlässig & energieeffizient
  6. Python Module importieren: Praktischer Guide mit Beispielen
  7. Wassertropfen-Hochgeschwindigkeitsfotografie mit Arduino Nano – DIY Setup
  8. DIY VR-Skateboard mit Arduino, Google Cardboard und Bluetooth bauen
  9. Wasserdichtes Duschradio mit Arduino Nano, RDA5807, Nokia 5110 LCD & PAM8403
  10. Arduino Mega mit NEO‑6M GPS-Modul verbinden: Schritt-für-Schritt-Anleitung