Rádio Multibanda com Si4730 e Arduino Nano – LW, MW, SW, FM
Componentes e Materiais
| Arduino Nano R3 | 1 |
| Módulo de Rádio Si4730 | 1 |
| LCD Padrão Adafruit 16x2 Branco sobre Azul | 1 |
| Encoder Rotativo com Botão | 1 |
| Módulo Amplificador de Áudio Classe D (Placa de Desenvolvimento) | 1 |
| Alto-falante: 0,25W, 8 ohms | 1 |
| Bastão de ferrite de rádio MW antigo | 1 |
| Chave Deslizante | 1 |
Ferramentas Necessárias
- Ferro de solda (genérico)
Aplicações e Serviços Online
- Arduino IDE
Sobre o Projeto
Quando se fala em rádio com Arduino, pensa-se imediatamente em rádio FM moderno (88-108 MHz na Europa). As bandas LW, MW e SW cobrem a faixa de 0,2 a 30 MHz. A SW (onda curta) é especialmente interessante: ondas de rádio nessa banda podem ser refletidas ou refratadas por uma camada de átomos eletricamente carregados na atmosfera chamada ionosfera. Assim, o rádio de onda curta permite comunicação de longa distância, às vezes entre continentes inteiros ou além.
Abaixo apresento o desenvolvimento de um rádio que cobre todas as bandas mencionadas. O "coração" deste rádio é o CI Si4730 da Silicon Labs, disponível no AliExpress como uma pequena placa de desenvolvimento por poucos dólares.
Esta placa é controlada por um Arduino via protocolo I2C. O código foi escrito por Julio C. Rosa, baseado na biblioteca Si4735-I2C-R4 fornecida junto com o código e esquema. Embora o fabricante diga que este chip (Si4730) é apenas para AM/FM, ele funciona em SW também. Para saída de áudio, uso uma mini placa amplificadora digital 2x3W PAM8403 Classe D, muito barata e funcional.
O dispositivo é montado em uma caixa adequada e representa um pequeno rádio de ondas mundiais completo. Moro no térreo em área densamente povoada e uso uma antena de 10 metros, então a recepção é fraca, mas ainda comparável a rádios portáteis comerciais que possuo.
Vale mencionar que este chip é usado por muitas marcas conhecidas de rádios portáteis como TECSUN, DEGEN, SANGEAN e outras.
Código
Código Principal C/C++
/**************************************************************************************************
JCR Si4730/5 Receptor LW/MW/SW/FM - Versão para compartilhar. Veja esquemáticos para detalhes de ligação.
Escrito por Julio C. Rosa - The CesarSound - Maio/2019
Comandos:
radio.volumeUp(); radio.volumeDown(); radio.seekDown(); radio.seekUp();
radio.mute(); radio.unmute(); radio.setMode(FM); radio.tuneFrequency(9490);
radio.getStatus(); radio.getVolume(); radio.getMode(); radio.getMute(); radio.toggleMute();
RSQMetrics rsq; radio.getRSQ(&rsq); (rsq.stereo); print_number(rsq.stereoBlend);
print_number(rsq.SNR); (rsq.seekable); print_number(rsq.RSSI);
print_mode(); print_station_freq(); print_volume(); print_mute(); print_home();
radio.getCallSign(callSign); printp(rds1); Serial.write(callSign);
radio.getProgramTypeStr(programType); Serial.write(programType);
(rds1); (rds2); (rds3); (rds4); (rds5);
*****************************************************************************************************/
// Bibliotecas
#include <Si4735.h>
#include <LiquidCrystal.h>
#include <rotary.h>
#include "Wire.h"
// Configurações I/O
Rotary r = Rotary(2, 3);
LiquidCrystal lcd(12, 13, 7, 6, 5, 4);
const byte band = A0;
// Variáveis
unsigned int freq = 880;
unsigned int freqmax = 10800;
unsigned int freqmin = 50;
unsigned int fstep = 10;
unsigned int freqold;
unsigned int buttonstate;
unsigned int count = 15;
// Instância do Si4730/5 chamada radio
Si4735 radio;
void setup() {
lcd.begin(16, 2);
PCICR |= (1 << PCIE2);
PCMSK2 |= (1 << PCINT18) | (1 << PCINT19);
sei();
// Botão seletor de bandas
pinMode(band, INPUT_PULLUP);
// Inicializa rádio. Modos possíveis: AM, FM, SW, LW
radio.begin();
radio.setMode(AM);
command_am();
// Define frequência inicial
radio.tuneFrequency(freq);
lcd.setCursor(0, 2);
lcd.print("JCR Multiband Rx");
lcd.setCursor(0, 0);
lcd.print("F>>");
lcd.setCursor(3, 0);
lcd.print(":");
lcd.setCursor(13, 0);
lcd.print("kHz");
}
// Interrupção do Encoder
ISR(PCINT2_vect) {
unsigned char result = r.process();
if (result) {
if (result == DIR_CW) {
freq = freq + fstep;
if (freq >= freqmax) freq = freqmax;
} else {
freq = freq - fstep;
if (freq <= freqmin) freq = freqmin;
}
}
}
void loop() {
if (freqold != freq) {
tune();
}
freqold = freq;
lcd.setCursor(5, 0);
lcd.print(freq);
lcd.print(" ");
buttonstate = digitalRead(band); // Seletor de bandas
if (buttonstate == LOW) {
inc_preset();
while (digitalRead(band) == 0);
}
// Medidor S-Meter (dBu) e SNR (dB) - descomente se quiser usar
RSQMetrics rsq;
radio.getRSQ(&rsq);
lcd.setCursor(0, 2);
lcd.print("dBu: ");
lcd.print(rsq.RSSI);
lcd.setCursor(9, 2);
lcd.print("dB: ");
lcd.print(rsq.SNR);
}
// Presets INC
void inc_preset() {
count++;
if (count > 15) count = 1;
bandpresets();
delay(100);
}
// Presets Seletor de Bandas
void bandpresets() {
lcd.setCursor(0, 0);
switch (count) {
case 1: freq = 370; radio.setMode(LW); radio.tuneFrequency(freq); command_am(); fstep = 5; lcd.print("LW1"); break;
case 2: freq = 620; radio.setMode(AM); radio.tuneFrequency(freq); fstep = 5; lcd.print("MW1"); break;
case 3: freq = 840; radio.setMode(AM); radio.tuneFrequency(freq); fstep = 5; lcd.print("MW2"); break;
case 4: freq = 3700; radio.setMode(SW); radio.tuneFrequency(freq); fstep = 5; lcd.print("SW0"); break;
case 5: freq = 4985; radio.setMode(SW); radio.tuneFrequency(freq); fstep = 5; lcd.print("SW1"); break;
case 6: freq = 6010; radio.setMode(SW); radio.tuneFrequency(freq); fstep = 1; lcd.print("SW2"); break;
case 7: freq = 7200; radio.setMode(SW); radio.tuneFrequency(freq); fstep = 1; lcd.print("SW3"); break;
case 8: freq = 10000; radio.setMode(SW); radio.tuneFrequency(freq); fstep = 5; lcd.print("SW4"); break;
case 9: freq = 11940; radio.setMode(SW); radio.tuneFrequency(freq); fstep = 5; lcd.print("SW5"); break;
case 10: freq = 13710; radio.setMode(SW); radio.tuneFrequency(freq); fstep = 5; lcd.print("SW6"); break;
case 11: freq = 15400; radio.setMode(SW); radio.tuneFrequency(freq); fstep = 5; lcd.print("SW7"); break;
case 12: freq = 17560; radio.setMode(SW); radio.tuneFrequency(freq); fstep = 5; lcd.print("SW8"); break;
case 13: freq = 21505; radio.setMode(SW); radio.tuneFrequency(freq); fstep = 5; lcd.print("SW9"); break;
case 14: freq = 27015; radio.setMode(SW); radio.tuneFrequency(freq); fstep = 5; lcd.print("CB1"); break;
case 15: freq = 9700; radio.setMode(FM); radio.tuneFrequency(freq); fstep = 10; lcd.print("FM1"); break;
}
}
// Sintonizador
void tune() {
radio.tuneFrequency(freq);
}
// Comandos soft mute off / AVC max gain
void command_am() {
radio.setProperty(PROP_AM_SOFT_MUTE_MAX_ATTENUATION, 0); // 0 (OFF) - 63
radio.setProperty(PROP_AM_AUTOMATIC_VOLUME_CONTROL_MAX_GAIN, 0x3A98); // 1000 - 7800
}
Bibliotecas C/C++
Disponíveis para download (biblioteca Si4735, rotary, etc.)
Esquemáticos
Consulte o repositório do projeto para o diagrama de ligação completo.
Processo de manufatura
- Circuitos de Rádio a Cristal e Transistor: De Detectores Básicos a Receptores AM/FM Integrados
- A Evolução e Engenharia da Tecnologia de Rádio
- A Evolução e Produção de Elásticos
- Termocâmera DIY: De Ideia de Sala de Aula a Produto Global
- Kit Esterilizador UVC DIY – Caixa UV de Baixo Custo e Fácil Montagem para Itens Médicos e Pessoais
- Construa uma Rádio Internet Wi‑Fi com Raspberry Pi e Arduino: Transmita Estações Globais
- Gerador de Ondas JX – Oscilador DDS Compatível com Arduino com Display OLED
- 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
- Serra de Fita Vertical: Propósito, Características e Aplicações