En este proyecto trabajamos con el generador FeelTech FY2300 20M y construimos un conjunto de herramientas en Python para resolver una necesidad muy concreta: cargar y reproducir formas de onda arbitrarias reales medidas con osciloscopio, además de exponer una interfaz simple para que cualquier usuario pueda reutilizar el flujo sin editar código manualmente.
El problema
Existen repositorios públicos para controlar generadores FeelTech desde Python, y varios de ellos resultan útiles para funciones comunes. Sin embargo, en nuestro caso apareció un problema práctico al momento de enviar datos al generador para reproducción arbitraria.
La meta no era solamente activar una senoide o una cuadrada, sino lograr que el equipo reprodujera una forma medida experimentalmente, por ejemplo un segmento real tomado desde un archivo CSV del osciloscopio. Para ese flujo, los repositorios disponibles no resolvían correctamente nuestro escenario de trabajo con el FY2300 20M, así que desarrollamos una ruta propia orientada al comportamiento real del equipo en laboratorio.
Qué construimos
El proyecto quedó formado por tres piezas principales:
una biblioteca propia en Python para el FY2300,
un script funcional para cargar formas arbitrarias reales,
y una interfaz gráfica simple en Tkinter.
Con ello ya es posible:
leer un CSV del osciloscopio,
extraer un segmento temporal,
ajustarlo al número de puntos aceptado por el generador,
añadir ruido blanco opcional,
cargarlo como forma arbitraria,
y reproducirlo desde el equipo.
La biblioteca fy2300_serial.py
La biblioteca propia expone funciones directas para trabajar con el generador:
selección de formas integradas,
frecuencia,
amplitud,
offset,
duty cycle,
atenuación,
trigger,
y carga de formas arbitrarias.
Esto permitió construir una solución enfocada específicamente al FeelTech FY2300 20M, usando el flujo que sí funcionó en pruebas reales.
La GUI simple
Después de validar el flujo con scripts, el siguiente paso fue construir una GUI para simplificar el uso.
La interfaz permite:
probar conexión con el puerto COM,
configurar ondas comunes,
ajustar frecuencia, amplitud, offset y duty cycle,
seleccionar atenuación 0 dB / 20 dB,
cargar un segmento desde un CSV,
previsualizar localmente la señal,
y enviarla al generador como arb2.
La idea es que cualquier usuario pueda aprovechar la herramienta sin tener que modificar el código base.
Por qué puede ser útil
Este proyecto puede ser útil si trabajas con:
instrumentación electrónica,
generación de señales arbitrarias,
automatización de laboratorio,
síntesis de señales reales medidas,
o pruebas con generadores FeelTech desde Python.
Especialmente si quieres ir más allá del uso básico de senoides y cuadradas, y reproducir una señal experimental real en el generador.
Repositorio público
El proyecto fue preparado para publicarse como repositorio abierto en GitHub, incluyendo:
la biblioteca,
la GUI,
el script funcional de ejemplo,
documentación base,
y dependencias mínimas.
La intención es que otros usuarios puedan reutilizarlo, adaptarlo y extenderlo.
No se trató de reemplazar todos los repositorios existentes, sino de resolver un caso específico que sí funcionara de manera reproducible con el FeelTech FY2300 20M, en particular para el envío de formas arbitrarias reales.
En siguientes entradas iré documentando con más detalle:
Las “10 Reglas” desarrolladas por Gerard J. Holzmann de la NASA son un conjunto de normas de codificación diseñadas para garantizar la seguridad y fiabilidad en sistemas de software críticos, es decir en aplicaciones por ejemplo de las industrias: aeroespacial, médico y de algunos sectores industriales. Estas reglas, a menudo aplicadas al lenguaje C, buscan reducir la complejidad y facilitar el análisis estático.
Software crítico: programas donde un error puede costar mucho: dinero, equipo, seguridad o incluso vidas. Por ejemplo: aeronáutica, automoción, equipo médico, control industrial, defensa, robótica peligrosa o firmware embebido importante.
La idea general no es “programar bonito”, sino:
. programar de forma predecible . verificable . difícil de romper
Idea central de las 10 reglas
Estas reglas buscan que el código sea:
fácil de entender
fácil de revisar
fácil de probar
fácil de analizar con herramientas
difícil de comportarse de forma inesperada
En otras palabras: menos trucos, menos magia, menos libertad, más control.
Las 10 reglas de código crítico
1) Flujo de control simple
No usar goto, setjmp, longjmp ni recursión directa o indirecta.
El programa debe seguir caminos simples y claros: if, else, switch, for, while.
Evitar mecanismos que “salten” de forma extraña o difícil de seguir.
Porque si el flujo del programa se vuelve enredado: cuesta entender qué pasó, cuesta depurarlo, aumenta la posibilidad de errores ocultos.
Ejemplos:
Bien:
C
if (sensor_ok) {procesar();} else {reportar_error();}
También se prohíbe recursión, porque en sistemas embebidos o críticos: consume pila de forma variable, puede desbordar stack, a veces no es fácil demostrar hasta dónde llegará.
2) Todos los bucles deben tener un límite máximo conocido
Cada bucle debe tener un límite superior fijo y comprobable estáticamente.
Significa que cada for o while debe tener un número máximo de vueltas conocido de antemano.
Ejemplos:
Bien:
C
for (int i = 0; i < 128; i++) { ...}
Aquí se sabe que como máximo da 128 iteraciones.
Más delicado:
C
while (dato != 0) { ...}
Aquí no está tan claro cuándo termina.
En software crítico importa mucho saber:
cuánto tarda una función
si puede quedarse atorada
si puede bloquear el sistema
Si un bucle no tiene límite claro, puede:
tardar demasiado
volverse infinito
romper tiempos de tiempo real
En embebidos esto es muy importante. Por ejemplo, en un STM32:
si una rutina tarda demasiado, puedes perder datos del ADC
puedes romper la temporización
puedes afectar interrupciones o tareas
3) No usar memoria dinámica después de inicializar
No utilice asignación dinámica de memoria después de la inicialización.
Significa, evitar: malloc(), calloc(), realloc(), free() durante la operación normal del sistema.