{"id":4732,"date":"2026-06-19T10:16:22","date_gmt":"2026-06-19T08:16:22","guid":{"rendered":"https:\/\/f6kmf.fr\/?p=4732"},"modified":"2026-06-19T10:18:37","modified_gmt":"2026-06-19T08:18:37","slug":"arduino-a-la-poursuite-des-satellites-nouvelle-version-du-programme","status":"publish","type":"post","link":"https:\/\/f6kmf.fr\/index.php\/2026\/06\/19\/arduino-a-la-poursuite-des-satellites-nouvelle-version-du-programme\/","title":{"rendered":"Arduino \u00e0 la poursuite des satellites (nouvelle version du programme)"},"content":{"rendered":"\n<p class=\"has-text-align-right wp-block-paragraph\"><strong>Par Gilles F1EFW<\/strong><\/p>\n\n\n\n<h3 class=\"wp-block-heading\"><strong>Une \u00e9tape franchie : 1 000 contacts par satellites radioamateurs !<\/strong><\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Pour c\u00e9l\u00e9brer ce palier, j&rsquo;ai fait \u00e9voluer mon syst\u00e8me de pilotage de rotors afin de le rendre compatible avec les nouveaux logiciels de poursuite satellite, de plus en plus nombreux sur le march\u00e9.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Les points forts de cette solution :<\/strong><\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Tr\u00e8s \u00e9conomique :<\/strong> Un co\u00fbt de revient de quelques dizaines d&rsquo;euros seulement.<\/li>\n\n\n\n<li><strong>Performante :<\/strong> Elle rivalise avec des \u00e9quipements professionnels.<\/li>\n\n\n\n<li><strong>Polyvalente :<\/strong> Elle permet de piloter des rotors tr\u00e8s anciens ou des mod\u00e8les de fabrication maison.<\/li>\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\">Ma r\u00e9alisation se substitue aux bo\u00eetiers de commande d&rsquo;origine des deux rotors. Si vous poss\u00e9dez encore les bo\u00eetiers d&rsquo;origine, rien ne vous emp\u00eache de les conserver (personnellement, je n&rsquo;en avais pas, ce qui a motiv\u00e9 cette conception).<\/p>\n\n\n\n<figure class=\"wp-block-image aligncenter size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"300\" src=\"https:\/\/f6kmf.fr\/wp-content\/uploads\/2026\/06\/image-4-1024x300.png\" alt=\"\" class=\"wp-image-4736\" srcset=\"https:\/\/f6kmf.fr\/wp-content\/uploads\/2026\/06\/image-4-1024x300.png 1024w, https:\/\/f6kmf.fr\/wp-content\/uploads\/2026\/06\/image-4-300x88.png 300w, https:\/\/f6kmf.fr\/wp-content\/uploads\/2026\/06\/image-4-768x225.png 768w, https:\/\/f6kmf.fr\/wp-content\/uploads\/2026\/06\/image-4.png 1411w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">Voir le pr\u00e9c\u00e9dent article <a href=\"https:\/\/f6kmf.fr\/index.php\/2023\/09\/14\/arduino-et-la-radio-a-la-poursuite-des-satellites-version-site-azimut\/\">https:\/\/f6kmf.fr\/index.php\/2023\/09\/14\/arduino-et-la-radio-a-la-poursuite-des-satellites-version-site-azimut\/<\/a><\/p>\n\n\n\n<figure class=\"wp-block-image aligncenter size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"724\" src=\"https:\/\/f6kmf.fr\/wp-content\/uploads\/2026\/06\/image-5.png\" alt=\"\" class=\"wp-image-4737\" srcset=\"https:\/\/f6kmf.fr\/wp-content\/uploads\/2026\/06\/image-5.png 1024w, https:\/\/f6kmf.fr\/wp-content\/uploads\/2026\/06\/image-5-300x212.png 300w, https:\/\/f6kmf.fr\/wp-content\/uploads\/2026\/06\/image-5-768x543.png 768w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/figure>\n\n\n\n<h4 class=\"wp-block-heading\"><strong>\u00c9volution du contr\u00f4leur de rotor : vers une compatibilit\u00e9 universelle<\/strong><\/h4>\n\n\n\n<p class=\"wp-block-paragraph\">La pr\u00e9c\u00e9dente version de mon programme \u00e9tait limit\u00e9e \u00e0 <strong>WispDDE<\/strong>, n\u00e9cessitant l&rsquo;utilisation d&rsquo;applications comme Orbitron ou SDR-Console pour assurer l&rsquo;interfa\u00e7age.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">La nouvelle mouture franchit une \u00e9tape importante en adoptant le <strong>protocole GS-232<\/strong>, devenu le standard du suivi satellite. Elle est d\u00e9sormais compatible avec la majorit\u00e9 des logiciels de poursuite modernes, tels que <strong>SatTrack, OscarWatch, ou PstRotator<\/strong>.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><\/p>\n\n\n\n<h4 class=\"wp-block-heading\"><strong>Fonctionnement technique<\/strong><\/h4>\n\n\n\n<p class=\"wp-block-paragraph\">Le programme orchestre le suivi de mani\u00e8re autonome gr\u00e2ce au processus suivant :<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Analyse du flux :<\/strong> Le logiciel intercepte les donn\u00e9es provenant du logiciel de poursuite satellite, extrait les cha\u00eenes commen\u00e7ant par \u00ab W \u00bb ou \u00ab w \u00bb et isole les valeurs d&rsquo;azimut et de site (ex: <code>W235 025<\/code> pour 235\u00b0 d&rsquo;azimut et 25\u00b0 de site). Les donn\u00e9es non pertinentes, comme les commandes de parcage, sont ignor\u00e9es.<\/li>\n\n\n\n<li><strong>Boucle d&rsquo;asservissement :<\/strong> Le programme compare en temps r\u00e9el la position du satellite avec celle des antennes. La lecture analogique des potentiom\u00e8tres des moteurs est convertie en degr\u00e9s \u00e0 partir des tensions relev\u00e9es.<\/li>\n\n\n\n<li><strong>Correction :<\/strong> Des ajustements sont appliqu\u00e9s automatiquement pour aligner pr\u00e9cis\u00e9ment les moteurs sur la trajectoire du satellite.<\/li>\n<\/ul>\n\n\n\n<h4 class=\"wp-block-heading\"><br><\/h4>\n\n\n\n<h4 class=\"wp-block-heading\"><strong>Personnalisation et calibration<\/strong><\/h4>\n\n\n\n<p class=\"wp-block-paragraph\">L&rsquo;adaptation \u00e0 votre mat\u00e9riel est simplifi\u00e9e : il suffit d&rsquo;\u00e9talonner les tensions de vos potentiom\u00e8tres pour d\u00e9terminer le <strong>coefficient de transformation<\/strong> sp\u00e9cifique \u00e0 vos moteurs. Une fois ce rapport tension\/degr\u00e9 d\u00e9fini, le programme assure une pr\u00e9cision optimale.<br><\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\n\/\/ Pilotage rotor azimut V4  \/\/\n\/\/  Gilles PLATRET F1EFW     \/\/\n\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\n\n\/\/ La version de d\u00e9part \u00e9tait seulement compatible avec les informations en provenance de WISP DDE\n\/\/ Cette version extrait la chaine de caract\u00e8res WXXX XXX de n'importe quel logiciel de suivi satellites\n\/\/ Des test concluants ont \u00e9t\u00e9 effectu\u00e9s avec SatTrack, OscarWatch, SdrConsole, PstRotator etc ..... \n\n\/\/ On ajoute une librairie qui va nous aider pour l'affichage\n\n#include &lt;LiquidCrystal.h&gt;\nLiquidCrystal lcd(7, 8, 9, 10, 11, 12);\n\n\/\/ On d\u00e9clare quelques variables A_ pour affichage \n\nString Lecture_Port_USB, A_AZI, A_ELE, A_Potar_Azi, A_Potar_Ele ;\nint AZI, ELE, Potar_Azi, Potar_Ele;\nint pin0 = A0,pin1 = A1, marge = 4;\n   \n      \/\/ on peut changer marge pour \u00e9viter les A\/R  (ex: 5, 6 ou 8).\n    \n\n\/\/ On initialise le programme \n\nvoid setup() {\n  \n  lcd.begin(16, 2);\n  lcd.setCursor(0, 0);\n   lcd.print(\"F1EFW VERSION 4\");\n   delay(3000);\n   lcd.setCursor(0, 0);\n   lcd.print(\"               \");\n  Serial.begin(9600); \/\/ vitesse avec le port de communication\n  \n\/\/ Les relais Azimut\n  pinMode(5, OUTPUT); \/\/ relais 1\n  pinMode(6, OUTPUT); \/\/ relais 2\n\n\n\/\/ Les relais Elevation\n  pinMode(3, OUTPUT); \/\/ relais 1\n  pinMode(4, OUTPUT); \/\/ relais 2\n\n  \n  AZI=0,ELE=0;\n}\n\n\/\/ On commence \u00e0 bosser \n\nvoid loop() \n{\n  \n\/\/ Lecture du port de communication.\n\/\/ au format GS-232 -&gt; ex W127 052\n\/\/ on extrait les caract\u00e8res Azumuth et Elevation\n\/\/ et on les convertis en nombres (ToInt)\n\/\/ On dispose de l'information sous format num\u00e9rique pour les calculs\n\/\/ et au format chaine de caract\u00e8res pour l'affichage\n\n  while(Serial.available()){\n    Lecture_Port_USB = Serial.readString();\n\n     for (int i = 0; i &lt;= Lecture_Port_USB.length(); i++) {\n         \n      if ((Lecture_Port_USB.charAt(i) == 'W') || (Lecture_Port_USB.charAt(i) == 'w')) {\n                                               \n           A_AZI = Lecture_Port_USB.charAt(i+1);\n           A_AZI = A_AZI + Lecture_Port_USB.charAt(i+2);\n           A_AZI = A_AZI + Lecture_Port_USB.charAt(i+3);\n           \n           A_ELE = Lecture_Port_USB.charAt(i+5);\n           A_ELE = A_ELE + Lecture_Port_USB.charAt(i+6);\n           A_ELE = A_ELE + Lecture_Port_USB.charAt(i+7);\n\n\n      AZI = (A_AZI.toInt());\n      ELE = (A_ELE.toInt());\n      \n    lcd.setCursor(0, 0);\n    lcd.print(\"SAT A:\");\n    lcd.print(A_AZI);\n    lcd.print(\" E:\");     \n    lcd.print(A_ELE);\n    \n   }\n   } \n  }\n  \n\/\/ fin de lecture du port USB\n\n\/\/ Lecture du potar_Azumuth\n\/\/ Potar_Azi varie de 0 a 1024 (0 quand il est \u00e0 la masse et 1024 quand il re\u00e7oit 5V)\n\/\/ pour convertir en degres on fera theoriquement 1024\/360 = 2.84\n\/\/ Mais pour moi le potar AZIMUT va de 74 \u00e0 1020 donc (1020-74)\/360 = 2.62\n\/\/ Le potar ELEVATION va de 610 a 810 pour faire 90\u00b0 donc (810-610)\/90 = 2.22\n\nPotar_Azi =  ((analogRead(pin0)-74)\/2.62);\nPotar_Ele =  ((analogRead(pin1)-530)\/2.25);\n\n   lcd.setCursor(0, 1);\n   lcd.print(\"ANT A:\");\n       \n       \/\/ pour afficher le nombre sous la forme de 3 caract\u00e8res\n       \n       A_Potar_Azi = String(Potar_Azi);\n         if (A_Potar_Azi.length() &lt; 2) {\n             A_Potar_Azi = (\"00\"+ A_Potar_Azi);\n              }\n              else {\n               if (A_Potar_Azi.length() &lt; 3) {\n                A_Potar_Azi = (\"0\"+ A_Potar_Azi);\n               }\n               }\n              lcd.print(A_Potar_Azi);\n\n        A_Potar_Ele = String(Potar_Ele);\n         if (A_Potar_Ele.length() &lt; 2) {\n             A_Potar_Ele = (\"00\"+ A_Potar_Ele);\n              }\n              else {\n               if (A_Potar_Ele.length() &lt; 3) {\n                A_Potar_Ele = (\"0\"+ A_Potar_Ele);\n               }\n               }\n              lcd.print(\" E:\");\n              lcd.print(A_Potar_Ele);\n           \/\/ lcd.print(analogRead(pin1));\n\n              \n    lcd.setCursor(0, 0);\n    lcd.print(\"SAT A:\");\n    lcd.print(A_AZI);\n    lcd.print(\" E:\");     \n    lcd.print(A_ELE);\n\n                 \n   \/\/ on ne corrige que si le satellite est visible (ELE&gt;0) et qu'on quitte la marge\n   \/\/ donc si diff\u00e9rence des valeurs &gt; marge on tourne dans un sens\n   \/\/ si &lt; marge on tourne dans l'autre sens et si presque \u00e9gale on stoppe \n   \/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/  AZIMUT \/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\n\n    if (ELE &gt; 0) { \/\/ Si le satellite est visible\n     if ((Potar_Azi &gt; AZI) &amp;&amp; (abs(Potar_Azi - AZI) &gt; marge)) {\n       \/\/ Tourne dans un sens\n       digitalWrite (5, HIGH);\n       digitalWrite (6, LOW);\n     } \n     else if ((Potar_Azi &lt; AZI) &amp;&amp; (abs(Potar_Azi - AZI) &gt; marge)) {\n       \/\/ Tourne dans l'autre sens\n       digitalWrite (5, LOW);\n       digitalWrite (6, HIGH);\n     } \n     else {\n       \/\/ Si on n'est ni trop haut, ni trop bas (donc dans la marge) : on STOPPE\n       digitalWrite (5, HIGH);\n       digitalWrite (6, HIGH);\n     }\n   } else {\n     \/\/ Si ELE &lt; 1, on s\u00e9curise et on stoppe le moteur\n     digitalWrite (5, HIGH);\n     digitalWrite (6, HIGH);\n   }\n\n\n    \/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/  ELEVATION \/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\n\n     if (ELE &gt; 0) {\n     if ((Potar_Ele &gt; ELE) &amp;&amp; (abs(Potar_Ele - ELE) &gt; marge)) {\n       \/\/ Tourne dans un sens\n       digitalWrite (3, HIGH);\n       digitalWrite (4, LOW);\n     } \n     else if ((Potar_Ele &lt; ELE) &amp;&amp; (abs(Potar_Ele - ELE) &gt; marge)) {\n       \/\/ Tourne dans l'autre sens\n       digitalWrite (3, LOW);\n       digitalWrite (4, HIGH);\n     } \n     else {\n       \/\/ Dans la marge : on STOPPE\n       digitalWrite (3, HIGH);\n       digitalWrite (4, HIGH);\n     }\n   } else {\n     \/\/ Si ELE &lt; 1, on s\u00e9curise et on stoppe le moteur\n     digitalWrite (3, HIGH);\n     digitalWrite (4, HIGH);\n   }\n}<\/code><\/pre>\n\n\n\n<h4 class=\"wp-block-heading\"><strong>Simplification du contr\u00f4le manuel<\/strong><\/h4>\n\n\n\n<p class=\"wp-block-paragraph\">N&rsquo;utilisant pas les bo\u00eetiers de commande d&rsquo;origine, j&rsquo;ai opt\u00e9 pour une approche directe : l&rsquo;envoi de commandes depuis le port s\u00e9rie (COM1) de mon ordinateur vers l&rsquo;Arduino.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Pour r\u00e9aliser ces tests de mani\u00e8re rapide et ergonomique, j&rsquo;utilise <strong><a href=\"https:\/\/www.compuphase.com\/software_termite.htm\">Termite<\/a><\/strong>. C&rsquo;est, \u00e0 mon sens, l&rsquo;outil id\u00e9al pour envoyer des cha\u00eenes de caract\u00e8res en toute simplicit\u00e9. Son principal atout est d&rsquo;\u00eatre <strong>portable<\/strong>, ce qui \u00e9vite toute installation fastidieuse sur le syst\u00e8me.<\/p>\n\n\n\n<figure class=\"wp-block-image aligncenter size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"484\" height=\"159\" src=\"https:\/\/f6kmf.fr\/wp-content\/uploads\/2026\/06\/image-3.png\" alt=\"\" class=\"wp-image-4734\" srcset=\"https:\/\/f6kmf.fr\/wp-content\/uploads\/2026\/06\/image-3.png 484w, https:\/\/f6kmf.fr\/wp-content\/uploads\/2026\/06\/image-3-300x99.png 300w\" sizes=\"auto, (max-width: 484px) 100vw, 484px\" \/><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\"><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><\/p>\n\n\n\n<h4 class=\"wp-block-heading has-text-align-center\"><strong>A votre disposition pour plus d&rsquo;information <a href=\"https:\/\/f6kmf.fr\/index.php\/nous-contacter\/\">https:\/\/f6kmf.fr\/index.php\/nous-contacter\/<\/a><\/strong><\/h4>\n\n\n\n<p class=\"wp-block-paragraph\"><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Par Gilles F1EFW Une \u00e9tape franchie : 1 000 contacts par satellites radioamateurs ! Pour c\u00e9l\u00e9brer ce palier, j&rsquo;ai fait<\/p>\n","protected":false},"author":1,"featured_media":4737,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"colormag_page_container_layout":"default_layout","colormag_page_sidebar_layout":"default_layout","footnotes":""},"categories":[11,21,27,14,8],"tags":[39],"class_list":["post-4732","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-activites-radio","category-antenne","category-arduino","category-realisations","category-satellites","tag-satellites"],"_links":{"self":[{"href":"https:\/\/f6kmf.fr\/index.php\/wp-json\/wp\/v2\/posts\/4732","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/f6kmf.fr\/index.php\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/f6kmf.fr\/index.php\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/f6kmf.fr\/index.php\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/f6kmf.fr\/index.php\/wp-json\/wp\/v2\/comments?post=4732"}],"version-history":[{"count":4,"href":"https:\/\/f6kmf.fr\/index.php\/wp-json\/wp\/v2\/posts\/4732\/revisions"}],"predecessor-version":[{"id":4740,"href":"https:\/\/f6kmf.fr\/index.php\/wp-json\/wp\/v2\/posts\/4732\/revisions\/4740"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/f6kmf.fr\/index.php\/wp-json\/wp\/v2\/media\/4737"}],"wp:attachment":[{"href":"https:\/\/f6kmf.fr\/index.php\/wp-json\/wp\/v2\/media?parent=4732"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/f6kmf.fr\/index.php\/wp-json\/wp\/v2\/categories?post=4732"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/f6kmf.fr\/index.php\/wp-json\/wp\/v2\/tags?post=4732"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}