jueves, 21 de febrero de 2019

Transceptor de señales débiles, bit a bit [Parte 2]

En realidad, y como aclaré al comienzo, la historia contada en ésta serie de entradas no transcurrió en la misma linea de tiempo que la estoy contando; en mi caso el paso de instalar una baliza WSPR fue el primero, y el experimento consistió en ver si podría lograrse con solo una placa RBPi y ... ¡nada mas! (spoiler: ¡si, se puede!).
He realizado algunas entradas por fuera de ésta serie comentando algunos detalles de la implementación técnica de la baliza, el cual se hace con el programa wspr del paquete WsprryPi [link], el cual deriva de una larga trayectoria de programas que exploran la capacidad de una RBPi de generar RF directamente desde sus puertos GPIO mediante la reprogramación de su timer, y lo logra en una sorprendente gama de frecuencias que llega hasta el espectro de VHF lejano. 
Cuando se lo activa se obtiene  una señal de RF que puede entregar apróximadamente 10 mW de potencia desde el pin GPIO04 del GPIO. Inicialmente no pensé que fuera posible, pero luego lo medí rudimentariamente (¡no tengo un miliWattimetro!) con una carga fantasma, y si, entrega incluso un poco mas que eso en condiciones ideales. Alimentado por una sana incredulidad hice algunas cuentas.
Lo que sale del pin GPIO04 (sin carga) es una onda cuadrada de 3.3Vpk-pk. Quiere decir que la tensión RMS será Vrms=(Vpk-pk/2) * 0.707 o sea 1.16V. La potencia Pmax=(Vrms^2)/RL y con R=50 ohms eso es 0.026 W (26 mW), si era mas que 10 mW después de todo.... En realidad la potencia es menor, porque al cargar al pin la tensión no es 3.3Vpp y por otra parte cualquier proceso de filtrado introduce algo de pérdida, estimando ambos factores en -3 dB dá... para sorpresa de nadie.... 0.013W (13 mW).
Podemos, para una prueba cruda y algo arriesgada para la integridad de la placa, conectar directamente ese pin a una antena y estar en el aire. Hacer eso es una mala idea por un número importante de razones, entre ellas la posibilidad de dañar la placa por estáticos, la nula protección contra cortocircuitos y sobrecargas y la rica (e indeseable) producción de armónicos que tiene una señal cuadrada como la presente a la salida. Hay que tener en cuenta que muchas (¡muchas!) antenas están en cortocircuito para la tensión continua, eso es mortal para la placa si no hay al menos un capacitor en serie que la proteja.
Se puede hacer una prueba corta, pero muy corta, directamente conectando a la antena. Pero hay que mas o menos rápidamente tomar medidas. Los modos de baja señal son increibles, pues una señal tan débil como 10 mW puede efectivamente llegar muy lejos, y si está mal formada causar problemas muy lejos también.
Un filtro pasa bajos es una medida aconsejable (para aislar y reducir contenido de armónicos) y algo de potencia adicional (10 a 100 mW) con algo de amplificación.
Inicialmente probé con un filtro Pi casero, aislación eléctrica mínima con la antena  y solo 10 mW de potencia. ¡El resultado fue fantástico! en forma marginal la señal era tomada en distancias de hasta 5000 Km (repito ... ¡10 mW!). Lo que me animó a dar el siguiente paso y apelar a la placa QRPi ofrecida por el TAPR [link], la que contiene un filtrado bastante exhaustivo y un amplificador de +10 dB. Esta placa está especialmente diseñada para entrar en el gabinete de la RBPi, provee un buen  filtrado de entrada y salida además de los +10 dB de ganancia; pero comodidad (eufemismo por vagancia) de construcción aparte es perfectamente reproducible con esfuerzo modesto en cualquier taller pues ninguno de sus componentes es crítico.
El resultado fue inmediato y sorprendente, la baliza con ella pasa a ser reportado de ocasionalmente a  rutinariamente en distancias de 5000 Km y habitualmente a distancias entre 8 y 13 mil Km. No es milagro, WSPR puede operar con márgenes de relación señal-ruido de hasta -30 dB, por lo que tiene una ventaja de +40 dB sobre una señal de fonía y +15 dB sobre una de telegrafía. En las mismas condiciones que la baliza es reportada en -30 dB necesitaría transmitir en CW con al menos potencias QRP (3-5W) para ser escuchado en el borde mismo del circuito de comunicación. WSPR logra ese milagro en base al método de codificación empleado y al tiempo de emisión de cada mensaje. Para instalar WsprryPi el proceso es simple.

#!/bin/sh
sudo apt-get install git
git clone https://github.com/JamesP6000/WsprryPi.git
cd WsprryPi
make
#  Install to /usr/local/bin:
sudo make install
exit 0

Para implementar la baliza se necesita algo mas que simplemente lanzar el programa, el cual tendrá una forma

wspr -r -s  LU7DID GF05 20 20m 0 0 0 0

En este caso configurado con mi licencia, mi QTH locator, la potencia que uso [20 dBm=100 mW] y la banda (20m), los cuatro "0" luego de 20m indican que si bien el beacon funciona permanentemente salte 4 "ventanas" sin emitir, o sea que emita una vez cada 10 minutos. Eso es un buen equilibrio entre la calidad del reporte, el uso juicioso del espectro radioeléctrico limitado y preservar la placa en el largo plazo (puede aumentar su temperatura en hasta 3 °C en cada emisión). Como he compartido en entradas anteriores si el objetivo es tener algo ejecutando permanentemente hay que darle un marco que permita su control,  supervisión y gestión.
Para eso es mas conveniente hacer un script de lanzamiento en bash, que de acuerdo a los argumentos que se le den permita lanzar, detener, bloquear, liberar o conocer el estado de ejecución de la baliza, por ahora solo de transmisión; hacerlo de ésta forma es no solo cómodo sino que permite automatizar el lanzamiento del script, el script en mi caso se llama whisper y puede obtenerse una copia del mismo [link]. Para correrlo se ejecuta con la instrucción:

/home/pi/whisper/whisper start

Dado que el script es re-entrante en realidad lo ejecuto una vez por minuto con crontab, si ya está corriendo simplemente termina dejando un registro en el log del intento y si por alguna razón no está corriendo (¿reboot reciente? ¿problema de ejecución? ¿detención manual?) lo reinicia.
La función de lock/reset está implementada, justamente,  como un apoyo a la operación regular del baliza, pues si apagamos la baliza para hacer una prueba el crontab que así está programado intentará cada minuto y lo lanzaría de vuelta, el lock hace que si eso ocurre la baliza no arranque hasta que se dé el reset.

/home/pi/whisper/whisper stop (para detener el beacon)
/home/pi/whisper/whisper lock (para detenerlo y establecer un "lock").
/home/pi/whisper/whisper reset (para eliminar el "lock" y dejar que pueda ser lanzado)

El script es, por lo tanto,  "re-entrante" y "re-usable" condición que permite que a pesar que esté corriendo permanentemente, su lógica es tal que cuando comienza revisa si ya está corriendo el programa principal, y si lo está termina, y si no lo está queda ejecutando. Debido a ésta forma de funcionar  cuando el sistema arranca, bastará que transcurra un minuto para que lance la baliza a funcionar. Y lo repetirá cada minuto luego, solo para detectar que ya está funcionando y terminar. La información que el script va registrando en términos de temperatura, tensión, estado del disco (tarjeta SD en realidad), uso de CPU y condición de "throttling" (restricción de la velocidad de la CPU) es muy útil para gestionar un dispositivo que está funcionando no atendido durante 24 horas.
En el estado actual el script no hace nada con esa información otra que registrarlo, pero no sería descabellado con modificaciones simples que tome acciones de gestión. Por ejemplo si sube la temperatura espaciar las transmisiones o directamente apagar el transmisor, si la tensión no es estable lo mismo o incluso apagar la placa (sudo shutdown -h now); no es muy extenso de desarrollar y permite mucha experimentación.
En la gestión diaria he encontrado útil introducir un reboot diario, usualmente en horas de la madrugada que no hay gran propagación de todas formas para que "limpie" los procesos que se estuvieran ejecutando, borre los espacios temporarios y otras actividades de "limpieza" de la placa que ocurren automáticamente al hacer reboot.
El alcance de la baliza es sorprendente, los reportes que se hacen de el en WSPRNet siempre contienen alguna sorpresa. La siguiente es una mañana típica incluye muchas estaciones de Europa, Norteamérica y de tanto algunas francamente exóticas de Africa, Asia u Oceanía.
¡Realmente da alegría y orgullo lograr semejantes distancias con tan pocos recursos!

2 comentarios:

  1. Excelente !!.

    Alguna ayuda con el filtro Pi casero y la aislación eléctrica mínima con la antena ??. Por ahora el presupuesto HAM está agotado y quiero probar con la versión tercermundista de 10 mW.

    Quedo QAP.

    Gustavo - LU2JGP

    ResponderEliminar
  2. El filtro es un PI pasabajos, https://www.dk0tu.de/blog/2016/05/28_Raspberry_Pi_Lowpass_Filters/
    Aqui hay algo interesante. Pero buscando por "raspberry pi" "rpitx" "low pass filter" salen varios diseños para distintas bandas. 73 de Pedro LU7DID

    ResponderEliminar