Controlador Remoto II de QTH

Hace años construí un conmutador remoto. Solo tenia una salida de alimentación de 220V. Tenia sus limitaciones, pero funcionaba a las mil maravillas.

Como todo en esta vida, hice una remodelación profunda del sistema.

Este nuevo conmutador, en vez de tener una sola salida, tiene 4.

Puede gestionar los mismo que el anterior,:

  • Entrada de señales analógicas 2, pasara a tener 4, cuando llegue la nueva placa ADC
  • Medidor de temperatura el bus 1Wire.
  • Reset del modem.

En el software, controla:

  • Tension de la fuente de alimentación.
  • Control de la intensidad de la fuente de alimentación.
  • Control de la conexión a internet, si falla resetea el router.
  • Temperatura de los equipos y de la fuente de alimentación.
  • Gestión de las alarmas, decide él solo cuando hay que desconectar el sistema.
  • Recibir ordenes a través de Telegram.
  • Enviar avisos y alarmas por Telegram.
  • Mostrar avisos en la pantalla LCD.
  • Enviar todos los datos de avisos, alarmas y ordenes recibidas al sistema domotico de la casa.

Toda la programación esta hecha con Python.

Multiplicador de 10MHz

Frontal multiplicador

En el laboratorio cada vez necesito mas señales de 10MHz. Como el GPSDO que construirá hace tiempo solo tiene una salida. Empece a diseñar una placa, lo deje porque los integrados que veía estaban obsoletos y el tiempo me apremiaba, me acorde de los montajes de DF9NP, tiene un Expansor de 2×5, con buffer de salida.

Lo adquirí junto a otros kits, para futuros proyectos.

Para este proyecto, utilice de base otro proyecto mio el GPSDO STP2945FL

Pero añadiéndole la placa de DF9NP. El montaje queda como se muestra en la siguiente figura:

Todos las cables de RF, tiene la misma longitud.

En cada una de las 10 salidas, tengo una tension App de 3,1V, y una señal sinosuidal muy buena.

Aun me falta hacer los frontales definitivos, estoy a la espera de una fresadora.

Y averiguar cual es el pin que indica que que GPSDO esta activo.

Amplificador AH103A.

Ebay es uno de los lugares donde se pueden encontrar cosas interesantes a precios asequibles.

Aunque el AH103A, es un amplificador que ya esta descatalogado, sirve parra el propósito que se va ha utilizar.

La placa PCB1900, esta diseñada para trabajar en la banda de 1,8 a 2,0 GHz.

Solo hace falta alimentarlo con 9V y tenemos 1/2W en esa rango.

Controlador para Baliza con Arduino.

Un compañero me envió una baliza que se componía de un Arduino como controlador y un walkie como emisora,

Estaba averiado y lo repare, Estaba montado sobre un Arduino UNO, con unos componentes adicionales.

Después de repararlo, le diseñe y fabrique una caja con la impresora 3D.

Desde la caja se puede alimentar el walkie.

Una vez terminado, surgió la idea de hacer una placa para que hiciera lo mismo, y su montaje lo mas fácil posible.

Dicho y hecho,

Hecho, he creado el software que correrá en la placa. En las próximas semanas estarán disponible.

Mixer Bidirectional: DC2566A

Mixer biderccional

En algunas ocasiones, es necesario hacer medidas de elevada frecuencia y no tengo instrumental para ello. En estos casos un mezclador nos puede ayudar a obtener una frecuencia que si es medible por el instrumental que poseo.

Mixer biderccional

El datasheet

El funcionamiento del Mixer es bastante simple, mezcla dos frecuencias (F1 y F2), obteniéndose las dos frecuencias resúltantes F1+F2 y F1-F2. Esto lo podemos hacer, dependiendo por donde introduzcamos la señal.

Trabajando como upconverter

Trabajando como Downconverter

Recomendaciones para las pruebas:

  • Alimentar el modulo y después dar la tensión a EN.
  • Antes de quitar la alimentación, quitar antes la tensión en EN.
  • El nivel maximo de entrada de LO es de 0dbm.

Características:

  • Voltaje de alimentación (VCC) ………………………………………..3V3
  • Rango de funcionamiento: desde 3GHz a 20GHz
  • Impedancias 50Ω
  • Voltaje de activación (EN) ……………..–0.3V to VCC+0.3V
  • Nivel Maximo de entrada del OL 0dBm.
  • LO Input Power (1GHz to 12GHz) …………………….10dBm
  • RF Power (3GHz to 20GHz)…………………………….20dBm

Baliza: Pagina web de control

Cuando queremos ver el estado de funcionamiento de la baliza, o nos fijamos en los led de la placa, o accedemos por el puerto serie disponible, para su supervisión.

La forma más fácil, es que la baliza tenga una pagina web, desde la que se pueda supervisar. Nos podremos conectar, con un PC, mediante la pagina de la impresora, por defecto, tendra la IP: 192.168.1.177. En versiones posteriores, se podrá cambiar la IP y otros parámetros de ella.

Nos muestra:

Datos de la Baliza:

  • Indicativo.
  • Locator.
  • Frecuencia de emisión.

Estado:

  • Oscilador: /boqueado / Libre.
  • Temperatura: De la controladora
  • Modo TX: el modo en que esta transmitiendo (Portadora / Opera /CW)

Avisos / Alarmas:

  • IP: La IP en la que esta escuchando
  • Alarma 1: Alarma por definir.
  • Alarma 2: Alarma por definir.

Es una prueba, solo ha servido para saber como se programa en el STM32, con. HTML

Python: Aceder a un servidor FTP

Forma fácil de acceder a un servidor FTP.

Para hacer la pruebas, usaremos el servidor dlptest.com este nos permita probar el programa que realicemos. Hay que tener en cuenta,:

  • No sirve para almacenar datos, ya que se borran cada cierto tiempo.
  • No se pueden subir ni descargar archivos muy grandes, ya que no puede banear nuestra IP.
  • La contraseña varia cada cierto tiempo
  • Recomendable leer las condiciones de uso, ya que pueden variar.

Desarrollo del programa:

Utilizaremos el modelo ftplib

Utilizaremos el fichero «ejemplo.txt» para poder hacer las operaciones, este fichero debe estar en el mismo directorio donde se ejecute el programa.

Definir los parámetros de acceso.

HOSTNAME = "ftp.dlptest.com"
USERNAME = "dlpuser"
PASSWORD = "rNrKYTX9g7z3RgJRmxWuGHbeu"

Nos conectamos al servidor:

ftp_server = ftplib.FTP(HOSTNAME, USERNAME, PASSWORD)

En las siguientes subrutinas, definiremos los comandos mas importantes.

Subir un fichero (Upload):

def subir_fichero():
    filename = "ejemplo.txt"
    # Leemos el fichero en modo binario
    with open(filename, "rb") as file:
        # Comando para UPloading el fichero "STOR filename"
        ftp_server.storbinary(f"STOR {filename}", file)

Bajar un fichero (Download):

def descargar_fichero():
    filename = "ejemplo.txt"
    # Escribimos el fichero en modo binario
    with open(filename, "wb") as file:
        # Comand para Downloading el fichero "RETR filename"
        ftp_server.retrbinary(f"RETR {filename}", file.write)

Crear un directorio:

def crear_directorio(directorio):
    try:
        ftp_server.mkd(directorio)
        print(f"Directorio '{directorio}' creado exitosamente.")
        ftp_server.quit()
    except ftplib.all_errors as e: 
      print(f"Error al crear el directorio: {e}")

Comprobar si existe un directorio:

def comprobar_directorio(directorio):
    """
     Comprueba si un directorio existe en un servidor FTP.
    Argumentos:
        ftp: Objeto FTP conectado al servidor.
        directorio: Nombre del directorio a comprobar.
    Avisos:
        True si el directorio existe
        ,False en caso contrario.
    """
    try:
        # Intenta cambiar al directorio
        ftp_server.cwd(directorio)
        # Si se pudo cambiar, vuelve al directorio anterior
        ftp_server.cwd('..')
        return True
    except ftplib.error_perm:
        # Si lanza error_perm, el directorio no existe
        return False

Progama completo:

# -*- coding: utf-8 -*-
"""
Created on Thu Jul 17 14:06:51 2025

@author: EA7TB
"""
# Import Module
import ftplib

# Fill Required Information
HOSTNAME = "ftp.dlptest.com"
USERNAME = "dlpuser"
PASSWORD = "rNrKYTX9g7z3RgJRmxWuGHbeu"

# Connect FTP Server
ftp_server = ftplib.FTP(HOSTNAME, USERNAME, PASSWORD)

# force UTF-8 encoding
ftp_server.encoding = "utf-8"

def listado():
    # Get list of files
    ftp_server.dir()


#Subir un fichero
def subir_fichero():
    filename = "ejemplo.txt"
    # Leemos el fichero en modo binario
    with open(filename, "rb") as file:
        # Comando para UPloading el fichero "STOR filename"
        ftp_server.storbinary(f"STOR {filename}", file)
        
def descargar_fichero():
    filename = "ejemplo.txt"
    # Escribimos el fichero en modo binario
    with open(filename, "wb") as file:
        # Comand para Downloading el fichero "RETR filename"
        ftp_server.retrbinary(f"RETR {filename}", file.write)
    
def crear_directorio():
    try:
        directorio = "ejemplo"
        ftp_server.mkd(directorio)
        print(f"Directorio '{directorio}' creado exitosamente.")
        ftp_server.quit()
    except ftplib.all_errors as e: 
      print(f"Error al crear el directorio: {e}")


def comprobar_directorio(directorio):
    """
     Comprueba si un directorio existe en un servidor FTP.
    Argumentos:
        ftp: Objeto FTP conectado al servidor.
        directorio: Nombre del directorio a comprobar.
    Avisos:
        True si el directorio existe
        ,False en caso contrario.
    """
    try:
        # Intenta cambiar al directorio
        ftp_server.cwd(directorio)
        # Si se pudo cambiar, vuelve al directorio anterior
        ftp_server.cwd('..')
        return True
    except ftplib.error_perm:
        # Si lanza error_perm, el directorio no existe
        return False


subir_fichero()
listado()
descargar_fichero()
print(comprobar_directorio("ejemplo"))
crear_directorio("ejemplo")
ftp_server.close()

Existen mas comandos, se pueden ver en la documentación de Python

FICHEROS DE CONFIGURACION

Para no modificar el fichero de configuración, podemos generar un fichero INI, donde estén todas las variables del programa.

La librería de Python que usaremos es ConfigParser ( https://pypi.org/project/configparser/ ). Para instalarla,

pip install configparse

FICHERO INI:

Esta estructurado en secciones, indicando en corchetes, y entradas. El nombre dentro del corchete indica la sección de la configuración.

Los valores se muestran especificando primero el nombre y luego el valor. Por ejemplo:

[GESTION]
nombre=“Gesstion de archivos"
versión = 1.0
autor="EA7TB"
locator= “IM76SR”
[ACTIVIDAD]
indicativo = “EH7SCB”
dme = “29078”
referencia = “MVMA-0234”
nombre = “Iglesia Santuario del Pilar”
nombre=“Gesstion de archivos"
version=1.0
autor="EA7TB"
locator= “IM76SR”
[ACTIVIDAD]
indicativo = “EH7SCB”
dme = “29078”
referencia = “MVMA-0234”
nombre = “Iglesia Santuario del Pilar”


Para leer los datos , se pueden ver en el ejemplo siguiente:

#!/usr/bin/env python
#!/usr/bin/env python3 
"""
Created on Tue Jul 15 17:24:34 2025
@author: EA7TB
"""
from configparser import ConfigParser
configfile_name = "config.ini" 
# leemos el fichero de configuración
config = ConfigParser()
config.read("config.ini")
# Imprime el numero de secciones
sections = config.sections()
print("%d secciones:" % len(sections))  # Cantidad de secciones
# imprime todos los valores de todas las secciones del archivo
for section in config.sections():
  print("\n[%s]" % section)
  for item in config.items(section):
      print(item[0], ":", item[1])
#asigna el valor de "indicativo" a call, después se imprime
call = config.get("ACTIVIDAD", "indicativo")
print("\n")
print(call)

Dependiendo del tipo de datos, para leerlos se usara:

  • Texto: config.get(section, option)
  • Boolean: config.getboolean(section, option)
  • Float: config. getfloat(section, option)
  • Integer: config.getint(section, option)

STM32: IDE Arduino.

Hay varios IDEs para programar, como estoy acostumbrado al del Arduino, utilizare este.

Leer más: STM32: IDE Arduino.

Arrancamos el IDE de Arduino y nos vamos a «ARCHIVO» «Preferencias»

Pinchamos en Preferencias:

En la linea «URLs adicionales de gestor de placas. añadimos la siguiente linea:

http://dan.drowm.org/stm32duino/package_STM32duino_index.json

Le damos a «Aceptar».

Aunque no es necesario, recomiéndo que se se cierre y abra el IDE, para recargar la configuración.

Y, a continuación nos vamos a «gestor de Placas»

Buscamos la placa siguiente: STM32F1xx/GD32F1xx

Le damos a instalar, ya se puede trabajar con esta placa.

Como usare un conversor USB/Serie para cargar el programa, hay que configurar en «Herramientas», el modelo de placa y el «Upload method», debe configurarse como muestra la imagen inferior.

Ya podemos trabajar con nuestro micro.

Espero que os sirva.