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

Publicado por Marc Corretge en

Proyecto creado por haslettj (ver proyecto en instructables) 

El proyecto original es de hace unos años y hay enlaces que no funcionan, aquí pondré los enlaces buenos y funciones mejoradas.

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: @@[email protected]@@@
Longitude: @@[email protected]@@@
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.


3 commentarios

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

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

Deja un comentario

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