Manual
do
Maker
.
com
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!
O wiring é muito simples, mas vamos ao pinout primeiro:
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:
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:
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.
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!
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!
Inscreva-se no nosso canal Manual do Maker no YouTube.
Também estamos no Instagram.
Autor do blog "Do bit Ao Byte / Manual do Maker".
Viciado em embarcados desde 2006.
LinuxUser 158.760, desde 1997.