Rattlegram: experimentos con OFDM

Introducción

OFDM es una modulación digital empleada profusamente desde hace algunas décadas debido a su robustez en canales con distorsión. Se basa en emitir no una sino muchas portadoras espaciadas tanto como la frecuencia a la que se modula cada una. Sin alargarme ni profundizar diré que permite aprovechar la capacidad de un canal de comunicación aunque éste no sea plano, es decir, aunque tenga diferente respuesta dentro de su anchura. Por ello es ventajoso en canales no ideales como ADSL, TDT, DAB, telefonía de 4ª y 5ª generación o Wi-Fi. Como inconvenientes, es una modulación más compleja que requiere un procesamiento más potente por parte del módem. Además, la multiplicidad de portadoras origina una potencia de pico bastante superior a la potencia media, y esto dificulta la electrónica de amplificación. En el ámbito amateur no se utiliza mucho por las dificultades antes mencionadas. Lo emplea el software VARA y su éxito ha sido reconocido, si bien ese programa tiene algunas limitaciones.

Proyecto Ribbit

Un discreto grupo de personas ha desarrollado un software de código abierto para comunicaciones OFDM de baja velocidad sobre radio. La web pública del proyecto es https://www.ribbitradio.org/ y se presenta como «A new digital text messaging mode for HF/VHF/UHF recreational and emergency communications». También hay otra web del proyecto en https://www.aicodix.de/cofdmtv con detalles técnicos que parece ser más antigua pero enlaza otras aplicaciones de Android. Así mismo se puede leer una breve presentación que explica cómo funcionaría el sistema de mensajería Ribbit, aún en desarrollo. Este documento me parece muy interesante y recomiendo su lectura, además es fácilmente comprensible.

He probado la aplicación para móviles (Android e IOS) Rattlegram que me ha gustado mucho.

Portada de Rattlegram en google play

La app es gratuita, no recoge datos personales, y resulta extremadamente sencilla de manejar. Dispone de parámetros ajustables pero funciona con los que trae de origen. Emite mensajes por el altavoz del móvil y puede decodificarlos desde el micrófono.

Rattlegram, compose message

Esto también puede hacerlo por ejemplo APRSDroid pero es una aplicación más compleja de manejar, orientada específicamente a radioaficionados que deseen hacer APRS, y utiliza la vieja modulación BELL 202, que no aprovecha todas las posibilidades de un canal de voz por radio y debe acoplarse mediante cables de audio, no acústicamente. Mediante Rattlegram podemos enviar breves mensajes acoplando el audio de un teléfono móvil a un talkie. La modulación OFDM soporta la distorsión y corrige errores gracias a la codificación de canal FEC.

Chat desde PC

Acostumbrados a una plétora de programas de PC para comunicaciones digitales por radio a través de tarjeta de sonido (para RTTY, PSK31, FT8, etc), un teléfono móvil resulta una interfaz limitada. No existe de momento una aplicación equivalente para ordenador personal. Hay un software para Linux disponible en este repositorio. En esencia consiste en dos comandos, encode y decode, que transforman un texto en audio y viceversa. No es un programa que permita charla de teclado a teclado ni dispone de una interfaz gráfica.

Ese vacío lo cubre, aunque sea provisionalmente, pero de forma muy apañada, un colega radioaficionado indonesio que lo ha publicado en este otro repositorio github. Es una idea en mi opinión original y acertadísima por su oportunidad y simplicidad.

La instalación del módem OFDM de Aicodix desde Github puede resultar difícil. Apunto aquí el proceso que seguí yo.

En primer lugar, asegurémonos de tener las dependencias:

sudo apt update
sudo apt install build-essential clang-15 clang libc++-15-dev libc++abi-15-dev

Existen dos ramas o branch del software modem. La principal o master y la short. Por defecto está activa la primera, pero no es compatible con la app Rattlegram. Para ello debemos instalar la que nos interesa. Desde la línea de comandos de nuestro Linux, ejecutar:

git clone -b short --single-branch https://github.com/aicodix/modem.git
git clone https://github.com/aicodix/dsp.git
git clone https://github.com/aicodix/code.git
cd modem
make

Si se compila sin errores tendremos dos ejecutables: encode y decode.

El siguiente paso es instalar los scripts de YD1RUH. De nuevo:

git clone https://github.com/YD1RUH/OFDM_chat
Podemos seguir literalmente las instrucciones de la web y copiar esos ejecutables a la carpeta del script o bien crear enlaces simbólicos:
ln -s modem/encode OFDM_chat/encode
ln -s modem/decode OFDM_chat/decode

Los scripts RUN y LISTEN son ingeniosos y sencillos de entender. LISTEN se basa en que el programa rec del paquete sox puede ejecutarse pero no grabar nada hasta detectar cierta amplitud de audio, y cuando vuelva el silencio, terminar. Esto se ejecuta en un bucle infinito y tras cada captura de sonido se intenta decodificar. El script RUN está esperando datos del teclado y cuando se pulsa codifica el texto en un wav, activa el PTT de la emisora mediante hamlib, reproduce el audio, desactiva el PTT, y vuelve al inicio. Emplear una emisora conectada al PC con cables de audio y CAT serie es mucho más estable y fiable que acoplar las señales por altavoz y activar el PTT por vox o a mano. Con estos scripts se puede, precariamente, realizar QSOs de teclado a teclado con otra estación igual o con la app de móvil Rattlegram.

La forma de operar es abrir tres consolas. En ellas lanzar:

  • bash RUN.sh
  • bash LISTEN.sh
  • tail -f process/message.txt

Antes de ejecutar RUN habría que lanzar el demonio rigctld para comunicar con la emisora por puerto serie. Si tenemos una FT-817 en USB0 a 38400 baudios sería así:
rigctld -m 1020 -r /dev/ttyUSB0 -s 38400 &

Hay que tener presente que la demodulación no se completa hasta que el programa rec no detecta silencio. Por lo tanto no funciona con el squelch abierto, a diferencia de Rattlegram. El transmisor no comprueba si el squelch está abierto o no, simplemente transmite en cuanto mandas un mensaje.

Acceso web a los mensajes

Cualquier señal de radioaficionados puede ser compartida a través de internet. La voz por echolink, el APRS por APRS-IS, los reportes de FT-8 o WSPR en pskreporter. Los mensajes recibidos por este programa ya los tenemos guardados en un fichero de texto. Sería sencillo compartirlos con todo el mundo por internet, por ejemplo mediante un servidor http local. Yo he usado lighttpd por su sencillez.

Siguiendo las instrucciones de http://gines.sytes.net/raspi/lighttpd.html hice esto:
sudo chown www-data:www-data /var/www/html
sudo chmod 775 /var/www/html
sudo usermod -a -G www-data

Siendo «usuario» el que tengamos en nuestro sistema.

Editar el fichero de configuración:
sudo joe /etc/lighttpd/lighttpd.conf
Para incluir las líneas:
server.username = "www-data"
server.groupname = "www-data"
index-file.names = ("index.html", "index.lighttpd.html", "index.php")

El servicio se lanza con:

sudo systemctl start lighttpd

Y para habilitarlo automáticamente en cada reinicio:

sudo systemctl enable lighttpd

Ahora, queremos ver en la web el fichero de mensajes. Una forma sencilla es con un enlace simbólico:
ln -s ~/OFDM_servidor/process/message.txt /var/www/html/OFDM.txt

Podremos ver el fichero desde nuestro ordenador en la url http://localhost/OFDM.txt. Podemos configurar nuestro router doméstico para que redireccione el puerto 80 al ordenador donde funciona el servidor. También sería conveniente configurarle un DNS dinámico para poder encontrarlo mediante el nombre de host y no la dirección IP. Todo esto sólo tiene sentido si el operador de internet nos proporciona una IP pública y no una de CG-NAT.

El log de mensajes se puede entender mejor si insertamos la hora junto a cada mensaje y saltos de línea entre ellos. Pero no se puede insertar en cada iteración del bucle while, porque éste se ejecuta cada vez que el rec detecta amplitud, por ejemplo porque un ruido abre el squelch, aunque no haya mensaje. Se puede modificar el script LISTEN de esta manera.

Donde había:
iconv -f us-ascii -t utf-8 process/un.txt -c -o process/output.txt
clear
cat process/output.txt >> process/message.txt

Sustituir por:
iconv -f us-ascii -t utf-8 process/un.txt -c -o process/output.txt
clear
#Obtain number of chararacters in latest message
chars=$(wc -m process/output.txt | cut -d " " -f 1)
#Add a timestamp to the output only if there was an actual message
if [ $chars -gt 1 ]
then
date >> process/output.txt
echo -e "\n" >> process/output.txt
cat process/output.txt >> process/message.txt
fi

Por último, para no desgastar el disco duro escribiendo una y otra vez en el mismo sitio, podemos emplear un disco ram para el directorio process:
mkdir process_ram
mount -t tmpfs -o size=1m tmpfs process_ram/
sudo mount -t tmpfs -o size=1m tmpfs process_ram/
ls -l
sudo umount process_ram

Habría que editar los scripts para que usasen el nuevo directorio.

Siguientes pasos

Rattlegram seguro que puede funcionar a través de repetidores de FM. Esto amplía la cobertura y la cantidad de colegas a los que llegamos. En Madrid hay numerosos repetidores y la mayor parte del tiempo no tienen uso. Si bien su fin es la voz y no comunicaciones digitales, un experimento puntual no impide su uso para voz.

La app de móvil puede funcionar como digi-repetidor. Tiene la ventaja de que regenera los mensajes y los vuelve a emitir corrigiendo bits erróneos, si los hubiera. El móvil tendría que conectarse a una radio con vox o bien hacerlo con un circuito electrónico. En PC seguramente se podrían enlazar los scripts de recepción y transmisión para re-emitir el mismo mensaje.

La app Ribbit, aún en desarrollo, promete hacer esto de manera automatizada, y con un protocolo elaborado, como adelantaban en la presentación. Parece que será una aplicación similar al APRS, más orientada a un chat local o emergencias, técnicamente muy superior a APRS y AX.25, y a la vez sin ninguna barrera de entrada ni coste de material.