19 de setembro de 2021

Do bit Ao Byte

Embarcados, Linux e programação

Rádio FM RDA5807 com ESP32, Arduino etc.

Rádio FM RDA5807

Nesse artigo preferi fazer a sintonia de rádio FM com ESP32 porque fica fácil criar interação por WiFi invés de usar encoder ou potenciômetro. O processo é muito simples e tudo o que você precisa é de uma caixinha de som amplificada ou um amplificador de áudio. No meu caso, não tenho caixinhas, então usei um PAM8403 e um falante de 3w. O ESP32 utilizado foi o Wemos com display, da CurtoCircuito. Também da Curto, o rádio FM RDA5807, nesse link. O PAM8403 – estéreo, 2 canais – você encontra na UsinaInfo, nesse link. O custo desse projeto é baixíssimo e a diversão é garantida!

Para ficar mais legal ainda, depois de ter sintonizado algumas estações para testar, usei o transmissor de rádio FM que fiz com Raspberry. No vídeo você poderá ver a apresentação, como fica legal. Isso porque estou usando jumpers como antena do receptor e do emissor!

Wiring do rádio FM RDA5807

O wiring é muito simples, mas vamos ao pinout primeiro:

rádio FM RDA5807

Coloque o módulo nessa posição e então terá o SDA e SCL à esquerda. NC é “Not Connected”. A caixa da esquerda é o pino 7 e o pino 8 é a caixa da direita.

Agora o pinout do ESP32:

rádio FM RDA5807 | wemos esp32

Aqui devemos utilizar o pino 5 como SDA e o pino 4 como SCL, que são os pinos utilizados no barramento I2C que está o display.

Conecte o pino 5 ao SDA do rádio, o pino 4 ao SCK, o 3v3 ao VCC e GND ao GND.

Para antena utilizei 4 jumpers interconectados.

O PAM8403 tem o seguinte pinout:

rádio FM RDA5807 | pam 8403

Conecte primeiramente as saídas L e R do rádio ao L e R do PAM8403. Coloque também um jumper ao GND, que será comum tanto para o rádio como para o ESP32. Esse módulo funciona em 3v3 também, aqui está em 3v3, mas não deve prejudicar em nada o rádio alimentá-lo em 5V, já que o PAM8403 é apenas saída para os falantes.

Do lado superior do PAM estão as saídas para o falante, bastando conectar um falante em cada saída ou um falante apenas, como fiz aqui.

Código do rádio FM RDA5807

Instale a biblioteca RDA5807. Ele serve para todas as plataformas descritas no título, incluindo “etc”. Se usar a mesma placa que estou usando aqui, ou se for usar um display SSD1306 I2C, instale também a biblioteca Adafruit_SSD1306 e a Adafruit_GFX. Baseado nos próprios códigos de exemplo das bibliotecas utilizadas, o programa deve ficar assim:

#include <Arduino.h>
#include <Adafruit_SSD1306.h>
#include <Adafruit_GrayOLED.h>
#include <Adafruit_GFX.h>
#include <RDA5807.h>
#include <Wire.h>

#define SDA_PIN             5  
#define SCL_PIN             4
#define SEEK_UP             -1      //TODO: trocar pino 
#define SEEK_DOWN           -1      //TODO: trocar pino

#define SCREEN_WIDTH 128 // OLED display width, in pixels
#define SCREEN_HEIGHT 32 // OLED display height, in pixels

// Declaration for an SSD1306 display connected to I2C (SDA, SCL pins)
// The pins for I2C are defined by the Wire-library. 
// On an arduino UNO:       A4(SDA), A5(SCL)
// On an arduino MEGA 2560: 20(SDA), 21(SCL)
// On an arduino LEONARDO:   2(SDA),  3(SCL), ...
#define OLED_RESET     -1 // Reset pin # (or -1 if sharing Arduino reset pin)
#define SCREEN_ADDRESS 0x3C ///< See datasheet for Address; 0x3D for 128x64, 0x3C for 128x32

Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, OLED_RESET);

RDA5807 rx;

void showStatus();

void setup(){
    Serial.begin(9600);
    Wire.begin(5,4,100000);
    //Wire.setPins(5,4);
    pinMode(SEEK_UP, INPUT_PULLUP);
    pinMode(SEEK_DOWN, INPUT_PULLUP);

    if(!display.begin(SSD1306_SWITCHCAPVCC, SCREEN_ADDRESS)) {
        Serial.println(F("SSD1306 allocation failed"));
        for(;;); // Don't proceed, loop forever
    }

    display.setTextSize(1);
    display.setTextColor(WHITE);

    display.display();
    delay(2000);
    display.clearDisplay();
    display.setCursor(0, 0);
    display.println("Djames");
    display.display();
    
    delay(3000);
    Serial.println("radio");

  rx.setup();
  rx.setVolume(5);
  //rx.setFrequency(9850); // It is the frequency you want to select in MHz multiplied by 100.
  rx.setFrequency(9900); //99MHz
  showStatus();
}

void showStatus() {
    display.clearDisplay();
  display.setCursor(0, 0);
  display.println("FM ");
  display.setCursor(38, 0);
  display.print("      ");
  display.setCursor(38, 0);
  display.print(rx.getRealFrequency() / 100.0);
  Serial.print(rx.getRealFrequency() / 100.0);
  Serial.println("MHz");
  display.setCursor(95, 0);
  display.print("MHz");
  display.display();
}

void loop(){
    /*
    rx.setFrequencyUp();
    rx.setFrequencyDown();
    showStatus();   
    rx.seek(RDA_SEEK_WRAP,RDA_SEEK_UP);
    rx.seek(RDA_SEEK_WRAP,RDA_SEEK_DOWN);
    */
   delay(1000);
   showStatus();
   //rx.setFrequency(10200);

 }

Agora é só implementar um controle para trocar de estação, seja por encoder, por WiFi, bluetooth etc. Fácil e rápido!

Vídeo do rádio FM RDA5807

O vídeo, como sempre, estará disponível no canal DobitaobyteBrasil no Youtube tão logo seja editado. Se não é inscrito ainda, vamos lá, me dê uma chance de propiciar alguns minutos de entretenimento!