Analizando Las Bajas Frecuencias
by jaimearavena in Circuits > Software
179 Views, 3 Favorites, 0 Comments
Analizando Las Bajas Frecuencias
Las señales electromagnéticas de baja frecuencia, en este caso bajo los 14 Hertz, nos muestran fenómenos interesantes, siendo el más notorio el efecto Schumann, generado, según creemos, por la excitación de los rayos de las tormentas en el mundo sobre la cavidad resonante formada por la ionósfera y la superficie de la Tierra. Wikipedia nos explica muy bien este tema.
Sin embargo, la recepción de estas señales es difícil, pues las longitudes de onda son de varias decenas de kilómetros, lo que hace que su realización sea poco práctica. Entonces, en estos casos se recurre a una antena sensible al campo magnético, típicamente un bucle de algunas vueltas.
Existen bastantes textos sobre este tema, y uno de ellos nos motivó hace ya diez años. Fue escrito por Kurt Diedrich para la revista *Elektor* en el año 2014, número 10, página 8: “ELF receiver”. Además de ser un circuito interesante, Kurt entregó un programa para el lenguaje ‘Processing’ que es gratuito y que es la base de esta herramienta.
Downloads
Supplies
- Magnetómetro HMC5883L de Honeywell.
- Microcomputador ESP8266.
- Laptop con Processing y el IDE de Arduino.
Puede verse que el presupuesto es muy modesto.
Programa Analizador
Tras muchas pruebas y errores, y subiéndonos a los hombros de Kurt Diedrich, podemos, diez años después, tratar de hacer algunos cambios en el programa sugerido.
La primera modificación que podemos considerar es la aparición de magnetómetros integrados en un chip. Hemos usado el conocido HMC5883L de Honeywell, el cual puede medir con un muestreo de hasta 75 Hertz y una escala desde ±0.88 Gauss (88 microteslas). Como el sensor es de 12 bits, el valor del LSB (bit menos significativo) es de 0.4297 milligauss (42.97 nanoteslas), valor relativamente alto comparado con sensores de tecnología fluxgate.
(El campo magnético terrestre varía entre los 25 y 65 microteslas aproximadamente).
La idea nueva es usar el magnetómetro como “antena”.
Para leer el magnetómetro utilizaremos el microprocesador ESP8266 de Espressif, un chip muy interesante y económico. Interrogado a 30 Hertz y con 8 muestras de promedio, puede darnos una tasa de muestreo de unos 28 Hertz, interesantes para nuestros fines. Esta frecuencia se encuentra suficientemente alejada de los poderosos 50 Hertz que el servicio eléctrico nos contamina poderosamente, y las ‘frecuencias espejo’ del ‘aliasing’ también quedan fuera de nuestro rango de interés.
Una segunda modificación ha sido la simplificación del brillante programa de Kurt Diedrich, cambiando también la rutina de análisis de Fourier por un algoritmo FFT. Ocupando un laptop moderno, la potencia y velocidad nos dejan mucha más holgura que un desktop de hace 10 años.
Debemos considerar que no se puede usar la entrada de sonido de un laptop para estos análisis, ya que la respuesta de frecuencia de los amplificadores de audio no es buena bajo los veinte Hertz en general.
El análisis de este tipo de señales requiere almacenar un gran número de puntos durante bastante tiempo, ya que son fenómenos lentos. La presentación gráfica en ‘cascada’ propuesta por Kurt Diedrich es bastante cómoda para obtener una visión sinóptica de algunas horas de grabación.
Los Programas
En el ESP8266 hemos instalado un programa con ayuda del IDE Arduino (también disponible gratuitamente) una rutina de lectura del magnetómetro que nos es proporcionado por Korneliusz Jarzebski en una biblioteca disponible en:
https://github.com/jarzebski/Arduino-HMC5883L
El programa para el analizador de señal propiamente tal está escrito en el lenguaje interpretado ‘Processing’ y se puede obtener gratuitamente en:
https://processing.org](https://processing.org
El código de control del magnetómetro debe ser cargado utilizando el IDE Arduino, que también es gratuito. Este programa lee los datos entregados por el ESP8266 en tramas de 1024 datos y consta de las siguientes rutinas:
- void setup (): Se inicializan los valores y se escriben los textos fijos, incluyendo una escala de colores según la intensidad relativa.
- void draw(): Se ingresan los datos y se controla el flujo del proceso.
- void fft(float input, float real, float imag): Rutina FFT sugerida por ChatGPT.
- void cascada(): Dibuja la cascada según la escala de colores. También muestra el espectro de la trama actual y el gráfico del espectro acumulado filtrado con un filtro EMA con el coeficiente k=0.2. Esto se puede cambiar en la línea 21 del código en ‘Processing’..
- void resumen(): Realiza los gráficos de los valores: RMS, rango máximo y mínimo en las dos ventanas inferiores.
- void reescala(): Una vez leída la primera trama, se calculan los parámetros correspondientes, algunos de los cuales se recalculan en cada trama.
- int gama(int i): Entrega un código de color según el valor de la entrada, que está entre 0 y 255.
- void fecha(): Lee desde el sistema la fecha y hora del comienzo de las lecturas.
- void calibra(): Calcula todos los parámetros de la señal tomando la primera trama como referencia.
- void guarda(): Graba la imagen de la pantalla antes de reiniciar la grabación.
Adaptación
El programa de análisis requiere ciertos ajustes particulares para funcionar:
A) En la línea 52 está la instrucción:
serport = new Serial(this, "COM4", 115200);//<<<<<<<<< AJUSTAR
Como se indica, la expresión “COM4” debe ajustarse al puerto USB en el cual esté conectado el sensor a través del 8266. Es el mismo puerto con que se programó la CPU con el IDE Arduino.
B) En las líneas 12 y 13 se encuentran las asignaciones:
float ymax= -240.;//valor máximo que entrega el arduino.ES NECESARIO CONOCER
float ymin= -300; // valor mínimo que entrega Arduino
Estos valores corresponden a los rangos de valores que el sensor esté entregando realmente, los cuales se pueden determinar mediante el monitor serial del IDE Arduino.
Basta con poner valores aproximados, ya que, como se dijo, después de la primera lectura de datos, estos valores se recalculan con un rango de pocas unidades. Esto se debe modificar si se considera que la excursión de la señal en las próximas horas es grande.
Para ello se modificará:
void reescala(){
ymax=max+10;
ymin=min-10;
….
Almacenamiento De Los Datos
Cuando se han recibido 512 tramas de 1024 datos cada una, se graba una captura de la imagen en forma de un dibujo tipo BMP, el cual se guarda en el mismo directorio del programa. Dado que la fecha y hora de inicio se encuentran establecidas, es posible deducir la hora exacta de cualquier evento, y el análisis puede continuarse por muchas horas. El nombre del archivo guardado es igual a la fecha de grabación. La cantidad de datos que se han analizado en cada pantalla completa es de 512 * 1024 = 524,288 datos. Si el lapso de lectura de cada trama es de 36 segundos, tendremos 18,400 segundos = 306 minutos = 5 horas y 6 minutos aproximadamente. El tamaño del archivo de la imagen capturada es del orden de los 3.2 megabytes.
Naturalmente, existen “tiempos muertos” entre cada trama y entre cada grabación de datos, pero son lapsos cortos, dependiendo del tipo de laptop.
Una escala puesta en la base del gráfico en cascada el número de la trama que se ha analizado, y un número verde a la derecha de la ventana superior indica el índice de la última trama leída completamente.
El tiempo de grabación depende del retardo con que se realizan las medidas del sensor. Un retardo en la línea 132 del programa en el IDE Arduino determina el valor. Si el retardo se aumenta, el análisis cubrirá frecuencias más bajas. Debe notarse que las frecuencias más bajas tienen un margen de error mayor debido al tamaño limitado del lapso de medida, que siempre es de 1024 datos. Por ello, se han eliminado de los gráficos los valores de las frecuencias cercanas a cero.
Resultados Del Ejercicio
La pantalla del laptop nos mostrará un conjunto de seis cuadros, como vemos en la figura inicial. El primero de ellos nos muestra la señal capturada a medida que se leen los valores en la puerta USB hasta un máximo de 1024 valores, es decir, una trama.
Luego, bajando a la izquierda, tenemos la presentación del espectro de Fourier de esta señal en el formato conocido como “cascada”, en el cual la intensidad relativa de cada componente de frecuencia se codifica según una escala de colores arbitraria. Dicha escala cromática se muestra como una línea en el extremo derecho. Esta ventana es muy interesante, pues nos entrega una visión global e histórica de lo medido.
Bajo esta ventana se encuentra otra que nos muestra en color blanco el valor RMS de la señal para cada trama de 1024 valores. De la misma manera, la ventana inferior derecha nos grafica la excursión de la señal en cada trama, en color amarillo, o sea mínimo y máximo así como el valor promedio respectivo en color rojo
También en el lado derecho se observan otras dos ventanas: la inferior muestra el espectro de la última trama en color azul y se sobrepone el espectro filtrado según el promedio móvil exponencial (EMA) para todas las tramas ya leídas. Este espectro filtrado se muestra en color naranja. Las unidades son arbitrarias ya que dependen de las unidades empleadas en el sensor. El coeficiente que gobierna al filtro EMA se puede modificar en la línea:
21 float a=0.2;
Mientras más pequeño es el valor de este parámetro, menos importancia tiene la última medida con respecto a la historia anterior acumulada. De esta manera, los ruidos tienden a mantenerse a un nivel constante y bajo pero la frecuencia de una señal presente se va destacando mientras más tramas se examinan. Este filtro EMA es de tipo pasabajos de modo que también ayuda a amortiguar frecuencias de aliasing. También en wikipedia hay un artículo interesante sobre filtros EMA.
En el lado derecho superior se encuentra una ventana que nos informa sobre el valor de la frecuencia máxima encontrada en cada muestra, en color naranja.
Debemos reconocer que el programa es algo intrincado pues se fue modificando mediante prueba y error. Cualquier mejora es bienvenida.
Ejemplo.
En el ejemplo que mostramos, nos hemos dedicado a examinar la componente vertical del campo magnético en mi entorno. Para ello en el programa del ESP8266, en la línea 126 se usó solamente la expresión:
126 Serial.print(raw.ZAxis);
Cambiando esta sección del programa es posible analizar diferentes componentes del campo o éste en su conjunto,
La instalación que usamos está en un edificio de departamentos en medio de la ciudad de Santiago, a pocas centenas de metros del ferrocarril subterráneo y en un piso intermedio, de modo que es un entorno muy adverso. Sin embargo los resultados son interesantes ya que observamos una frecuencia en torno a los siete y ocho Hertz. No nos atrevemos asegurar que es el efecto Schumann pero nos gusta creer que así es aún cuando habrá sin embargo que analizar más ejemplos y probar en otros entornos.
Actualmente no tenemos una explicación de la presencia de estas frecuencias pues pueden ser de origen humano o natural. Eso es parte del encanto del análisis de las señales de baja frecuencia y cualquier explicación que se determine será muy bien recibida.
Mejoras a Realizar.
El método de lectura está basado en la captura asincrónica de cada dato que el ESP8266 entrega en la puerta COM. Por tanto, pueden haber datos perdidos y lo más importante, no hay seguridad que los datos sean leídos en con una tasa exacta. De hecho se puede estimar que en este caso ejemplo, los datos se leen cada 33 milisegundos pero cada cierto tiempo, del orden de seis ó siete lecturas hay un retardo de 50 milisegundosen una sola lectura. Esto se debe al método de captura y al hecho que usamos máquinas que no usan un sistema operativo tipo ´real time’ sino los habituales.
Existe naturalmente un límite para la capacidad de analizar medidas a una velocidad alta por lo que la herramienta es más útil solamente para bajas tasas de muestreo. Más bajo que los 17 milisegundos nos parece que el sensor no alcanza a responder bien.
Para mejorar la precisión de las medidas, una mejor solución se puede basar en que capturemos los datos mediante la generación de interrupciones por parte del puerto COM directamente.
Otra mejora interesante a realizar será comunicar mediante WiFi el sensor con el laptop aprovechando la capacidad inalámbrica del ESP8266. Esto permitirá poner cómodamente el sensor en lugares ubicados en el exterior de la casa.
Conclusión.
En concreto, la herramienta nos permite analizar una señal tanto en sus componentes de baja frecuencia como en su amplitud y potencia en las ventanas correspondiente. Las unidades son algo arbitrarias ya que dependerán de los valores entregados por el sensor.
Es posible también analizar otro tipo de señales como por ejemplo las señales de un sismómetro de modo de determinar la frecuencia de resonancia del edificio en que se ubique u otros sensores que pueden ser de interés como acelerómetros, ondas de presión barométricas de baja frecuencias (infrasonidos) o variables ambientales, considerando los retardos necesarios para que la medida sea significativa.
Dejamos estas herramientas para entretención de los interesados.