Como montar um receptor FM digital com ESP32

📻 Como montar um receptor FM digital com ESP32

Você sabia que dá para transformar o seu ESP32 em um receptor de rádio FM digital?
Neste artigo mostro como, de forma simples e prática, você pode montar um rádio FM usando o ESP32 junto com o chip RDA5807M, muito usado em projetos de rádio estéreo por ser barato, pequeno e fácil de programar.


🔧 O que você vai precisar

  • ESP32 DevKit (qualquer versão serve).

  • Módulo receptor FM RDA5807M.

  • Fones de ouvido ou módulo amplificador PAM8403.

  • Fio de ±75 cm para servir como antena.

  • Protoboard e jumpers para as conexões.


📡 Como funciona?

O ESP32 não consegue demodular FM sozinho, pois não tem um front-end de rádio.
Por isso usamos o RDA5807M, que faz todo o trabalho pesado:

  1. Recebe o sinal de rádio FM pela antena.

  2. Faz a demodulação e gera áudio estéreo pronto.

  3. O ESP32 controla via I²C (ajustando frequência, volume e até RDS (Radio Data System)  ).

  4. O áudio sai em saída analógica estéreo (LOUT e ROUT) e pode ser conectado a fones ou amplificador.


🔌 Ligações ESP32 ↔ RDA5807M

ESP32RDA5807M
3V3VCC
GNDGND
GPIO21SDA
GPIO22SCL
LOUT → saída de áudio (esquerda)
ROUT → saída de áudio (direita)
ANT → fio de ±75 cm como antena

⚠️ Importante: ligue o RDA5807M sempre em 3.3V, nunca em 5V.

Pinagem do RDA5807


💻 Código exemplo (Arduino IDE)

Para controlar o rádio, você deve usar a  biblioteca RDA5807M Arduino na IDE para Arduino.
Depois de instalar, use o seguinte código básico:

#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>
#include <RDA5807.h>
#define SCREEN_WIDTH 128
#define SCREEN_HEIGHT 64
#define OLED_ADDR 0x3C
#define BTN_NEXT 26
#define BTN_PREV 27
RDA5807 radio;
Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, -1);
float freq = 100.9; // Frequência inicial
void setup() {
  Serial.begin(115200);
  Wire.begin(21, 22);
  Serial.println(“Escaneando dispositivos I2C…”);
  for (byte address = 1; address < 127; address++) {
    Wire.beginTransmission(address);
    if (Wire.endTransmission() == 0) {
      Serial.print(“Encontrado no endereco 0x”);
      Serial.println(address, HEX);
    }
  }
delay(1000);
  if (!display.begin(SSD1306_SWITCHCAPVCC, OLED_ADDR)) {
    Serial.println(“Erro ao iniciar OLED!”);
    while (1);
  }
  //pinMode(BTN_NEXT, INPUT_PULLUP);
  //pinMode(BTN_PREV, INPUT_PULLUP);
  pinMode(BTN_NEXT, INPUT);
  pinMode(BTN_PREV, INPUT);
  radio.setup();
  radio.setVolume(7);
  radio.setBand(0);
  radio.setMono(false);
  radio.setRDS(true);          // Habilita o RDS
  radio.setFrequency(freq * 100);
  display.clearDisplay();
  display.setTextColor(SSD1306_WHITE);
  display.setCursor(0, 0);
  display.println(“Radio FM RDS ESP32”);
  display.display();
  delay(1000);
}
void loop() {
  if (digitalRead(BTN_NEXT) == HIGH) {
    freq += 0.2;
    if (freq > 108.0) freq = 87.5;
    radio.setFrequency(freq * 100);
    Serial.print(“Freq: |—>>>>>>”);
    delay(200);
  }
  if (digitalRead(BTN_PREV) == HIGH) {
    freq -= 0.2;
    if (freq < 87.5) freq = 108.0;
    radio.setFrequency(freq * 100);
    Serial.print(“Freq: <<<<<<—–|”);
    delay(200);
  }
  // Verifica se há novos dados RDS
  if (radio.getRdsReady()) {
    char *stationName = radio.getRdsText0A(); // Nome da estação (PS)
    char *radioText   = radio.getRdsText2A(); // Texto dinâmico (RT)
    Serial.print(“Freq: “);
    Serial.println(freq);
    Serial.print(“Estacao: “);
    Serial.println(stationName);
    Serial.print(“Texto: “);
    Serial.println(radioText);
    updateDisplay(stationName, radioText);
  }
  delay(1000);
}
void updateDisplay(const char *stationName, const char *radioText) {
  display.clearDisplay();
  display.setTextSize(1);
  display.setCursor(1, 1);
  display.print(freq, 1);
  display.println(” MHz”);
  display.setCursor(0, 16);
  display.print(“Estacao: “);
  if (stationName != NULL)
    display.println(stationName);
  else
    display.println(“—“);
  display.setCursor(0, 32);
  display.print(“MSG: “);
  if (radioText != NULL)
    display.println(radioText);
  else
    display.println(“—“);
  display.display();
}



🔊 Como ouvir

  • Para fones de ouvido: conecte LOUT e ROUT direto nos fones (colocar resistores de 100Ω em série ajuda a proteger).

  • Para alto-falantes: use um amplificador de áudio (exemplo: PAM8403).

  • Não esqueça da antena de fio: sem ela a recepção será fraca.


🎯 Conclusão

Com apenas um ESP32, um módulo RDA5807M e alguns fios, você consegue montar seu próprio rádio FM digital controlado por software.
Esse projeto é ótimo para aprender sobre comunicação I²C, integração de módulos de rádio e até criar interfaces interativas no display para escolher estações.

👉 Próximos passos que você pode explorar:

  • Adicionar um display OLED para mostrar a frequência.

  • Implementar botões físicos para trocar de estação.

  • Ler e exibir RDS (nome da rádio, músicas, etc.).

📻 O que é RDS?

O RDS (Radio Data System) é um recurso presente em muitas estações de rádio FM.
Ele transmite informações digitais junto com o áudio, como:

  • 📌 Nome da rádio (ex: “Rádio Rock 89”).

  • 🎶 Nome da música ou artista que está tocando.

  • 📰 Mensagens curtas enviadas pela emissora.

  • Informações de hora e tráfego (em alguns casos).

O módulo RDA5807M suporta a leitura de dados RDS.

Deixe um comentário

O seu endereço de e-mail não será publicado. Campos obrigatórios são marcados com *