Raspberry Pi – Receptor de imágenes meteorológicas desde los satélites NOAA

Publicado por Marc Corretge en

Proyecto creado por haslettj (enlace del proyecto) 

El proyecto original es de hace unos años y hay enlaces que no funcionan, aquí pondré los enlaces buenos y funciones mejoradas. (Última actualización: Agosto-2019, puede ser que algún enlace haya quedado obsoleto)

Este proyecto lo que nos permitirá es recibir y procesar las imágenes meteorológicas desde los satélites NOAA automáticamente cada vez que pasen por encima nuestro. Para hacer este proyecto previamente necesitaremos una antena QFH (Ver tutorial para hacerte tu propia antena QFH en casa), aparte de la antena también necesitaremos:

Para poder realizar este tutorial bien se necesitan tener conocimientos básicos de Linux.

Supondremos que ya tenemos la RaspberryPi corriendo con Raspbian, sino deberéis buscar algún otro tutorial por Internet sobre como inicializar una RaspberryPi.

Actualización de la Raspberry Pi

sudo apt-get update
sudo apt-get upgrade
sudo reboot

Instalación del Software necesario

sudo apt-get install libusb-1.0
sudo apt-get install cmake
sudo nano /etc/modprobe.d/no-rtl.conf

Se nos abrirá un archivo, copiaremos en él las siguientes lineas:

blacklist dvb_usb_rtl28xxu
blacklist rtl2832
blacklist rtl2830

Para guardar y cerrar el archivo, haremos CONTROL+O y luego CONTROL+X

cd ~
git clone https://github.com/keenerd/rtl-sdr.git
cd rtl-sdr/
mkdir build
cd build
cmake ../ -DINSTALL_UDEV_RULES=ON
make
sudo make install
sudo ldconfig
cd ~
sudo cp ./rtl-sdr/rtl-sdr.rules /etc/udev/rules.d/
sudo reboot
sudo apt-get install sox
sudo apt-get install at
sudo apt-get install predict
cd ~
wget https://marccorretge.com/share/wxtoimg/wxtoimg-armhf-2.11.2-beta.deb
sudo dpkg -i wxtoimg*.*
#sudo apt-get install alsamixergui

Probando el Software instalado

sudo rtl_test

Nos debería aparecer algo parecido a:

Found 1 device(s):
  0:  Realtek, RTL2838UHIDIR, SN: 00000001

Using device 0: Generic RTL2832U OEM
Found Rafael Micro R820T tuner
Supported gain values (29): 0.0 0.9 1.4 2.7 3.7 7.7 8.7 12.5 14.4 15.7 16.6 19.7 20.7 22.9 25.4 28.0 29.7 32.8 33.8 36.4 37.2 38.6 40.2 42.1 43.4 43.9 44.5 48.0 49.6 
Sampling at 2048000 S/s.

Info: This tool will continuously read from the device, and report if
samples get lost. If you observe no further output, everything is fine.

Reading samples in async mode...

Si es que no, parad aquí, revisar que este todos los pasos anteriores realizados.

Si aparece algo muy parecido o igual, seguimos.

predict

La primera vez nos pedirá que introduzcamos datos sobre la localización, una vez introducidos, si nos da algún error, introduciremos el siguiente código, si después de introducir las coordenadas nos aparece el menú del programa podremos saltarnos el siguiente cuadro de comandos.

cd ~/.predict
rm -rf *.*
wget https://marccorretge.com/share/predict/predict.db
wget https://marccorretge.com/share/predict/predict.qth
wget https://marccorretge.com/share/predict/predict.tle

Después de introducir estas lineas ya debería funcionar, probamos a ejecutar predict, nos pedirá las coordenadas y luego ya debería salir el menú. Podemos seguir.

wxtoimg

Si poner wxtoimg da error, probad de poner:

xwxtoimg &

La primera vez pedirá aceptar las condiciones, solo hace falta escribir YES.

Ahora deberemos crear un archivo donde deberemos introducir las coordenadas de donde se va a encontrar la antena. Si las coordenadas son NORTE o ESTE el numero sera +, si estamos al SUR o OESTE pondremos coordenadas -. Por ejemplo 32N 2W –> Latitude: 32 y Longitude: -2

sudo nano ~/.wxtoimgrc

Igual que antes, copiaremos el siguiente texto, sustituyendo las @@ por nuestros datos, una vez hecho para guardar y cerrar igual que antes CONTROL+O y CONTROL+X

Latitude: @@.@@@@
Longitude: @@.@@@@
Altitude: @@@

Los Scripts

Para automatizar todas las tareas necesitaremos que unos programas llamados «Scripts» hagan el trabajo por nosotros.

cd ~
mkdir weather
cd weather
mkdir predict
cd predict 

Ahora deberemos crear 3 Scripts, los 3 se hacen de la misma forma. Empezaremos por el primero y luego los otros 2 se harán de la misma forma.

sudo nano schedule_all.sh
// COPIAREMOS DENTRO DEL ARCHIVO TODO LO QUE VIENE A CONTINUACIÓN //
-------------------------------------

#!/bin/bash

# Update Satellite Information

wget -qr https://www.celestrak.com/NORAD/elements/weather.txt -O /home/pi/weather/predict/weather.txt
grep "NOAA 15" /home/pi/weather/predict/weather.txt -A 2 > /home/pi/weather/predict/weather.tle
grep "NOAA 18" /home/pi/weather/predict/weather.txt -A 2 >> /home/pi/weather/predict/weather.tle
grep "NOAA 19" /home/pi/weather/predict/weather.txt -A 2 >> /home/pi/weather/predict/weather.tle
grep "METEOR-M 2" /home/pi/weather/predict/weather.txt -A 2 >> /home/pi/weather/predict/weather.tle



#Remove all AT jobs

for i in `atq | awk '{print $1}'`;do atrm $i;done


#Schedule Satellite Passes:

/home/pi/weather/predict/schedule_satellite.sh "NOAA 19" 137.1000
/home/pi/weather/predict/schedule_satellite.sh "NOAA 18" 137.9125
/home/pi/weather/predict/schedule_satellite.sh "NOAA 15" 137.6200

Ya hemos creado el primero los siguientes serán:

sudo nano schedule_satellite.sh
// COPIAREMOS DENTRO DEL ARCHIVO TODO LO QUE VIENE A CONTINUACIÓN //
-------------------------------------

#!/bin/bash
PREDICTION_START=`/usr/bin/predict -t /home/pi/weather/predict/weather.tle -p "${1}" | head -1`
PREDICTION_END=`/usr/bin/predict -t /home/pi/weather/predict/weather.tle -p "${1}" | tail -1`


var2=`echo $PREDICTION_END | cut -d " " -f 1`

MAXELEV=`/usr/bin/predict -t /home/pi/weather/predict/weather.tle -p "${1}" | awk -v max=0 '{if($5>max){max=$5}}END{print max}'`

while [ `date --date="TZ=\"UTC\" @${var2}" +%D` == `date +%D` ]; do

START_TIME=`echo $PREDICTION_START | cut -d " " -f 3-4`
var1=`echo $PREDICTION_START | cut -d " " -f 1`

var3=`echo $START_TIME | cut -d " " -f 2 | cut -d ":" -f 3`

TIMER=`expr $var2 - $var1 + $var3`

OUTDATE=`date --date="TZ=\"UTC\" $START_TIME" +%Y%m%d-%H%M%S`

if [ $MAXELEV -gt 19 ]
  then
    echo ${1//" "}${OUTDATE} $MAXELEV

    echo "/home/pi/weather/predict/receive_and_process_satellite.sh \"${1}\" $2 /home/pi/weather/${1//" "}${OUTDATE} /home/pi/weather/predict/weather.tle $var1 $TIMER" | at `date --date="TZ=\"UTC\" $START_TIME" +"%H:%M %D"`

fi

nextpredict=`expr $var2 + 60`

PREDICTION_START=`/usr/bin/predict -t /home/pi/weather/predict/weather.tle -p "${1}" $nextpredict | head -1`
PREDICTION_END=`/usr/bin/predict -t /home/pi/weather/predict/weather.tle -p "${1}"  $nextpredict | tail -1`

MAXELEV=`/usr/bin/predict -t /home/pi/weather/predict/weather.tle -p "${1}" $nextpredict | awk -v max=0 '{if($5>max){max=$5}}END{print max}'`

var2=`echo $PREDICTION_END | cut -d " " -f 1`

done
sudo nano receive_and_process_satellite.sh
// COPIAREMOS DENTRO DEL ARCHIVO TODO LO QUE VIENE A CONTINUACIÓN //
-------------------------------------

#!/bin/bash

# $1 = Satellite Name
# $2 = Frequency
# $3 = FileName base
# $4 = TLE File
# $5 = EPOC start time
# $6 = Time to capture

sudo timeout $6 rtl_fm -f ${2}M -s 60k -g 45 -p 55 -E wav -E deemp -F 9 - | sox -t wav - $3.wav rate 11025

PassStart=`expr $5 + 90`

if [ -e $3.wav ]
  then
    /usr/local/bin/wxmap -T "${1}" -H $4 -p 0 -l 0 -o $PassStart ${3}-map.png

    #/usr/local/bin/wxtoimg -m ${3}-map.png -e ZA $3.wav $3.png
     /usr/local/bin/wxtoimg -m ${3}-map.png -e ZA $3.wav $3.png
     /usr/local/bin/wxtoimg -m ${3}-map.png -e NO $3.wav $3-normal.png
     /usr/local/bin/wxtoimg -m ${3}-map.png -e therm $3.wav $3-temp.png
     /usr/local/bin/wxtoimg -m ${3}-map.png -e HVCT-precip $3.wav $3-rain.png
     /usr/local/bin/wxtoimg -m ${3}-map.png -e MCIR $3.wav $3-ir.png
     /usr/local/bin/wxtoimg -m ${3}-map.png -e sea $3.wav $3-seaTemp.png
     /usr/local/bin/wxtoimg -m ${3}-map.png -e MCIR-precip $3.wav $3-rain.png



DIA=`date +"%Y-%m-%d"`
dDate=`date ,"%Y%m%d%"`
#HORA=`date +"%H-%M"`
#dHora=`date +"%H%M"`
mkdir /home/pi/weather/$DIA
#mkdir /home/pi/weather/$DIA/$HORA
mv /home/pi/weather/*$dDate*.* /home/pi/weather/$DIA

fi

Ya tenemos los 3 Scripts creados. El primero, schedule_all.sh se encargará de cada noche actualizar la base de datos para saber que satélites pasaran durante los días siguientes. El Script, schedule_satellite.sh calculará que satélites pasaran a una cierta altura, por lo tanto visibles (por nuestra antena) desde nuestra localización, si el satélite es visible pasara a la lista de satélites a recibir, con el siguiente Script, recive_and_process_satellite.sh se encargara de el día a la hora y minuto que le a dicho el Script Nº2 que pasará un satélite, este se encargare de grabar todo lo que emita para mas tarde poder procesarlo.

sudo chmod +x *.*

Ahora crearemos un Crontab que vendría a ser un programador de acciones, aquí le diremos que cada noche durante siempre, a la 1 de la noche ejecute el Script Nº1.

crontab -e

Nos pedirá que seleccionemos un editor, NANO en nuestro caso, copiamos la siguiente linea al final del archivo y guardamos y cerramos.

1 0 * * * /home/pi/weather/predict/schedule_all.sh

Si no queremos esperar a la 1am para saber que se ejecutara lo podremos hacer manualmente con:

/home/pi/weather/predict/schedule_all.sh

Comprobaciones

atq

Este comando nos indicara que satélites pasaran por encima nuestro, no quiere decir que los vaya a recibir.

Para ver las imágenes que hemos captado , las encontraremos todas en el siguiente directorio

cd ~/weather
ls -ls

Ahora ya tendríamos la RaspberryPi configurada, solo quedaría esperar a que pase un satélite para ver el resultado obtenido.

Aqui podemos ver unos ejemplos de las imagenes obtenidas.


15 comentarios

Josema · 9 octubre, 2019 a las 12:48

Gracias Marc.

    Marc Corretge · 9 octubre, 2019 a las 13:13

    Espero que le haya sido de utilidad 🙂

GreggGot · 16 octubre, 2019 a las 05:25

Хорошая статья

jose · 28 julio, 2020 a las 09:57

Buenos dias. Tengo una duda, en los script veo que se obtienen los keplerianos del satelite Meteor m2. En ningun sitio veo que se ponga la frecuencia de recepcion de este satelite (los noaa si). Me puedes explicar por que?.
Gracias.
Saludos.

    Marc Corretge · 2 agosto, 2020 a las 20:42

    Hola Jose, lamento no poderte ayudar. Yo solo uso los NOAA. Pero si necesita las frecuencias de los Meteor por internet los podrá encontrar fácilmente.

Manu · 29 enero, 2021 a las 02:22

Hola, en mi caso instalé otros drivers rtl, sino recuerdo mal de osmo… Ya que de esta manera mi SDR daba un error al arrancar. 😉 Un Saludo EA5INF

    Marc Corretge · 13 abril, 2021 a las 21:51

    Muchas gracias por el comentario. Seguro que será de ayuda a más gente 🙂

Felipe · 12 abril, 2021 a las 23:32

Hola Marc, como instalo el Wxtoimg?
Gracias!

David C. · 5 febrero, 2022 a las 17:51

Hola Marc,
Encara és vàlid aquest procés?
sudo rtl_test em diu comando no existe.
El Predict si que em demana les coordenades correctament però després el xwxtoimg & tampoc s’executa.
Tot i que els meus coneixements de Linux son molt limitats tinc una Raspberry Pi 3 Model B funcionant fent el seguiment de globus meteorològics, i m’agradaria que la mateixa Pi poques capturar les imatges dels Nooa autònomament ja que manualment amb windows ho faig sense problema.
Gracies per endavant.

    Marc Corretge · 14 marzo, 2022 a las 09:32

    Hola David,
    Lamentablement les Rasberry Pi, sol són capaç d’executar 1 programa alhora, no com en altres sistemes operatius que estem acostumats a treballar amb múltiples softwares simultàniament. La Raspberry no sap fer-ho (a no ser que els softwares estiguin preparats per treballar-hi), per tant, el més segur és que el problema sigui aquest.

David C. · 8 febrero, 2022 a las 15:38

Hola Marc,
Primero de todo gracias por el post.
He conseguido poner en marcha el receptor, de momento solo he conseguido recibir unos fragmentos muy pequeños de cada pase. Mis conocimientos de programación de scrpts son nulos.
El script graba el pase a partir de 0º de elevación o a partir de unos grados en concreto?
Saludos y muchas gracias.

    Marc Corretge · 14 marzo, 2022 a las 09:22

    Hola David,
    El programa empieza a grabar a partir del momento en que el satélite sea visible. Aunque dependiendo de la posición donde te encuentres, puede ser que hasta que el satélite no este a >45º no recibas nada (como en mi caso), que realmente las recibe, pero no con suficiente potencia para que la antena las detecte.
    Es normal recibir solo fragmentos pequeños, eso es debido a las interferencias que debe tener, piensa que la señal recibida es muy débil y cualquier señal cercana puede interferir.

Alberto · 2 marzo, 2022 a las 23:51

Hola, tengo una duda ya que mis conocimientos de Linux y Raspberry son muy pobres.
Instale todo desde Putty y en principio esta funcionando, y mi pregunta es, ¿si me desconecto de Putty, el programa sigue funcionando?
Muchas gracias por la ayuda

    Marc Corretge · 14 marzo, 2022 a las 09:13

    Hola Alberto,
    Efectivamente, Putty vendría a ser parecido a programas como TeamViewer que se usa en Windows. Cuando te conectas con Putty te estás conectando a la raspberry y todo lo que ejecutas en Putty, se ejecuta en la Raspberry. Puedes cerrar Putty y el programa seguirá funcionando igualmente.

Responder a Josema Cancelar la respuesta

Marcador de posición del avatar

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *