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

Bouw een retro FM-radio met de TEA5767-module – Stap-voor-stap DIY-gids

Componenten en benodigdheden

Arduino Nano R3 1
TEA5767 FM-radio module 1
Analoge meters uit oude radio 2
Adafruit Standaard LCD - 16x2 Wit op Blauw 1
Stereo potentiometer 10k log 1
D-klasse audioversterker module 2x3W 1
Luidspreker: 3W, 4 ohm 2
Luidspreker: 0.25W, 8 ohm 2
Rotary Encoder met Drukknop 1
SparkFun Drukknop 12mm 4
1µF condensator 2
LED (algemeen) 3

Apps en online diensten

  • Arduino IDE

Over dit project

De basis van dit project is de code van Rodolfo Broco Manin (RodLophus op GitHub) die een mooie analoge schaal op 16x2 LCD bevat. Ik heb zijn code aangepast door twee analoge meters toe te voegen voor signaalsterkte en frequentie, een "stereo" LED, en een "auto/handmatig zoeken" LED. Als retro-detail heb ik vier geheugentoetsen toegevoegd wier frequenties vooraf in de code zijn gedefinieerd, wat de radio een volledig antiek uiterlijk geeft. De audio-uitgangen van de TEA5767, via een stereo-potentiometer, zijn verbonden met de D-klasse versterkermodule van 2x3W, wat voldoende is. Aan de versterker zijn twee 2-weg luidsprekers aangesloten. De hoogtoneluidspreker is gescheiden van de bas-midrange luidspreker met een 1µF condensator. De analoge meters stammen uit een defecte oude radio, maar je kunt elke meter gebruiken; de volledige uitschuiving van de wijzer wordt afgesteld met trimmer-potentiometers. Het toestel wordt gevoed door twee lithium-batterijen in serie via een 7805-stabilisator, wat een gestabiliseerde 5V-bron geeft.

Je kunt de TEA5767 Arduino-bibliotheek hier vinden. Schema en code zijn hieronder gegeven.

Opmerking: De frequentiemeter-wijzer wordt achtereenvolgens bijgewerkt voor elke 1 MHz, wat ik een gevolg van de bibliotheek acht. Als iemand een oplossing vindt voor soepelere wijzerbeweging, hoor ik dat graag. Ontvangst is uitstekend, vooral voor sterke lokale FM-zenders. Bij zwakkere zenders is een stereo/mono-schakelaar nodig vanwege frequente schakeling tussen stereo en mono. In de volgende code-update wil ik "stereo/mono" en "mute" schakelaars toevoegen.

De complete montage is in een geschikte behuizing ingebouwd waarop een telescopen antenne gemonteerd is, wat resulteert in een complete FM-stereoradio met een mooi retro-uiterlijk.

Code

Code (Arduino)

/* Simple radio tuner using Arduino Leonardo and the Philips TEA5767 module (Arduino Uno version)
Notes:
- The TEA5767 maximum supply voltage is 5V. Be sure your Arduino is not sourcing more than 5V
- The TEA5767 does not update the signal level indicator on read. The signal level will only be update on station change
- If you get some glitches on the encoder or on the pushbutton, use a snubber network...
Connections:
- Encoder (with "pushable" shaft switch): Push button -> Arduino pin 2, Encoder pin "A" -> Arduino pin 3, Encoder pin "B" -> Arduino pin 4
- LCD: D7 -> Arduino pin 8, D6 -> 9, D5 -> 10, D4 -> 11, RS -> 13, RW -> GND, E -> 12, VO -> 2k2 resistor to GND
- TEA5756 module: 1 -> Arduino SDA, 2 -> Arduino SCL, 3 -> GND, 5 -> +5V, 6 -> GND, 7 -> Audio out (right), 8 -> Audio out (left), 10 -> Antenna
*/
#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;
int analogscale=0;
int 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;
  int signalLevel;
  int searchDirection;
  int i;
  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);
    analogWrite (6,analogscale);
    analogWrite (7,stereoled);
    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){
    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);
}

Schema's

Schakelschema voor de retro FM-radio met TEA5767-module.

Productieproces

  1. Bouw Een DIY NEST-achtige Slimme Thermostaat Met Node-RED Op Raspberry Pi
  2. Een robuuste temperatuur- en sensor-API bouwen op Raspberry Pi met de GY-91-module
  3. Een Budget-vriendelijke Raspberry Pi Babyhuil-detector Bouwen – DIY Handleiding
  4. Bouw een retro Numitron-klok met Arduino: Eenvoudig, betrouwbaar en energiezuinig
  5. Waterdruppels vastleggen met Arduino Nano – DIY High-Speed Fotografie
  6. Bouw een DIY VR-skateboard met Arduino, Google Cardboard en Bluetooth
  7. Waterdichte FM-radio voor de douche bouwen met Arduino Nano, RDA5807, Nokia LCD & PAM8403
  8. Arduino Mega koppelen aan een NEO‑6M GPS-module: stapsgewijze handleiding
  9. Bouw een DIY Voltmeter met Arduino en Nokia 5110 Display – Stap-voor-Stap Handleiding
  10. Bluetooth Mesh-ontwerpkeuzes: Module vs. discreet apparaat
  11. Python Module Importeren – Praktische Gids met Voorbeelden