jueves, 14 de febrero de 2019

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

Si bien hay un "ecosistema" de aplicaciones derivadas, complementarias y especializada el grueso de la actividad en modos digitales de señales débiles (weak signal) gira alrededor del uso del programa de Joe Taylor (K1JT) [aqui] llamado wsjt-x y cuya versión mas actualizada al momento de ésta entrada es 2.0.0. Tengo el programa instalado y actualizado periódicamente en la PC de mi estación donde hago contactos frecuentemente en estos modos. Pero al mismo tiempo vengo llevando adelante una iniciativa para tener una baliza/estación de escucha de WSPR (Weak Signal Propagation Report, Reporte de Propagación de Señales Débiles) permanente y que funcione con la mejor disponibilidad posible. Y para eso nada mejor que tratar de implementar todo el proyecto alrededor de la plataforma Raspberry Pi, proyecto que terminó siendo muy desafiante y rico en aprendizajes.

Esta entrada y las siguientes dan cuenta de los apuntes tomados durante la experiencia, en ellos trataré de expresar las ideas en la secuencia de implementación que ahora, con el "diario del lunes" de todas las idas, vueltas y callejones sin salida, parece es la forma mas directa de desplegarlo (y no necesariamente el orden en que hice las cosas).

Algunas pruebas rápidas me permitieron estar seguro que el programa wsjt-x mismo puede correr en la plataforma Raspberry Pi. No es novedad, misterio ni gran logro pues está reportado en muchos sitios en Internet y en la página hay una versión específicamente para Raspbian a nivel imagen [aqui] además de, por supuesto, poder construir la aplicación desde los fuentes  [aqui], como por otra parte siempre es preferible cuando sea posible.

Antes de eso, por supuesto, tenemos que tener una placa Raspberry mod 2 o 3 configurada y andando, en general una tarea fácil aunque hay algunas veces que problemas simples dan algo de pelea, no es dentro del alcance de ésta serie abundar en detalles sobre como hacerlo pues hay una enorme cantidad de recursos en Internet que pueden ser de ayuda [video].

En las pruebas que hice tanto la Raspberry Pi (o RBPi) 2 como la 3 han funcionado bien, obviamente cuanto mas potente , lo que se mide en términos de reloj, de memoria y de espacio en SD Card, mejor es. La mayor parte de los experimentos en ésta serie fueron realizados con una RBPi Mod 2 B (900 MHz) y varias Mod 3 (1.2 GHz).

Una vez que el RBPi está andando y configurado, que le hemos puesto la imagen que nos gusta como fondo de pantalla, explorado un poco el vecindario y bajado cosas que no tienen nada que ver (pero son divertidas) empezamos con nuestra materia. Hay dos formas de instalar el programa wsjt-x; la rápida y la divertida.

Empecemos por la rápida. Siguiendo el link anterior desde la RBPi (usando Chromium como browser) bajar el archivo de distribución para el ambiente Raspbian (un archivo que llamará en el estilo de wsjtx_X.X.X_armhf.deb con X.X.X siendo la versión corriente, al momento de ésta entrada es 2.0.0), al hacerlo se descargará en el directorio "Downloads". Al finalizar la descarga ir con el explorador de archivos y hacer "click" en el archivo bajado, nos pedirá la verificación con password y lo instalará. El programa wsjtx estará disponible en la opción "Sonidos y Video", pero en ocasiones dependiendo de la configuración puede terminar en otra parte. Arrancando el programa tendremos la posibilidad de configurarlo, por ahora no mucho mas que establecer la señal distintiva y el QTH locator.

También se puede construir el programa desde los fuentes, lo que tardará un poco mas pero será mucho mas didáctico. La construcción de programas desde los fuentes es la forma mas efectiva de estar en razonable control de lo que estamos creando, pero requiere paciencia y ser riguroso en no omitir pasos, alterar el orden o indicar todas las opciones necesarias.

Instalar WSJT-X

Para construir desde fuentes habrá que construir primero el paquete HamLib y luego el wsjt-x, si bien el Raspbian Jezzy ya viene con el primero está normalmente muy  fuera de nivel y termina conveniendo instalarlo desde cero. Los pasos, que se ejecutan en la misma placa RBPi,  son:

Paso 1 - Instalar pre-requisitos

cd /home/pi
sudo apt-get update
sudo apt-get install -y cmake
sudo apt-get install -y asciidoctor
sudo apt-get install -y asciidoc
sudo apt-get install -y gfortran
sudo apt-get install -y subversion
sudo apt-get install -y libwxgtk3.0-dev
sudo apt-get install -y libusb-1.0-0-dev
sudo apt-get install -y portaudio19-dev
sudo apt-get install -y libsamplerate0-dev
sudo apt-get install -y libasound2-dev
sudo apt-get install -y libao-dev
sudo apt-get install -y libgsm1-dev
sudo apt-get install -y libsndfile1-dev
sudo apt-get install -y libjpeg9-dev
sudo apt-get install -y libxft-dev
sudo apt-get install -y libxinerama-dev
sudo apt-get install -y libxcursor-dev
sudo apt-get install -y libboost-all-dev
sudo apt-get install -y libqt5multimedia5
sudo apt-get install -y libqt5multimedia5-plugins
sudo apt-get install -y libqt5multimediaquick-p5
sudo apt-get install -y libqt5multimediawidgets5
sudo apt-get install -y libqt5serialport5-dev
sudo apt-get install -y libqt5svg5-dev
sudo apt-get install -y libqt5widgets5
sudo apt-get install -y libqt5sql5-sqlite
sudo apt-get install -y libqwt-qt5-dev
sudo apt-get install -y libudev-dev
sudo apt-get install -y qtmultimedia5-dev
sudo apt-get install -y libfftw3-dev
sudo apt-get install -y xsltproc
sudo apt-get install -y swig

Paso 2 - Bajar "tarballs" de fuentes (HamLib y wsjtx)

cd Downloads
wget http://physics.princeton.edu/pulsar/k1jt/wsjtx-2.0.0.tgz
wget https://sourceforge.net/projects/hamlib/files/hamlib/3.3/hamlib-3.3.tar.gz

Es posible que se tenga que revisar cual es el último nivel de ambos programas pues el mismo puede variar al momento de ejecutar éstas instrucciones.

Paso 3 - Construir HamLib (tarda bastante)

cd /home/pi
sudo apt-get remove libhamlib2
cd Downloads
tar -zxvf hamlib-3.3.tar.gz
cd hamlib-3.3
./configure --prefix=/usr/local --enable-static
make
sudo make install
sudo ldconfig
cd ..

Paso 4 - Construir wsjt-x (tarda aún mas)

cd /home/pi
tar -zxvf Downloads/wsjtx-2.0.0.tgz 
cd wsjtx-2.0.0/src/
tar -zxvf wsjtx.tgz 
mkdir build
cd build
cmake ../wsjtx
make
sudo make install
cd ~

Al finalizar estos pasos debería quedar instalado el programa el cual puede accederse tanto desde el menú como tipeando "wsjtx" en una consola.
Es conveniente para la construcción utilizar "scripts BASH", eso ocurre porque hay que ser muy meticuloso en las acciones y la secuencia de comandos y por otra parte es bastante común tener que repetir la instalación  (scripts de pre-requisitos, construcción de hamlib y construcción de wsjtx).

Usando WSJT-X

El programa wsjtx espera recibir sonido tal como el entregado por un transceptor sintonizando en USB sobre las frecuencias que correspondan a los modos que se desea recibir, por ejemplo en 20 metros FT-8 usará 14.074 MHz mientras que WSPR 14.0956 MHz. El programa cuando se lo ejecuta indica en que frecuencia debe sintonizarse, y si configuramos un CAT lo hará automáticamente.

La placa Raspberry tiene sonido, pero solo de salida, no de entrada. Es necesario instalar algún dispositivo ALSA (Advanced Linux Sound Architecture).

El requisito que suena complicado pero en realidad se soluciona en forma relativamente fácil con un dispositivo de sonido USB, el cual se conectará con el transceptor de la estación. Sin embargo en mi configuración tomé una ruta un poco mas complicada (y específica de mi estación), lo contecté a mi transceiver SDR mcHF, el cual tiene una configuración de conexión USB que se presenta al procesador como un puerto serie y una placa de sonido. Gran misterio gran, ¿como se llevarían una placa Raspberry con un mcHF?

En el caso del transceiver mcHF la página de DF8OE [link] es un recurso imprescindible, la documentación anticipa que conectando el cable USB a uno de los puertos disponibles en la RBPi lo reconocerá inmediatamente, ya así ocurrió. Con el comando aplay -l se pueden ver las placas de sonido instaladas y allí el transceiver está listado como una placa de sonido (plugHW:CARD=mcHF,DEV=1) y el puerto serie para comando está disponible como /dev/ttyACM0.

Para quienes no tengan  un mcHF se conecta un "dongle" de soundcard USB (y se verifica que lo reconozca también con aplay -l) y se conecta por separado un puerto serie USB (tipo Prolific) el que también es reconocido como /dev/ttyACM0 usualmente.

Esos son los dispositivos que se utilizarán posteriormente para configurar, es mas cómodo el primero (para el que tiene un mcHF en particular) pero el segundo también funciona.

En realidad, para comenzar no hace falta ninguna otra cosa que disponer de audio, el no poder controlar la frecuencia del transceptor no es un gran problema pues los modos digitales de señales débiles se sintonizan en un solo canal y todos los contactos ocurren en el. Para transmitir se puede utilizar el sistema VOX, no es lo ideal pero funciona.

Finalmente es útil poder controlar via CAT (Computer Aided Tuning) al transceptor desde wsjt-x, y cuando éste se encuentra habilitado también se puede tener PTT (Push to Talk) por esa vía (no hace falta un dispositivo de hardware para hacerlo).



Puedo ser incluso mas detallista y utilizar el manipulador y PTT por puerto serie a partir de un puerto Prolific USB y con un circuito muy simple [ver sitio de  lu9dpd] operar el PTT del transmisor e incluso, ahora si, controlar la frecuencia y modo mediante CAT. La instalación del puerto serie no tiene ningún misterio (hay links para hacerlo) , al igual que la placa de sonido USB basta enchufarlo en uno de los slots USB que tiene el RBPI para que sea reconocido y puesto como disponible.

Voila! En el aire!

Todos los modos digitales de señales débiles requieren un reloj sumamente preciso, puede usarse al efecto un receptor GPS, pero si de dispone de Internet es preferible sincronizar el reloj de la placa periódicamente con el uso del protocolo NTP. Para eso hay que instalar el paquete ntp que consulta los servidores de protocolo NTPD.

sudo apt-get install ntp

Al instalarlo se sincronizará periódicamente, pero si quisiéramos forzarlo podemos hacerlo ejecutando:

sudo /etc/init.d/ntp stop >> ntpd.sync.log
sudo ntpd -q -g >> ntpd.sync.log
sudo /etc/init.d/ntp start >> ntpd.sync.log
echo 'date' " ntpd sync completed " >> ntpd.sync.log

Una vez instalado se puede utilizar wsjtx para cualquiera de los modos que soporta, primariamente la experimentación inicial está destinada a implementar el receptor de la baliza (beacon) WSPR para transformarlo en un monitor WSPR.
Una vez instalado y funcionando el programa wsjtx se puede usar con todos los modos que soporta, por eso si bien la instalación inicial tenía por proposito usarlo en WSPR hice también  numerosos contactos en FT8 con potencias muy bajas, si bien el mcHF entrega hasta 10W de potencia rara vez lo he usado mas que a 5W, lo que me permite contactos regionales con facilidad y con buenas condiciones de propagación algunos DX muy interesantes. No es para nada casualidad la revolución que está causando FT8, con el nivel de propagación pésima que hay poder realizar los DX que se hacen no es poca cosa.

Toda ésta configuración la hice en una placa dedicada (bcrux) configurada "fresca" desde cero, pues siempre se corre el riesgo cuando se está experimentando de romper algo con las idas y vueltas para luego encontrarnos con comportamientos erráticos que no se deben a lo que estamos haciendo sino a alguna otra cosa (normalmente diferencias de nivel entre los paquetes utilizados). Como toda máquina siempre es útil y efectivo dedicar algún esfuerzo para implementar ciertas rutinas de  backup, recovery y housekeeping, por supuesto no daña implementarlos en ésta placa aunque la capacidad disponible supere en mucho a lo que realmente utilizaremos con ésta configuración. En particular si es algo que vayamos a dejar prendido permanentemente, o por lo menos está hecho con ésta intención.

Una nota de atención, es importante configurar que guardará wsjt-x mientras es operado, dependiendo de que alternativa se utilice en la opción "save" del wsjt-x pueden generarse varios GBytes de información de sonido (.WAV) en muy poco tiempo de uso, y el espacio de "disco" (tarjeta SD) en la placa no es tan grande; es necesario por lo tanto tener desactivada la opción o introducir algún modo de mantenimiento que elimine los archivos mas viejos periódicamente. Un script sencillo para eliminar los archivos mas viejos puede ser:

for f in $(ls -La /home/pi/*.log | head -n 1); do sudo rm -r $f; done

Donde debe reemplazarse "/home/pi/" por el path donde estén los archivos a depurar.

Otro punto importante es asegurarse que la "profundidad" de análisis de wsjtx está puesta en "Normal" o incluso "Rápido", la RBPi es una placa noble pero no tiene el músculo de procesamiento para manejar cómodamente el modo "Profundo" (al menos la RBPi 2).
Al finalizar el proyecto seguramente reflexionaremos que no hay una "ganancia" demasiado exagerada en esta configuración, nada que no hubiéramos podido implementar en forma mucho mas sencilla directamente conectando el transceptor a nuestra PC (si es que ya no lo estaba); pero claro, esta parte del proyecto en realidad no es mas que realizar la configuración inicial de la RBPi y su puesta en marcha, y estar seguro que instalamos wsjt-x de la forma mas sencilla posible, cosa que si no anda podamos estar razonablemente seguros de que pasó y como arreglarlo, puesto que si instalamos muchas cosas al mismo tiempo es quizás luego dificil saber donde está el problema.

Con un proyecto tan polifacético como éste no puedo sino recordar con asombro el cuento de Borges denominado "El Aleph".

No hay comentarios:

Publicar un comentario