Transmisor de UHF FSK con MAX7057

Buenas, tengo como unos 10 integrados MAX7057 que supe pedir como muestras gratis a MAXIM semiconductors.
El MAX7057 es un transmisor pensado para llaveros de 315MHz a 433MHz, puede ser configurado como transmisor ASK o FSK.
LA idea es aprovechar este integradito para transmitir las coordenadas GPS de un cohete y ver de recibirlos en una radio UHF tipo YAESU, BAOFENG etc.
También se puede llegar a transmitir alguna telemetría.

Tengo armado el prototipo de transmisor pero me falta la parte de programación, tiene montado un PIC 12F675, pero por facilidad me parece lo voy a reemplazar por un arduino nano por el momento. Esta placa la hice hace muchos años y quedó inconclusa, ya poco me acuerdo de programar PIC, recuerdo usaba el compilador CCS PIC-C.
De arduino me acuerdo poco y nada también, pero me parece hay mas recursos online.
A medida que avance iré publicando los progresos, si alguien se quiere sumar bienvenido sea.

Link a la hoja de datos:
https://www.analog.com/media/en/technical-documentation/data-sheets/MAX7057.pdf

Hay que programar una serie de registros usando una interfaz SPI
Como siempre busqué en Internet algún proyecto similar o librerias para este integrado pero no pude encontrar nada, la inteligencia artificial no sirvió de mucho (no tiene ni idea que es cuando le pedí un código para esto).


La placa de abajo es un amplificador de 5W (se puede ajustar a 1W).

Los diseños de la placa los paso cuando los encuentre jeje, hace varios años la diseñé.

Interesante Rubén!

Entiendo que la banda de 433 mhz no ofrece grandes distancias, pero quizás esté equivocado.

Yo sumaría a las alternativas del PIC a los mini ESP32, son incluso mas económicos que los Arduino Nano, mas pequeños y prácticamente se programan igual, ya que se puede utilizar el mismo entorno de Arduino, es decir, Arduino IDE.
https://articulo.mercadolibre.com.ar/MLA-1422278885-placa-de-desarrollo-esp32-c3-super-mini-wifi-bluetooth-_JM

Hay un sitio que tiene muchísimos proyectos para hacer con ESP32:
https://randomnerdtutorials.com/projects-esp32/

Y por otro lado, al menos chatGPT está familiarizado con la programación de estos equipos, pero como en todo desarrollo, no hay que confiarse 100% de lo que hace porque suele errarle.

Saludos!!

Hola Gustavo, gracias por los comentarios.

“Entiendo que la banda de 433 mhz no ofrece grandes distancias, pero quizás esté equivocado.”
Depende del entorno, para comunicaciones espaciales anda muy bien y las antenas son mas pequeñas que en VHF.

ESP32 no he trabajado nunca todavía, en cambio arduino algo he hecho, ya se cómo se conecta y cómo se graba, me falta acordarme como se escribe un programa jaja
Arduino tengo varios, ESP32 ninguno, por lo que por ahora iré con lo que tengo. Calculo se podrá migrar después el programa a ESP32.

“Y por otro lado, al menos chatGPT está familiarizado con la programación de estos equipos, pero como en todo desarrollo, no hay que confiarse 100% de lo que hace porque suele errarle.”
No he indagado mucho en chat GPT probé que me tire un programa hola mundo en arduino y lo hace bien, cuando le pedí un programa para esto me tiraba cualquier cosa, le pregunté si sabía que era el MAX7057 ni idea tenía, intenté formular el pedido de distintas formas, y ni idea tiene, en vez de decir “no lo se” te tira cualquier verdura (ya se contaminó de la raza humana jajaja). Le pedí que me buscara contenido relacionado y me tiraba algo de que no puede hacer eso.

Saludos

Buenas, les dejo el primer intento de programa. todavía no lo he probado en el hardware

/*
Transmisor FSK con MAX7057
La idea es generar un programa que fije la frecuencia de transmisión
En principio la frecuencia es fija y se cambiaría reeditando el código fuente y volviendo a programar el arduino
Basicamente hago una funcion que sea la que programe los registros, la salida de datos es tipo SPI (hago un SPI manual)

última edicion: 05/11/2024

*/
int spi_clk = 5;
int spi_data = 6;
int spi_enable = 7;

float freq = 433000; //Frecuencia central de transmisión en kHz
float deviation = 10; // desviación en khz (desviación total es 2 veces este valor)
float fhi = freq + deviation; //Frecuencia superior en kHz
float flo = freq - deviation; //Frecuencia inferior en kHz
float fxtal= 16000; //Frecuencia del xtal en kHz

unsigned int fhi_float;
unsigned int flo_float;

unsigned int fhi_reg;
unsigned int flo_reg;
byte fhi_reg_msb;
byte fhi_reg_lsb;
byte flo_reg_msb;
byte flo_reg_lsb;

byte CTRL_REG = 0b00000111; //el registro de control asigno los valores manualmente en esta variable
byte CFG_REG = 0b00000000; //el registro de configuracion asigno los valores manualmente en esta variable
byte ADDRESS = 0x00;



// the setup function runs once when you press reset or power the board
void setup() {

// initialize digital pin LED_BUILTIN as an output.
pinMode(LED_BUILTIN, OUTPUT);
pinMode(spi_data, OUTPUT);
pinMode(spi_clk, OUTPUT);
pinMode(spi_enable, OUTPUT);

digitalWrite(spi_enable, 1);
digitalWrite(spi_data, 0);
digitalWrite(spi_clk, 0);

Serial.begin(9600); // open the serial port at 9600 bps:

}

// the loop function runs over and over again forever
void loop() {
digitalWrite(LED_BUILTIN, HIGH); // turn the LED on (HIGH is the voltage level)
delay(1000); // wait for a second
digitalWrite(LED_BUILTIN, LOW); // turn the LED off by making the voltage LOW
delay(1000); // wait for a second
// aca lo del led que parpadea es para ver que ande y no se tilde ////////

//////// Cálculo de los valores a programar en los registros de frecuencia ///////////////////////////

fhi_float = ((fhi/fxtal)-16)*4096;
fhi_reg = round(fhi_float);

fhi_reg_lsb = fhi_reg & 0xFF;
fhi_reg_msb = (fhi_reg >> 8) & 0xFF;

flo_float = ((flo/fxtal)-16)*4096;
flo_reg = round(flo_float);

flo_reg_lsb = flo_reg & 0xFF;
flo_reg_msb = (flo_reg >> 8) & 0xFF;

programar_registro(0x00, CTRL_REG); // programo el registro de control en la dirección 0x00 (en el comentario final estan los bit de control)
programar_registro(0x01, CFG_REG); // programo el registro de configuración en la dirección 0x01 (en el comentario final estan los bit de configuracion)
programar_registro(0x07, 0x00); // programo el resitro DATAIN con 0 de acuerdo a la hoja de datos
programar_registro(0x08, 0x00); // programo el resitro EN con 0 de acuerdo a la hoja de datos
programar_registro(0x09, 0b00000010); // programo el resitro CONFIG1 con 010 para clockout
programar_registro(0x02, fhi_reg_msb); // programo el registro HIFREQ1
programar_registro(0x03, fhi_reg_lsb); // programo el registro HIFREQ0
programar_registro(0x04, flo_reg_msb); // programo el registro LOFREQ1
programar_registro(0x05, flo_reg_lsb); // programo el registro LOFREQ0

}

//-------------------------------------------------------------------------------------------------//

//////////// Programacion registro <DATA D0 D1 … D7> //////////
void programar_registro(byte REG_NAME, byte DATA){

byte WCD = 0x01; // write command
bool r;

digitalWrite(spi_enable, 0); //Habilito el enable para transferir datos al registro

for (int a=8; a>=1; a–) //Envia el comando de escritura 0x01
{
r = bitRead(WCD, (a-1));
digitalWrite(spi_data, r);
digitalWrite(spi_clk, 1);
delay(2);
digitalWrite(spi_clk, 0);
}
delay(2);
for (int b=8; b>=1; b–) //Envia la direccion del registro a programar
{
r = bitRead(REG_NAME, (b-1));
digitalWrite(spi_data, r);
digitalWrite(spi_clk, 1);
delay(2);
digitalWrite(spi_clk, 0);
}
delay(2);
for (int i=8; i>=1; i–) //envia los datos a programar en el registro
{
r = bitRead(DATA, (i-1));
digitalWrite(spi_data, r);
digitalWrite(spi_clk, 1);
delay(2);
digitalWrite(spi_clk, 0);
}
delay(2);
digitalWrite(spi_enable, 1); //Desabilito la transferencia de datos al registro
}

/* Direcciones de los registros

  • ADDRESS:
  • 0x00 Registro CONTROL (Control register. Controls the mode (ASK/FSK), crystal clock output, envelope-shaping, PLL bandwidth, and SPI enable.)
  • 0x01 Registro CONFIG0 (Configuration 0 register. Controls the capacitance at the PA output and clock output frequency divider)
  • 0x02 Registro HIFREQ1 (High-frequency 1 register (upper byte). Sets the high frequency in FSK transmission)
  • 0x03 Registro HIFREQ0 (High-frequency 0 register (lower byte). Sets the high frequency in FSK transmission)
  • 0x04 Registro LOFREQ1 (Low-frequency 1 register (upper byte). Sets the low frequency in FSK transmission, or carrier frequency in ASK transmission)
  • 0x05 Registro LOFREQ0 (Low-frequency 0 register (lower byte). Sets the low frequency in FSK transmission, or carrier frequency in ASK transmission.)
  • 0x06 Registro FLOAD (Frequency load register. Performs the frequency load function.)
  • 0x07 Registro DATAIN (Data in register. SPI equivalent of DIN pin.)
  • 0x08 Registro EN (Enable register. SPI equivalent of ENABLE pin.)
  • 0x09 Registro CONFIG1 (Configuration 1 register. GPO selector.)
  • 0x0C Registro STATUS (Status register)
    */

/*

  • Control Register (Address: 0x00)
  • BIT 0: ASK(0) or FSK(1)
  • BIT 1: Crystal clock output enable(1) on GPO output
  • BIT 2: Crystal clock output enable(1) while part is in shutdown mode
  • BIT 3: Disable(0) or enable(1) transmitter envelope-shaping resistor
  • BIT 4: PLL bandwidth setting, low(0) = 300kHz or high(1) = 600kHz; 300kHz is recommended for fractional-N and 600kHz for fixed-N
  • BIT 5: Enable(0) or disable(1) SPI communication during shutdow
  • BIT 6: 0
  • BIT 7: 0
    */

// CTRL_REG = 0b00000111;

/*

  • Configuration 0 Register (Address: 0x01
    *BIT 4-0: cap[4:0] 5-bit capacitor setting
    *BIT 7-5 ckdiv[2:0] 3-bit clock output frequency divider
    */

//CFG_REG = 0b00000000

/*

  • High-Frequency 1 Register (Address: 0x02)
  • 7-0 fhi[15:8] 8-bit upper byte of high-frequency divider for FSK
    /



    /

    *High-Frequency 0 Register (Address: 0x03)
    *7-0 fhi[7:0] 8-bit lower byte of high-frequency divider for FSK
    */