Home > Projects > Réception d'images satellites NOAA

Réception d'images satellites NOAA

⚪️ Compréhension du projet

Qui sont-ils

Les satellites NOAA (National Oceanic and Atmospheric Administration) sont des satellites météorologiques américains à orbite polaire qui sont à une altitude de 850km.
Pour comparer, l’ISS est à 400km.
A ce jour, il y en a 3 qui continuent d’émettre :

  • NOAA 15 à 137.6200MHz
  • NOAA 18 à 137.9125MHz
  • NOAA 19 à 137.1000MHz

Leur fréquence étant publique, n’importe qui avec le matériel adéquat peut recevoir leurs
images. Ils ne sont plus en période d’exploitation mais tant que la NASA considère qu’ils ne sont pas un danger, ils continuent de les laisser tourner.

Orbite héliosynchrone

Ces satellites ont une orbite circulaire qui les font passer d’un pôle à l’autre de La Terre.
Ils se présentent toute l’année sous le même angle par rapport au Soleil comme le montre l’image ci-dessous :
orbite
Ainsi, comme La Terre tourne sur elle même, le satellite peut balayer toute sa surface. Grâce à des logiciels ou sites web, on peut calculer ses orbites et prévoir le passage de chacun par rapport à des coordonnées géographiques.
Par exemple, voici une liste de prédictions des 3 satellites au dessus de la ville où est installée mon antenne le 22 avril 2024 :
prediction_pass

Transmission APT

Les NOAA ne prennent pas directement des photos de la Terre. Ils en font plutôt un scan comme le ferait un scanner papier à une vitesse de 2 lignes par seconde, donc c’est lent.
Pour cela ils vont utiliser le mode APT (Automatic Picture Transmission). Il date de 1960 et seules 3 satellites l’utilisent encore.
La qualité est de 4km pour 1 pixel donc il ne faut pas zoomer si non, c’est très moche.
Voici un exemple d’image transmise que j’ai reçu avec ce système :
image_reele
La transmission est composée de deux canaux d’images, des informations télémétriques et des données de synchronisation.

  • Le premier canal d’image est pris avec un capteur dans les longueurs d’onde visibles. (Un autre capteur peut être utilisé en fonction de la quantité de nuages).
  • Le second canal utilise un capteur infrarouge.
  • La bande à gauche de chaque image sont les données de synchronisation. En effet, en radio, les ondes peuvent faire des rebonds dans l’atmosphère ou sur d’autres obstacles. A terme, elles peuvent ne pas arriver dans le bon ordre jusqu’à l’antenne, donc ces bits sont là pour les remettre dans le bon ordre et être sûr qu’on reçoive le scan correctement.
  • Les 2 bandes à droite de chaque image sont les données télémétriques. Il s’agit d’informations envoyés concerant le satellite ainsi que des données pour la météo (C’est à ça qui sert après tout).
    Toutes ces données vont être envoyées ligne par ligne à l’horizontal.
    Avant d’être diffusées, les images recoivent des corrections géométriques permettant ainsi d’être exempt de la distorsion causée par la courbure de la Terre (Car la Terre n’est pas plate).
    Ainsi, avec ces deux images capturées, on peut obtenir d’autres types d’image. Par exemple, voici une image thermique générée par les deux images précédentes :
    image_thermique
    C’est grâce à ce genre d’image que les personnes dans la météorologie (pas moi) seront à même de prédire le temps qu’il va faire ⛈️.

    ⚪️ Mise en place du projet

    Partie matérielle

    Fabrication de l’anntenne

    Pour ce projet, j’ai décidé de partir sur une antenne V-dipôle.
    Comme on l’a vu sur la partie des antennes, pour que notre antenne soit résonnante à la fréquence de 137MHz, on peut faire le calcul suivant :
    \(λ=300/137≈2.18m\)

On va faire une antenne demi-onde donc elle devra faire une longueur de 2.18/2 soit 1.09m.
De plus, comme on fait un dipôle, on va devoir diviser à nouveau par 2 pour avoir la longueur de chaque pôle. Donc 1.09/2≈0.54. On sait à présent que chaque pôle devra faire 54cm pour être efficace au 137MHz.
Afin d’avoir une impédance de 50Ω, l’angle formé par les 2 pôles doit être de 120°. Voici un schéma qui reprend la même logique.
schema
Le raccordement entre les pôles et le câble se fait avec un domino. On relie la tige centrale du câble à l’un, et la tresse autour du câble à l’autre.
Premier test avec une antenne rateau trouvé en déchetterie que j’ai remodelé :
first_try
Lors de la réalisation de ce premier modèle, je n’avais pas encore connaissance de ce qu’était le rapport d’onde stationnaire (SWR) et je n’ai donc pas pu tester si c’était une bonne antenne à part en observant les résultats des images. Malheureusement, le résultat n’était pas très convaincant.
Je décide alors d’investir dans un testeur d’antenne qui me permettra de calibrer mes antennes.
Et c’est grâce à lui que je me rends compte que le SWR vaut 11 avec une impédance de 20Ω ce qui ne va PAS DU TOUT.
Le soucis ? Un pôle en touchait un autre ce qui faitait comme un court-circuit au final. On voit pas très bien sur la photo mais les pôles de l’antenne sont soutenues par un plus petit morceau d’aluminium (accroché avec les serflexs). Or cette pièce est en un seul morceau et est en contact avec les deux pôles…
Je décide alors de changer la conception de l’antenne en prenant cette fois-ci 2 tiges en cuivre (meilleure conductivité).
cuivre
On sort le testeur d’antenne et voici le résultat :
testeur_antenne
Le deux valeurs à prendre en compte sont

  • L’impédance -> R (Ω) qui est dans de 58Ω donc pas les 50Ω idéales mais relativement proche donc c’est cool.
  • Le rapport d’onde stationnaire -> VSWR qui doit être au plus proche de 1. Et là, 2.8, c’est pas terrible.

Je repars à la charge avec une troisième conception. Je récupère à nouveau à la déchetterie, une vieille antenne TV pour caravane. J’avais pas pensé de prendre de photos quand je l’ai récup donc voici une image de ce à quoi ça ressemblait :
antenne_caravane
Elle est pratique car on peut y visser les pôles et régler leur orientation ce qui nous facilite le travail pour le réglage de l’impédance. On fait donc un trou dans nos tubes de cuivre pour remplacer les deux morceaux qu’il y avait de base. On peut se servir de l’attache en métal à l’arrière pour la fixer à notre mas et voici à quoi ça ressemble à la fin :
final_antenna
En ce qui concerne la soudure, j’ai oublié de prendre en photo l’intérieur mais chaque tube de cuivre est soudé à un câble respectif qui lui même est déjà relié d’usine à la prise coaxiale dans le boitier. J’ai un peu redécoupé la partie blanche pour pas que ça fasse trop gros. Dans le boitier blanc, il y a déjà une prise coaxiale pour l’arrivée d’un câble. Donc on a plus qu’à venir visser notre cable coaxial dessus et on est tout bon.
On ressort le testeur d’antenne et voici le résultat final :
testeur_antenne

  • Le VSWR est très proche de 1 ce qui est vraiment pas mal pour le coup.
  • L’impédance de 42Ω n’est pas parfaite mais reste tout à fait correct.

    Placement et Orientation

    Les NOAA avec leur orbite polaire arrive soit par le nord soit par le sud. Par conséquant, on doit orienter l’antenne dans l’une de ses directions n’importe laquelle. Si on la place vers le nord alors que le satellite arrivait par le sud, on aura juste à retourner l’image. :)
    Voilà le rendu final de l’antenne sur le toit orienté plein sud dans mon cas :
    roof

    Raspberry

    Pour ce projet, j’utilise un Raspberry 4 model B qui tourne sur Raspbian lite OS en 64-bits. Il n’aura pas d’interface graphique afin d’éviter toutes fréquences parasites provoquées par la consommation du CPU et de la RAM à cause des composants graphiques.
    Ce dernier sera placé dans les combles dans un tupperware avec comme récepteur SDR la clé RTL-SDR V4. Il est relié par 11m de câble coaxial :
    tupperware

    Partie logicielle

    Github

    Au départ, j’avais réalisé mes propres scripts pour démarrer les enregistrements automatiquement en récupérant les positions de satellites pour calculer leur passage.
    En revanche, afin de me consacrer plus à la partie radio et avoir un code propre et très modulable, j’ai décidé d’utiliser ce dépôt Git qui va grandement nous être utile.
    Pour l’installation, on le clone sur le Raspberry, on édite un fichier settings.yml pour y mettre nos coordonnées géographiques ainsi que d’autres paramètres que l’on verra plus loin.
    On a plus qu’à lancer l’installation et nous voilà avec un site web affichant tous les passages prévus des satellites, un enrengistrement qui se lance automatiquement et une page Capture avec l’ensemble des images récupérées. Super pratique !

    Accès à distance

    A l’aide du dépôt Github précédemment cité, un serveur web nginx est créé en localhost sur le Raspberry.
    Ce dernier est configuré avec une adresse IP fixe et est donc accessible que depuis le réseau local.
    Afin d’y avoir accès depuis n’importe où, j’ai mis en place un serveur VPN avec Wireguard sur ma box Internet. Ainsi, tant que je dispose du fichier wireguard .conf, je peux accéder au réseau local et donc au Raspberry depuis n’importe où, y compris le téléphone !

    Prédiction

    On a un cronjob qui va se lancer chaque jour à 00h00. Il va s’occuper d’aller chercher les TLE (Two Lines Elements) des satellites en ligne. Il s’agit d’une représentation standardisée des paramètres oribtaux des objets en orbitre terrestre. C’est grâce à ces paramètres que l’on va pouvoir prédire à quelle heure un satellite va passer au dessus d’un point donné.
    Une fois récupérée, on a une base de donnée à jour contenant la position des satellites qui nous intéressent.
    Ainsi, on peut faire appel à l’outil predict qui comme son nom l’indique, va prédire le passage des satellites en sa basant sur les TLE, et sur une position géographique. Ce dernier va nous donner une intervalle durant laquelle le satellite va passer en nous indiquant l’élévation maximale du passage.
    Un exemple de la commande lancée manuellement :

    > nugget@noaa:~ $ predict -p "NOAA 15" -t /home/nugget/.config/satdump/satdump_tles.txt
    1714330922 Sun 28Apr24 19:02:02    0  173  192   17  358   3297  35014 * 0.000000
    1714331020 Sun 28Apr24 19:03:40    7  175  196   23  359   2648  35014 * 0.000000
    1714331117 Sun 28Apr24 19:05:17   15  178  200   29    0   2017  35014 * 0.000000
    1714331212 Sun 28Apr24 19:06:52   29  185  204   35    2   1446  35014 * 0.000000
    1714331299 Sun 28Apr24 19:08:19   49  202  208   40    4   1030  35014 * 0.000000
    1714331365 Sun 28Apr24 19:09:25   64  248  211   43    5    886  35014 * 0.000000
    1714331410 Sun 28Apr24 19:10:10   59  293  213   46    6    919  35014 * 0.000000
    1714331461 Sun 28Apr24 19:11:01   45  318  215   49    7   1079  35014 * 0.000000
    1714331532 Sun 28Apr24 19:12:12   29  331  218   53    9   1423  35014 * 0.000000
    1714331618 Sun 28Apr24 19:13:38   17  337  222   58   12   1937  35014 * 0.000000
    1714331713 Sun 28Apr24 19:15:13    8  341  226   63   16   2543  35014 * 0.000000
    1714331810 Sun 28Apr24 19:16:50    1  343  230   69   21   3185  35014 * 0.000000
    1714331830 Sun 28Apr24 19:17:10    0  344  230   70   23   3314  35014 * 0.000000
    

    Ici, on demande les prédictions du satellite NOAA 15 en précisant un fichier TLE à jour. L’élvation est indiqué par la 5ème colonne.
    On voit que le prochain passage aura lieu entre 19:02 (première ligne) et 19:17 (dernière ligne) et que l’élévation maximale aura lieu à 19:09 (6ème ligne) et sera de 64°.
    À noter que j’ai configuré l’outil pour qu’il fasse les enregistrements uniquement pour les passages avec une élévation supérieure à 40°, autrement, la réception n’est pas top.
    Mais au final, qu’est ce qu’on enrengistre, des images ? Et bien non. En réalité, l’enregistrement consiste en la récupération d’un fichier audio !
    La commande principale est celle-ci :

    timeout "${RECORD_TIME}" rtl_fm -f "${FREQUENCY}M" -s 60k -g 40 -p 55 - | sox -t raw -r 60k -es -b 16 -c 1 - "${wav_file}" rate 11025
    

    Décortiquons là en prenant comme exemple la prédiction de NOAA 15 vu précédemment :

  • timeout "${RECORD_TIME}" -> On laisse tourner la commande pendant ${RECORD_TIME} secondes. Dans notre cas, ça serait la soustraction entre le timestamp de la dernière ligne et la première soit 1714331830-1714330922=908 qui vaut environ 15 minutes.
  • rtl_fm est la commande permettant de démarrer l’enregistrement avec notre clé SDR. On lui passe comme argument :
    • -f -> La fréquence en MHz qui est de 137.62 pour NOAA 15.
    • -s -> La fréquence d’échantillonage en kHz. Dans notre cas, on capture 60 000 échantillons du signal chaque seconde. 60k est une bonne valeur pour conserver une bonne qualité sans avoir un fichier trop lourd.
    • -g -> Le gain est une mesure de l’amplification du signal par rapport au bruit de fond. Plus cette valeur est élevée, plus on pourra percevoir des signaux faibles mais en contrepartie il y aura plus de bruit. Il faut alors trouver un juste milieu en faitant plusieurs essais afin de conserver le signal sans avoir trop de bruit. À ce jour, je n’ai pas encore trouvé la valeur idéale mais 40 me convient.
    • -p -> Il s’agit de la préaccentuation. Il s’agit d’une technique pour compenser les pertes et améliorer le bruit en fonction du récepteur SDR. 55 semble faire unanimité pour ma clé RTL-SDR V4
    • - -> C’est juste pour dire de ne pas rediriger le résultat de la commande dans un fichier ou sur le terminal mais va être redrigié vers la commande sox avec le |.
  • sox est une commande nous permettant de faire des opérations sur des fichiers audio. Ici, on va s’en servir pour obtenir un fichier .wav :
    • -t -> On indique qu’en entrée, on a un fichier brut .raw. (C’est ce que nous sort rtl_fm).
    • -r -> On précise à quel fréquence d’échantillonage est le fichier brut. Donc, il faut que ça soit aussi 60k.
    • -es -> On spécifie l’encodage des échantillons. es désigne un encodage avec virgule flotante avec signe. C’est juste pour avoir une représentation plus précise qu’avec un encodage avec entier.
    • -b -> C’est la résolution des échantillons en bits. Donc là, nos échantillons sont représenté par des nombres en 16 bits. C’est une norme courante dans le traitement numérique cette valeur. Ça permet des échantillons pas trop lourd mais avec une précision suffissante quand même.
    • -c -> Le nombre de canal, faut le spécifier et comme on est pas en stéréo, on met 1 ce qui signifie mono donc.
    • rate -> On réduit la fréquence d’échantillonage à 11025Hz car le tool qu’on utilisera par la suite pour la conversion demande cette valeur.

      Magie Conversion

      Ok, à présent, on a un super fichier audio. Il nous reste plus qu’à le transformer en une image à l’aide du logiciel WXtoIMG. Ce dernier prend uniquement en entrée notre fichier .wav et s’occupe de faire la magie tout seul. On peut lui spécifier un mode de transformation pour l’image. Ce dernier va combiner les 2 images reçues du satellite pour en créer une selon notre besoin. Par exemple, on peut en générer une thermique comme celle qu’on a vu au début mais on peut aussi lui demander de coloriser l’image du mieux qu’il peut et même afficher les frontières le long des mers et océans. Voici un des résultats que j’ai reçue le 18 avril par NOAA 18 :
      image_couleure

⚪️ Suite et Améliorations

HRPT

En réalité, ces satellites peuvent envoyer de plus belles images que ça. On l’a dit, mais le protocole APT date de 1960 alors que ces satellites ont été envoyés dans les années 2000. En fait, c’est juste pour une question de rétro-compatibilité avec de vieux équipements. Mais si non, les météorologues vont utiliser un protocole plus récent, le HRPTHigh-Resolution Picture Transmissions). Les NOAA envoient avec ce mode sur des fréquences plus hautes, 1700MHz. Leur récéption demande plus de conaissance et surtout une antenne tout autre. Il s’agit de la suite logique de ce projet afin d’avoir des images toujours plus belles car là où l’APT nous donnait du 4km/pixel, l’HRPT nous donne du 1km/pixel. C’est comme passé d’un écran FULL HD à de la 4K :)

Setup Raspberry

Actuellement, le Raspberry est à plus de 10m de l’antenne et est alimenté avec son transformateur d’origine et connecté en Wi-Fi.
Ok, mais on peut faire mieux même si c’est pour un gain minime sur le projet (le but c’est d’apprendre de toute façon).
Donc actuellement, je réfléchis à une solution pour venir mettre le Raspberry dans une boîte étanche directement en dessous de la tuile où se situe l’antenne. Cela me permettrait de passer de 11m à 5m. Ça permettra de minimiser les pertes dans la câble.
De plus, toute interferance est bonne à enlever, même minime. On l’a vu avec les composants graphiques.
On peut faire une pierre 2 coups afin d’enlever les mini interferences du transformateur ET avoir une connexion Ethernet qui sera bien meilleure que par Wi-Fi. Pour cela, on va utiliser un PoE Splitter qui va nous permettre à la fois d’alimenter le Raspberry ET de lui fournir une connexion à travers un seul câble Ethernet qui part du splitter jusqu’à un port PoE de ma box Internet.
poe_splitter

Filtre et amplificateur

Bien que la clé SDR a pour rôle d’enregistrer dans la fréquence qu’on lui demande, elle n’est pas parfaite et il y aura toujours des signaux parasites autour. Pour régler ce problème, on peut utiliser un LNA (Low Noise Amplicator). Il va nous permettre de filtrer les signaux dans une gamme de fréquence bien spécifique.
J’ai donc invesit dans un LNA 137MHz. Ce dernier va laisser passer que les fréquences dans les 137MHz et en plus amplifier le signal avec un ajout minimal de bruit.
Voici à quoi ressemble ce dernier sans son chassis :
filtre
Il est important de le placer au plus prêt de l’antenne, afin d’amplifier le signal dès que possible. Ainsi, on est sur que le signal ne se perde pas durant le trajet.

SatDump

SatDump est un nouveau venu dans le milieu de la réception d’images satellites. Il s’agit d’une solution tout-en-un permettant à la fois l’enrengistrement ET la conversion de l’audio en image.
Il existe en ligne de commande et avec une interface graphique. Il est récent, “joli” et plus performant d’après ce qu’on entend. En effet, WXtoIMG est un vieux logiciel qui n’est même plus maintenu malheuresement.
Ainsi, pour la suite de ce projet, j’ai déjà commencé à mettre en place ce dernier. N’étant pas encore fonctionnel, je le présente ici comme axe d’amélioration.

⚪️ Ressources et inspirations

Cette section indique les ressources que j’ai principalement utilisé pour la compréhension en général de ce projet :

  • Mon père :
    • Astuces bricolages pour l’antenne (merci à lui ❤️)
  • Site Web :
    • Wikipédia
    • https://github.com/jekhokie/raspberry-noaa-v2
    • F4IAI
    • https://www.instructables.com/Raspberry-Pi-NOAA-Weather-Satellite-Receiver/
    • https://on5vl.org/noaa-satellite-meteo/
    • https://www.qsl.net/kd2bd/predict.html
    • https://wxtoimgrestored.xyz/
    • https://www.satdump.org/
    • …Bien d’autres que j’ai du oublier…
  • Youtube :
    • thonain
    • Ham Radio Crash Course
    • European GNU Radio Days
    • RADIOAMATEUR - PAR F4HTZ
    • sn0ren
    • saveitforparts
    • Et d’autres cours radio diverses