Manufaturação industrial
Internet das coisas industrial | Materiais industriais | Manutenção e reparo de equipamentos | Programação industrial |
home  MfgRobots >> Manufaturação industrial >  >> Manufacturing Technology >> Processo de manufatura

Construa um Rádio FM Estilo Retrô com Módulo TEA5767 – Guia DIY Passo a Passo

Componentes e Materiais

Componente Descrição Quantidade
Arduino Nano R3 1
Módulo Rádio FM TEA5767 1
Medidores analógicos de rádio antigo Para intensidade de sinal e frequência 2
Display LCD Adafruit 16x2 Branco no Azul 1
Potenciômetro estéreo 10k log Controle de volume 1
Módulo amplificador áudio classe D 2x3W 1
Alto-falante 3W, 4 ohms Médio-grave 2
Alto-falante 0.25W, 8 ohms Agudo (tweeter) 2
Encoder Rotativo com Botão Sintonização 1
Chave Pushbutton 12mm SparkFun 4 teclas de memória 4
Capacitor 1µF Crossover agudo 2
LED (genérico) Indicadores estéreo/auto 3

Aplicativos e Serviços Online

Sobre o Projeto

Baseado no código de Rodolfo Broco Manin (RodLophus no GitHub) que inclui bela escala analógica no LCD 16x2. Modificações: dois medidores analógicos para intensidade de sinal e frequência, LED "estéreo" e LED "auto/busca manual". Detalhe retrô: quatro teclas de memória com frequências pré-definidas no código, dando visual totalmente antigo. Saídas de áudio do TEA5767, via potenciômetro estéreo, conectadas a módulo amplificador classe D 2x3W (suficiente). Dois alto-falantes 2-via com potência adequada. Tweeter separado do médio-grave por capacitor 1µF. Medidores analógicos de rádio defeituoso (podem ser quaisquer medidores); desvio total da agulha ajustado com potenciômetros trimmer. Alimentação por duas baterias de lítio em série através de estabilizador 7805 (5V estabilizado).

Biblioteca TEA5767 para Arduino: GitHub. Diagrama de circuito e código abaixo.

Observação: A agulha do medidor de frequência atualiza a cada 1MHz (limitação da biblioteca). Recepção excelente para estações FM locais fortes; em estações fracas, necessário interruptor estéreo/mono devido a interrupções frequentes. Próxima atualização planeja inserir interruptores "estéreo/mono" e "mute".

Montagem completa em caixa apropriada com antena telescópica, resultando em receptor FM estéreo completo com visual retrô agradável.

Código

Código (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;
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, signalLevel, searchDirection, 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);
}

Esquemático

Diagrama de circuito disponível na documentação original.

Processo de manufatura

  1. Escolhas de Design Bluetooth Mesh: Módulo vs. Dispositivo Discreto
  2. Construa um Termostato Inteligente Estilo NEST com Node-RED no Raspberry Pi
  3. Construa API Robusta de Temperatura e Sensores no Raspberry Pi com Módulo GY‑91
  4. Construa um Detector de Choro de Bebê Econômico com Raspberry Pi – Guia DIY
  5. Construa um Relógio Retrô Numitron com Arduino: Simples, Confiável e Eficiente
  6. Importação de Módulos em Python: Guia Prático com Exemplos
  7. Capture Gotas d'Água em Ação com Arduino Nano – Fotografia de Alta Velocidade DIY
  8. Construa um Skate VR DIY com Arduino, Google Cardboard e Bluetooth
  9. Rádio FM à Prova d'Água para Chuveiro com Arduino Nano, RDA5807, LCD Nokia e PAM8403
  10. Conectando Arduino Mega ao Módulo GPS NEO‑6M: Guia Passo a Passo