- RDA5807M IC
- IC PT2258
- Esquemático
- Componentes necessários
- Como estamos obtendo dados do Google Assistant?
- Configurando uma conta Adafruit para comunicação
- Configurando um corretor IFTTT para rádio FM
- Código e explicação do Arduino
- Testando o rádio FM controlado por voz usando Arduino
- Aprimoramento adicional
Hoje em dia, a maioria de nós gosta de ouvir música, com os nossos smartphones. Mas, alguns anos atrás, esse não era o caso, naquela época, os rádios FM eram a primeira escolha para ouvir música, podcasts, notícias e outros. Hoje em dia ninguém escuta rádio para ouvir música, notícias e outros, vovó e vovô sendo exceção.
Portanto, para reviver um pouco a antiga glória do rádio FM, neste projeto, vou construir um rádio FM controlado por voz usando o Google Assistance e o popular IC receptor RDA5870M Superheterodyne.
Além disso, verifique nossos circuitos de rádio FM anteriores:
- Rádio FM baseada em Arduino
- Rádio FM controlado por telefone inteligente usando Arduino
- Circuito Transmissor FM Simples
- Como construir um circuito transmissor FM
RDA5807M IC
O RDA5807M é um sintonizador de rádio FM estéreo de chip único muito moderno com um sintetizador totalmente integrado, seletividade IF, RDS / RBDS e decodificador MPX que suporta a faixa de frequência de 50 MHz a 115 MHz. É um receptor IC de chip único muito barato que requer poucos componentes externos para operar funcionalmente. Este IC usa a interface I2C para se comunicar com qualquer dispositivo mestre, portanto, todo esse recurso o torna muito adequado para dispositivos portáteis.
Este IC possui um processador de áudio interno que é responsável por sua excelente qualidade de áudio.
Alguns dos recursos básicos incluem-
- Suporte para bandas de frequência mundiais
- Suporte para RDS / RBDS
- Sintonizador digital de baixa IF
- Sintetizador de frequência digital totalmente integrado
- Controle de ganho automático digital (AGC)
- Aumento de graves
- Suporta diretamente o carregamento de resistência de 32Ω
- Regulador LDO integrado e mais
Você pode aprender mais sobre este IC passando por este projeto Rádio FM baseado em Arduino usando RDA5807.
IC PT2258
O PT2258 é um IC feito para ser usado como um Controlador de Volume Eletrônico de 6 canais, este IC usa a tecnologia CMOS especialmente projetada para aplicações de áudio e vídeo multicanal.
Este IC fornece uma interface de controle I2C com uma faixa de atenuação de 0 a -79dB a 1dB / etapa e vem em um pacote DIP ou SOP de 20 pinos.
Alguns dos recursos básicos incluem-
- 6 canais de entrada e saída (para sistemas de áudio doméstico 5.1)
- Endereço I2C selecionável (para aplicação em cadeia)
- Separação de canal alto (para aplicação de baixo ruído)
- Razão S / N de> 100dB
- A tensão operacional é de 5 a 9V
Explicamos anteriormente sobre este IC no projeto de controle de volume de áudio digital PT2258. Você pode verificar esse projeto se quiser saber mais sobre este IC.
Esquemático
O diagrama do circuito para o rádio FM controlado pelo Google Assistant é fornecido abaixo:
Componentes necessários
- Microcontrolador NodeMCU - 1
- Controlador de volume digital PT2258 - 1
- Módulo de Rádio FM RDA5807 - 1
- Relé SPDT 6V - 1
- Diodo 1n4007 - 1
- Terminal de parafuso 5mmx2-1
- Entrada para fone de ouvido de 3,5 mm - 1
- Conversor de nível lógico - 1
- Resistor 10K, 5% - 4
- Resistor 150K, 5% - 4
- Resistor 100K, 5% - 2
- Capacitor 10uF - 6
- Capacitor 0,1uF - 1
- Fio Jumper - 10
Como estamos obtendo dados do Google Assistant?
A imagem acima dá uma ideia básica do processo de comunicação entre o Google Assistant e o NodeMCU.
O Google Assistant tem autoridade para modificar dados no servidor Adafruit IO para fazer que o IFTTT com MQTT esteja funcionando como um corretor.
Se ocorrer alguma alteração de dados no lado do servidor (Adafruit IO), isso se refletirá no lado do NodeMCU. Para conseguir isso, você precisa seguir as instruções fornecidas abaixo-
Configurando uma conta Adafruit para comunicação
Primeiro, faça uma conta Adafruit IO. Faça login no Adafruit IO com suas credenciais ou cadastre-se se você não tiver uma conta. Anteriormente, usamos o Adafruit IO para construir LEDs controlados por Alexa, automação residencial Raspberry Pi e muitos outros projetos baseados em IoT.
Depois de fazer login na conta Adafruit, Clique em Painéis e em Ação> Criar um novo painel .
Em seguida, vamos adicionar um novo nome e uma breve descrição do nosso novo Painel.
Depois de criar o painel, você precisa obter o nome de usuário e a chave ativa de sua conta, pois é necessário no código Arduino. Você pode obtê-lo clicando no ícone CHAVE.
Depois disso, faça três blocos; um bloco de alternância, um bloco de medida, um bloco de texto.
Os blocos são muito importantes, pois são eles os responsáveis pela comunicação entre a assistência do google e o NodeMCU.
Para fazer um bloqueio, você precisa clicar no sinal + no canto superior direito.
A seguir, vamos fazer os blocos.
Em seguida, você precisa configurar cada bloco, para isso, você precisa marcar um bloco específico e clicar em Próximo passo.
Para este projeto, não há necessidade de alterar nenhuma configuração, exceto o botão de alternância.
O texto no botão de alternância está em letras maiúsculas, você precisa transformá-lo em uma letra minúscula e atualizar as alterações.
É isso, é tudo que você precisa para configurar no adafruit IO.
Minha tela final fica assim-
Configurando um corretor IFTTT para rádio FM
Como sempre, Sign Up se você não tiver uma conta ou Entrar se você já tem uma conta.
Agora, você precisa criar um miniaplicativo. Para isso, siga os passos abaixo:
Para fazer um miniaplicativo, clique no ícone da sua conta e clique em Criar.
Na tela de criação, clique no ícone + após se.
Depois disso, você precisa permitir o acesso à sua conta do Google.
Para isso, você precisa pesquisar o Google Assistant na barra de pesquisa e clicar no ícone do Google Assistant.
Na próxima tela, temos que escolher um gatilho, Lembre-se, fizemos três blocos no Adafruit IO Server, precisamos fazer os gatilhos para esses três blocos.
Primeiro, o Bloco Estação de Rádio, para isso precisamos selecionar Diz uma frase com um ingrediente de texto .
Na próxima tela, temos que digitar o que você deseja dizer e o que o assistente do Google deve responder para você.
Em seguida, clique no botão Criar gatilho.
A próxima tela se parece com isto, como você completou a parte If , é hora da parte then , clique no sinal + depois de then .
Você verá uma tela como a da imagem abaixo, procure por Adafruit e clique no ícone Adafruit.
Em seguida, autorize sua conta Adafruit com IFTTT e clique em Conectar.
Em seguida, você deve clicar em Enviar dados para Adafruit IO.
Em seguida, você verá uma lista suspensa de feeds que você criou anteriormente na conta Adafruit.
Escolha qualquer um e clique em criar ação, você precisa fazer isso para todos os três.
E com isso, marca o fim do processo IFTTT, minha tela final do miniaplicativo fica assim,
Código e explicação do Arduino
O código do Arduino existe para gerenciar toda a comunicação entre o IC e a comunicação entre Adafruit IO IFTTT e WIFI. O código completo para este Arduino Nano FM Radio é fornecido no final deste tutorial. O código é um pouco longo e complexo, aqui explicamos o código completo linha por linha.
Primeiro, precisamos incluir todas as bibliotecas necessárias, são elas:
#incluir
Em seguida, defina o SSID e a senha do WI-FI, este é o SSID e a SENHA do seu roteador.
const char * ssid = "Android"; // SSID do seu roteador const char * password = "12345678"; // Senha do seu roteador
Em seguida, definimos dois booleanos e uma variável, os booleanos são usados para manter o status de comunicação dos ICs e a variável de volume é usada para definir o nível de volume.
bool potStatus; // 1 quando a comunicação é estabelecida entre o MCU e o IC bool radioStatus; // 1 quando a comunicação é estabelecida entre o MCU e o IC int volume = 15; // nível de volume padrão com o IC começa com
Em seguida, configuramos um pino GPIO denominado Relay_Pin para ligar ou desligar o amplificador.
#define Relay_Pin D7 // Este pino é usado para ligar e desligar o rádio
Em seguida, precisamos definir todas as definições necessárias para nos comunicarmos com Adafruit IO.
#define AIO_SERVER "io.adafruit.com" #define AIO_SERVERPORT 1883 // use 8883 para SSL #define AIO_USERNAME "debashis13" // Substitua-o pelo seu nome de usuário #define AIO_KEY "aio_Qyal47 Authxo1fYhc55QB1lEPE Substitua o projeto" // Substituir chave do projeto "//
As definições abaixo FIX_BAND são uma definição proprietária usada pela biblioteca.
A próxima instrução definida define o volume interno do módulo.
#define FIX_BAND RADIO_BAND_FM // <A banda será afinada por este sketch é FM. #define FIX_RADIO_VOLUME 6 /// <Volume padrão do módulo.
Em seguida, faça os objetos necessários para o PT2258, o RDA5807M e o WiFiClient.
PT2258 digitalPot; // PT2258 Object RDA5807M radio; // RDA5807M Object WiFiClient client; // Objeto WiFiClient
Em seguida, configure a classe do cliente MQTT passando o cliente WiFi e o servidor MQTT e os detalhes de login.
Adafruit_MQTT_Client mqtt (& client, AIO_SERVER, AIO_SERVERPORT, AIO_USERNAME, AIO_KEY);
// Configure a classe do cliente MQTT passando o cliente WiFi e o servidor MQTT e os detalhes de login.
Então, precisamos assinar um Feed. O que isso faz com que você pergunte?
Se alguns valores, alguns parâmetros forem alterados no servidor Adafruit, as alterações serão refletidas aqui.
Adafruit_MQTT_Subscribe Radio_Station = Adafruit_MQTT_Subscribe (& mqtt, AIO_USERNAME "/ feeds / Radio_Station"); // Métodos usados para assinar um feed Adafruit_MQTT_Subscribe Toggle_FM = Adafruit_MQTT_Subscribe (& mqtt, AIO_USERNAME "/ feeds / Toggle_FM"); // Métodos usados para assinar um Feed Adafruit_MQTT_Subscribe Volume = Adafruit_MQTT_Subscribe (& mqtt, AIO_USERNAME "/ feeds / Volume"); // Métodos usados para assinar um feed
Abaixo está o protótipo de função para a função MQTT_connect () .
void MQTT_connect (); // Protótipo de função para MQTT Connect
Então começamos nosso processo de configuração. Primeiramente, iniciamos a comunicação UART com o método begin.
Serial.begin (9600); // UART begin Serial.println (); // adiciona uma linha extra para espaçamento Serial.println (); // adiciona uma linha extra para espaçamento A seguir, fazemos todas as coisas normais para conectar ao WiFI ***************** todas as coisas usuais necessárias para uma conexão WiFi *********************** / Serial.print ("conectando a"); Serial.println (ssid); WiFi.mode (WIFI_STA); WiFi.begin (ssid, senha); enquanto (WiFi.status ()! = WL_CONNECTED) {delay (500); Serial.print ("."); } Serial.println (""); Serial.println ("WiFi conectado"); Serial.println ("endereço IP:"); Serial.println (WiFi.localIP ()); / **************** todas as coisas usuais necessárias para uma conexão WiFi *********************** /
Em seguida, chame o método Wire.begin () para instanciar uma conexão I2C e chamamos o método Wire.setClock () para fixar a frequência I2C em 100KHz, pois é a velocidade total do IC PT2258.
Wire.begin (); // começa a sequência de partida I2C Wire.setClock (100000); // configurando o relógio I2C para 100KHz
Em seguida, chame o método init () para o PT2258 e o RDA5807 IC e mantenha o status de retorno nos booleanos definidos anteriormente.
potStatus = digitalPot.init (); radioStatus = radio.init ();
Em seguida, verifique se o MCU foi capaz de se comunicar com o IC ou não. Fazemos isso com duas instruções if else .
if (potStatus) {Serial.println ("Dispositivo PT2258 encontrado!"); } else {Serial.println ("Falha ao iniciar PT2258"); } if (radioStatus) {Serial.println ("Dispositivo RDA5807M encontrado!"); } else {Serial.println ("Falha ao iniciar RDA5807M"); }
Em seguida, chame o método de assinatura da biblioteca MQTT. Seremos notificados pelo servidor MQTT se alguma alteração acontecer em nossos feeds assinados.
mqtt.subscribe (& Radio_Station); // Configurar assinatura MQTT para feed Radio_Station mqtt.subscribe (& Toggle_FM); // Configurar assinatura MQTT para feed Toggle_FM mqtt.subscribe (& Volume); // Configurar assinatura MQTT para feed de volume
Em seguida, definimos o pino do relé como saída e o status do pino como BAIXO
pinMode (D7, OUTPUT); digitalWrite (D7, LOW);
Em seguida, defina um volume de rádio pré-determinado, este parâmetro define o volume interno do RDA5807 IC, que marca o fim do nosso processo de configuração.
radio.setVolume (FIX_RADIO_VOLUME); // em seguida, definimos o volume de rádio normalizado radio.setMono (false); // não queremos que o chip forneça uma saída mono radio.setMute (false); // não queremos que o chip fique mudo no início
Iniciamos o loop chamando a função MQTT_connect () que estabelece uma conexão com o servidor MQTT.
Na função de conexão MQTT, tentamos três vezes fazer uma conexão com o servidor MQTT.
Se for bem-sucedido, receberemos uma mensagem de sucesso, do contrário, receberemos uma mensagem de erro.
void MQTT_connect () {int8_t ret; // Inteiro de 8 bits para armazenar as novas tentativas // Parar se já estiver conectado. if (mqtt.connected ()) {return; } Serial.print ("Conectando ao MQTT…"); uint8_t retries = 3; while ((ret = mqtt.connect ())! = 0) {// conectar retornará 0 para Serial.println conectado (mqtt.connectErrorString (ret)); Serial.println ("Tentando novamente a conexão MQTT em 5 segundos…"); mqtt.disconnect (); atraso (5000); // aguarde 5 segundos de novas tentativas--; if (retries == 0) {// basicamente morrer e esperar que o WDT me reinicie enquanto (1); }} Serial.println ("MQTT conectado!"); }
Em seguida, comece criando um ponteiro para um objeto Adafruit_MQTT_Subscribe . Usaremos isso para determinar qual assinatura foi recebida.
Assinatura Adafruit_MQTT_Subscribe *;
Em seguida, esperamos por uma mensagem de inscrição.
mqtt.readSubscription (timeInMilliseconds) atenderá por um determinado tempo, para quaisquer mensagens provenientes do servidor MQTT.
Se receber uma mensagem antes do tempo limite, ele responderá com um ponteiro para a assinatura ou apenas expirará e retornará 0. Nesse caso, ele aguardará 2 segundos.
while ((subscription = mqtt.readSubscription (20000)))
Se ocorrer um tempo limite, o enquanto loop de preenchimento falha. Caso contrário, comparamos qual assinatura e obteremos nossas assinaturas conhecidas.
Neste código, fazemos isso para todos os três feeds assinados.
if (assinatura == & Toggle_FM) if (assinatura == & Radio_Station) if (assinatura == & Volume)
Esses foram os três principais parâmetros que você precisa entender na seção de loop.
Esta seção do código é usada para monitorar e definir o feed Toggle_FM .
if (subscription == & Toggle_FM) // é uma mensagem do Toggle_FM Feed {Serial.print (F ("Got:")); Serial.println ((char *) Toggle_FM.lastread); // imprime os dados do Feed apenas para depuração if (String ((char *) Toggle_FM.lastread) == String ("on")) // comparamos os dados recebidos com um parâmetro conhecido, neste caso esperamos que "on "está vindo do servidor {// mas antes de fazermos isso temos que torná-lo uma string que torne a comparação super fácil digitalWrite (D7, HIGH); // se obtivermos uma string" on "do servidor que estamos fazendo o pino D7 HIGH} if (String ((char *) Toggle_FM.lastread) == String ("off")) // novamente estamos verificando a string off {digitalWrite (D7, LOW); // se obtivermos um string "off" do servidor, estamos tornando o pino D7 BAIXO}}
Esta seção do código é usada para monitorar e definir o feed do Radio_Station .
if (assinatura == & Radio_Station) {Serial.print (F ("Got:")); Serial.println ((char *) Radio_Station.lastread); if (String ((char *) Radio_Station.lastread) == String ("Big FM")) // ouvir que estamos verificando a string Big FM {radio.setBandFrequency (FIX_BAND, 9270); // se a condição acima for verdadeira, estamos configurando o canal radoi para 92,7 MHz} // O processo acima mencionado continua abaixo if (String ((char *) Radio_Station.lastread) == String ("Red FM")) { radio.setBandFrequency (FIX_BAND, 9350); } if (String ((char *) Radio_Station.lastread) == String ("Radio Mirchi")) {radio.setBandFrequency (FIX_BAND, 9830); }}
Esta seção do código é usada para monitorar e definir o feed de Volume.
if (subscription == & Volume) // // ouvir que estamos verificando o string Volume e é um valor inteiro em formato de string // Temos que convertê-lo novamente em um inteiro para alterar o volume com a ajuda do PT2258 IC Serial.print (F ("Obtido:")); Serial.println ((char *) Volume.lastread); volume = atoi ((char *) Volume.lastread); // Estamos usando o método atoi () para converter um ponteiro de caractere para um inteiro volume = map (volume, 0,100,79,0); // mapear (valor, fromLow, fromHigh, toLow, toHigh) // como o pt2258 entende apenas valores inteiros em dB // estamos mapeando o valor de 0dB - 79dB para 0% - 100%. digitalPot.setChannelVolume (volume, 0); // depois de tudo isso, estamos ajustando o volume para o canal 0 do IC PT2258 digitalPot.setChannelVolume (volume, 1); // depois de tudo isso, estamos ajustando o volume do canal 1 do PT2258 IC}}
Testando o rádio FM controlado por voz usando Arduino
Para testar o circuito, o seguinte aparelho foi usado -
- Um transformador que tem um Tap 13-0-13
- Dois alto-falantes de 4Ω 20W como carga.
- Telefone para usar o Google Assistente.
Em um artigo anterior, mostrei como fazer um amplificador de áudio simples 2x32 watts com TDA2050 IC, vou usá-lo para esta demonstração, também, Desordenei o potenciômetro mecânico e encurtei dois fios com dois pequenos cabos de ligação. Agora, com a ajuda de dois botões, consegui mudar o volume do amplificador.
Aprimoramento adicional
Existem muitos outros aprimoramentos que podem ser feitos neste circuito.
- Existem vários problemas de ruído porque uma fonte de áudio está funcionando ao lado do NodeMCU, portanto, precisamos implementar blindagem adicional para melhorar a imunidade a ruído.
- Construir o circuito geral para um PCB melhorará a imunidade a ruído.
- Filtros adicionais podem ser adicionados a este IC para eliminar o ruído.
Espero que tenha gostado deste artigo e aprendido algo novo com ele. Se você tiver alguma dúvida, pode perguntar nos comentários abaixo ou pode usar nossos fóruns para uma discussão detalhada.