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