Daniel Lopes
Miembro Geconocido
!Cielo santo , inmaginen ese transmissor "basurento" con 15 Wattios en una buena Antenna !
!Puebre de los receptores de FM cercanos a el !
!Puebre de los receptores de FM cercanos a el !
Follow along with the video below to see how to install our site as a web app on your home screen.
Nota: This feature currently requires accessing the site using the built-in Safari browser.
Si , pero eso no significa que el problema sea el QN8006, existe comunicación entre el QN8006 y el controlador? No falla una etapa previa? Hay muchas cosas que comprobar, la unica razón para dañar el modulo QN8006 es superar ampliamente el valor de alimentación de 5V, si este es tu caso puede ser lo que sospechas pero averiarse así por las buenas, lo dudo mucho.No , no tiene salida de rf, ni se escucha , nada de nada, con un pll Chino da los 15 W y todo normal.
Hola, puedes comprar por acaDesconozco el trato dado por el cliente, pero sin el módulo nuevo no puedo hacer más, todos los voltajes están bien , el módulo no lo encuentro en la red ,por eso pido ayuda al foro a encontra el componente perdido.
rds (radio data system)En realidad es una transmissión FM analógica totalmente emulada en un software mas conocida como "RDS" (Radio Defined for Software).
Att,
Daniel Lopes.
Si, pero en ese caso don Dani se refiere al SDR en gringo y en español se podría decir como software definido por radio.rds (radio data system)
| Propiedad | Valor |
|---|---|
| Microcontrolador | PIC16F628A |
| Resolución ADC | 10 bits |
| Frecuencia del reloj | 4 MHz |
| Modo I²C | Maestro |
| SDA | PIN_B0 |
| SCL | PIN_B1 |
| Velocidad I²C | slow |
| Función | Propósito |
|---|---|
| qn8027_write_reg() | Escribe un registro por I²C |
| qn8027_init() | Inicializa el chip |
| qn8027_set_freq() | Ajusta la frecuencia FM |
| qn8027_set_power() | Ajusta la potencia (0–15) |
| qn8027_start_tx() | Inicia la transmisión |
| Dirección | Uso |
|---|---|
| 0x00 | Parte alta de frecuencia |
| 0x01 | Parte baja de frecuencia |
| 0x01 | Potencia |
| Encoder | Función |
|---|---|
| Encoder 1 | Frecuencia |
| Encoder 2 | Potencia |
| Variable | Tipo | Uso |
|---|---|---|
| frecuencia | unsigned int16 | Frecuencia FM ×10 |
| potencia | unsigned char | Nivel de salida (0–15) |
// ====================================================================================
// Archivo: main.c
// Dispositivo: PIC16F628A
// Funci n: Transmisor FM con QN8027, control por encoders, LCD I2C, EEPROM y RDS din mico
// ====================================================================================
#include <16F628A.h>
#device ADC=10
#use delay(clock=4000000)
#use i2c(master, sda=PIN_B0, scl=PIN_B1, slow)
// ===========================
// QN8027 (Transmisor FM)
// ===========================
#define QN8027_ADDRESS 0x58
void qn8027_write_reg(unsigned char reg, unsigned char value) {
i2c_start();
i2c_write(QN8027_ADDRESS);
i2c_write(reg);
i2c_write(value);
i2c_stop();
}
void qn8027_init(void) {
qn8027_write_reg(0x00, 0x01); // Reset
delay_ms(10);
qn8027_write_reg(0x01, 0x55); // Oscilador
qn8027_write_reg(0x06, 0x0F); // Potencia m xima
qn8027_write_reg(0x02, 0x00); // Standby
}
void qn8027_set_freq(unsigned int16 freq_val) {
unsigned char low = freq_val & 0xFF;
unsigned char high = freq_val >> 8;
qn8027_write_reg(0x04, low);
qn8027_write_reg(0x05, high);
}
void qn8027_start_tx(void) {
qn8027_write_reg(0x02, 0x88); // Modo transmisi n
}
void qn8027_set_power(unsigned char level) {
if(level > 15) level = 15;
qn8027_write_reg(0x06, level);
}
// ===========================
// EEPROM
// ===========================
#define ADDR_FREQ 0x00
#define ADDR_POT 0x02
unsigned char eeprom_read_byte(unsigned char addr) { return read_eeprom(addr); }
void eeprom_write_byte(unsigned char addr, unsigned char value) { write_eeprom(addr, value); }
// ===========================
// LCD I2C (PCF8574)
// ===========================
#define LCD_ADDR 0x4E
#define RS_COM 0
#define RS_DAT 1
#define LCD_EN 4
#define LCD_BL 8
void i2c_write_lcd(unsigned char value) {
i2c_start();
i2c_write(LCD_ADDR);
i2c_write(value);
i2c_stop();
}
void lcd_send_nibble(unsigned char nibble, unsigned char mode) {
unsigned char data = nibble | (mode ? RS_DAT : RS_COM) | LCD_BL;
i2c_write_lcd(data | LCD_EN);
delay_us(100);
i2c_write_lcd(data & ~LCD_EN);
}
void lcd_send_byte(unsigned char data, unsigned char mode) {
lcd_send_nibble(data & 0xF0, mode);
lcd_send_nibble((data << 4) & 0xF0, mode);
delay_ms(2);
}
void lcd_init(void) {
delay_ms(50);
lcd_send_nibble(0x30, RS_COM); delay_ms(5);
lcd_send_nibble(0x30, RS_COM); delay_us(150);
lcd_send_nibble(0x30, RS_COM); delay_us(150);
lcd_send_nibble(0x20, RS_COM); delay_us(150);
lcd_send_byte(0x28, RS_COM);
lcd_send_byte(0x08, RS_COM);
lcd_send_byte(0x01, RS_COM); delay_ms(2);
lcd_send_byte(0x06, RS_COM);
lcd_send_byte(0x0C, RS_COM);
}
void lcd_clear(void) { lcd_send_byte(0x01, RS_COM); delay_ms(2); }
void lcd_gotoxy(unsigned char x, unsigned char y) {
unsigned char address = (y == 1) ? 0x00 : 0x40;
address += (x - 1);
lcd_send_byte(0x80 | address, RS_COM);
}
void lcd_putc(char c) { lcd_send_byte(c, RS_DAT); }
void lcd_print(char *text) { while(*text) lcd_putc(*text++); }
// ===========================
// Encoders (Entrada)
// ===========================
#define ENC_FREQ_A PIN_A0
#define ENC_FREQ_B PIN_A1
#define ENC_FREQ_BTN PIN_A2
#define ENC_POT_A PIN_A3
#define ENC_POT_B PIN_A4
#define ENC_POT_BTN PIN_A5
unsigned char last_freq_a = 0;
unsigned char last_pot_a = 0;
signed char encoder_freq_read(void) {
signed char delta = 0;
unsigned char a = input(ENC_FREQ_A);
unsigned char b = input(ENC_FREQ_B);
if(a != last_freq_a) delta = (b != a) ? 1 : -1;
last_freq_a = a;
return delta;
}
signed char encoder_pot_read(void) {
signed char delta = 0;
unsigned char a = input(ENC_POT_A);
unsigned char b = input(ENC_POT_B);
if(a != last_pot_a) delta = (b != a) ? 1 : -1;
last_pot_a = a;
return delta;
}
unsigned char encoder_freq_pressed(void) { return !input(ENC_FREQ_BTN); }
unsigned char encoder_pot_pressed(void) { return !input(ENC_POT_BTN); }
// ===========================
// Variables globales
// ===========================
unsigned int16 frecuencia;
signed char potencia;
// ===========================
// Actualizar LCD
// ===========================
void actualizar_lcd() {
char buffer[16];
unsigned char mhz = frecuencia / 10;
unsigned char dec = frecuencia % 10;
unsigned char pot_pct = (unsigned char)potencia * 100 / 15;
lcd_clear();
sprintf(buffer, "Frec: %02u.%1uMHz", mhz, dec);
lcd_gotoxy(1,1); lcd_print(buffer);
sprintf(buffer, "Pot: %03u%%", pot_pct);
lcd_gotoxy(1,2); lcd_print(buffer);
}
// ===========================
// RDS Din mico (PS y RT)
// ===========================
char rds_ps[9] = "MiRadio ";
char rds_rt[65] = "Bienvenidos a la emisora FM QN8027!";
unsigned char rds_ps_index = 0;
unsigned char rds_rt_index = 0;
void qn8027_send_ps_block(void) {
unsigned char i = rds_ps_index * 2;
unsigned char b0 = rds_ps[i];
unsigned char b1 = rds_ps[i + 1];
qn8027_write_reg(0x0A + rds_ps_index, b0);
qn8027_write_reg(0x0A + rds_ps_index, b1);
rds_ps_index = (rds_ps_index + 1) % 4;
}
void qn8027_send_rt_block(void) {
unsigned char b0 = rds_rt[rds_rt_index];
unsigned char b1 = (rds_rt[rds_rt_index + 1] != '\0') ? rds_rt[rds_rt_index + 1] : ' ';
qn8027_write_reg(0x0E, b0);
qn8027_write_reg(0x0F, b1);
rds_rt_index += 2;
if (rds_rt_index >= 64 || rds_rt[rds_rt_index] == '\0') rds_rt_index = 0;
}
void qn8027_update_rds(void) {
qn8027_send_ps_block();
qn8027_send_rt_block();
}
// ===========================
// Programa principal
// ===========================
void main() {
// Configuraci n de puertos
set_tris_a(0xFF); set_tris_b(0x00); output_b(0x00);
lcd_init();
// Leer EEPROM
frecuencia = (unsigned int16)eeprom_read_byte(ADDR_FREQ) * 10;
frecuencia += eeprom_read_byte(ADDR_FREQ + 1);
potencia = eeprom_read_byte(ADDR_POT);
if(frecuencia == 0) frecuencia = 983;
if(potencia == 0) potencia = 15;
// Inicializar QN8027
qn8027_init();
qn8027_set_freq(frecuencia);
qn8027_set_power((unsigned char)potencia);
qn8027_start_tx();
actualizar_lcd();
while(TRUE) {
signed char d_freq = encoder_freq_read();
signed char d_pot = encoder_pot_read();
if(d_freq) {
frecuencia += d_freq;
if(frecuencia < 875) frecuencia = 875;
if(frecuencia > 1080) frecuencia = 1080;
qn8027_set_freq(frecuencia);
actualizar_lcd();
}
if(d_pot) {
potencia += d_pot;
if(potencia > 15) potencia = 15;
if(potencia < 0) potencia = 0;
qn8027_set_power((unsigned char)potencia);
actualizar_lcd();
}
if(encoder_freq_pressed()) {
eeprom_write_byte(ADDR_FREQ, frecuencia/10);
eeprom_write_byte(ADDR_FREQ+1, frecuencia%10);
}
if(encoder_pot_pressed()) {
eeprom_write_byte(ADDR_POT, (unsigned char)potencia);
}
// Actualizaci n din mica RDS
qn8027_update_rds();
delay_ms(50);
}
}
Eso quiere decir que en pantalla no se verá nada? No entiendo esa parte. Este código ha sido probado en un transmisor real? Hay algun videito o imágenes de como es la señal o algo o solo es copy paste de ia?a este diseño le falta la visualización de la frecuencia y potencia
Buenas noches realize pruebas con Deepseek en crear un asembler para el bh1415 al final todo. Bien pero luego no se puede compilar que me aconsejarias saliendo del tema amigo JuanBueno mi experiencia, para generar código se puede hacer con la inteligencia artifial, las mejores para generar archivos para el firmware y aplicaciones de control Gemini (de google) y Deepseek, ChatGPT te hara dar vueltas y cometerá errores una y otra vez, los otros 2 pueden darte errores, pero en unas pocas sesiones si les vas pegando los errores al compilar, al final se logra el proyecto, en cuanto a los archivos de arriba, la recomedación de la IA es usar un PIC16F877A pues el PIC16F628A o el PIC16F88 tienen pocos recursos como la memoria RAM que es imprescindible para el RDS PS y RT dinámicos. He podido generar el firmware tanto para el QN8027 como para el SI4713 y la aplicación de control, queda bastante profesional.
Primero, no dirigirse a un usuario en particular.Buenas noches realize pruebas con Deepseek en crear un asembler para el bh1415 al final todo. Bien pero luego no se puede compilar que me aconsejarias saliendo del tema amigo Juan
Creo que no se puede llegar a algo profesional más que solo el software porque esos pll son unos generadores de interferencia para fm. No es buena idea amplificar mucho esas señales porque lo que va provocar es molestia en otras señales. Nada bueno se puede obtener de estos pll más que experimentar con muy poca señal para conocer su mal funcionamiento. Mi modesto comentarioQN8027 como para el SI4713 y la aplicación de control, queda bastante profesional.
Me refiero a que si necesitas por ejemplo un pll + un pic o avr y una aplicación de control, deepseek o gemini, pueden ayudarte a generar el código, el tener conocimientos básicos de programación del cerebro de tu proyecto ya no es un impedimento para hacer cosas interesantes, por supuesto un chip de estos no es una solución del todo profesional, pero puede ayudarte a experimentar con el mundo de la rádio.Creo que no se puede llegar a algo profesional más que solo el software porque esos pll son unos generadores de interferencia para fm. No es buena idea amplificar mucho esas señales porque lo que va provocar es molestia en otras señales. Nada bueno se puede obtener de estos pll más que experimentar con muy poca señal para conocer su mal funcionamiento. Mi modesto comentario
OFF-TOPIC.Me refiero a que si necesitas por ejemplo un pll + un pic o avr y una aplicación de control, deepseek o gemini, pueden ayudarte a generar el código, el tener conocimientos básicos de programación del cerebro de tu proyecto ya no es un impedimento para hacer cosas interesantes, por supuesto un chip de estos no es una solución del todo profesional, pero puede ayudarte a experimentar con el mundo de la rádio.
Por ejemplo a un proyecto con TSA5511 le podrias añadir un codificador rotatorio para controlar la frecuencia de emisión y el pulsador central, que te guardase esa configuración en la eeprom del pic16F628A, si no sabes como hacerlo la IA te da la solución para implementarlo en tu diseño.
Claro deepseek o gemini, les falta madurar mucho, pero son una herramienta más esto no es como skynet, busca en toda la web la mejor solución para resolver tu duda o problema donde estes atascado, sin duda sera el futuro y por ahora es algo que esta madurandose, muchos programadores usan visual studio con inteligencia artificial que te ayuda a corregir cualquier error que surja, para arduino y esp32 tiene su propio generador de código duinocodegenerator, si duda es de gran ayuda a la hora de generar el firmware para nuestros proyectos.OFF-TOPIC.
Hola a todos....Pues si usas el buscador del foro en este mismo esta el proyecto para Basic del Proton y PBP (creo) desde hace años y lo se porque he intervenido en dicho tema en su momento.
Realmente no las he usado(a las IA específicamente para mi trabajo) pero si me guio por las respuestas automáticas que ofrece al hacer una pregunta al navegador Web, "inventa una novela". En mi opinión nos falta recorrer todavía un poco mas de camino al respecto.
En cuanto a las recomendaciones ya todos los que andábamos en programación de microcontroladores sabíamos sobre las limitaciones de esos pequeños dispositivos, el arte(si lo hay) es que allí funcione medianamente y los trucos utilizados para hacerlo. Como decía mi abuela "con yuyos cualquiera es brujo".
Hoy la oferta, alternativas y costo de los microcontroladores, placas genéricas ,etc dificultan el uso de un PIC16F628A para hacer dicho proyecto debido a que tomas una placa ESP32 o ESP8266 cualquiera y por centavos haces lo mismo, mas rápido y con mas prestaciones.
Saludos a todos.