ScreenView le retour...
Pour rappel, dans les grandes lignes la bibliothèque permettra:
- Mise à dispo de composants graphiques de base (label, boutton, slider, image BMP 16 bits et 24 bits, conteneurs, etc).
- Agencement hiérarchique des composants graphiques.
- Rafraichissement optimisé pour ne mettre à jour que les zones modifiées.
- Un mode "vision de nuit" est intégré d'origine pour les projets astro. :D
Le moteur graphique pour cette version « Ordi » s’appuie sur la bibliothèque OpenCV.
Et voici les premiers composants...
https://www.youtube.com/watch?v=hfqVudtfczA
Ainsi qu’une démo Raspberry PI/Mac...
https://www.youtube.com/watch?v=QQ5cNRg5i4oCorrélation stellaire
J'avance tranquillement sur la corrélation stellaire du viseur polaire numérique. Pour être le plus performant possible sur le Pi Zéro lors des captures en live, toutes les coordonnées cartésiennes des étoiles seront pré-calculées en pixels (sur la base de l'échantillonnage connu du couple capteur/objectif) et les distances entre chaque étoile stockées dans une base SQLite.
Deux avantages:
- Il sera très facile de limiter le champs de recherche des segments en bornant simplement les requêtes SQL sur leur longueur.
- Aucune conversion supplémentaire nécessaire afin de respecter des rapports d'échelle pour comparer les distances entre les étoiles.
Bref, l'identification commence à marcher...

Mais où est l'axe polaire dans le ciel?
Après une journée de travail, voici un aperçu de la base de données en coordonnées cartésiennes avec ce bout de code maison créé pour l'occasion sur mon PC...
Je suis parti sur une couverture de 20° de rayon autour du pôle céleste. Et pour un précision optimale, j’ai pris en compte au niveau des étoiles: leur dérive annuelle, la précession des équinoxes, la nutation et l'aberration annuelle. Aperçu en vidéo...https://youtu.be/tSQcC8lHJrI
Calibration de l'axe polaire
« Médiatrice: en géométrie plane, la médiatrice d'un segment est l'ensemble des points équidistants des deux extrémités du segment. Cet ensemble est la droite passant par le milieu du segment et qui est perpendiculaire au segment. »
On commence par déterminer des points de référence entre les clichés...
Lors d'une rotation de 90° les points de référence tournent en rond autour de l'axe mécanique d'ascension droite (l'axe qu'on aligne avec le pôle nord céleste). Si l'on trace la médiatrice de chaque segment, l'intersection des médiatrices nous montre le point de rotation. Ici on constate qu'il est un peu plus haut que le centre du capteur.
CQFD.
Test de détectivité de la camera PI

La détection des étoiles est effectuée ici sur mon Raspberry Pi 3 de développement en approximativement 1,4s de traitement. Cela me semble raisonnable pour une image brute de 5 mégapixel. Mon idée serait d’intégrer l’axe polaire en réalité augmentée avec les constellations proches du pôle. Il faudra voir ce que cela donne avec le PI Zéro plus limité. Évènement exceptionnel: Conjonction Lune / Lampadaire!!!
Plus sérieusement, j’avance sur le pilotage de la caméra du Raspberry PI. Il existe bien le projet picamera en Python mais je souhaite quelque chose de plus performant, que ce soit au niveau des ressources CPU que mémoire, afin de tourner correctement à terme sur un PI Zéro. C’est donc le C/C++ que je privilégie. Et là les choses se gâtent sous Raspbian. Par exemple, la librairie de traitement d’image OpenCV propose bien le support de la cam mais uniquement en flux vidéo automatisé. A noter qu’il est possible de modifier certains paramètres via la méthode set (ex: CV_CAP_PROP_SATURATION) de la classe VideoCapture. Elle fait appel au driver V4L mais dans les faits c’est très limité. Impossible par exemple de régler l’exposition de ma caméra: « HIGHGUI ERROR: V4L: Property Exposure(15) not supported by device) ». Hors dans mon cas, il est nécessaire d’accéder à l’ensemble des pixels de l’image (mode « still ») avec une gestion manuelle de la caméra (exposition, balance des blancs, réglage du gain analogique, etc). Bref, pour arriver à mes fins, je suis donc contraint de coder une version modifiée à ma sauce de raspistillyuv.
Niveau IDE de développement il n’y a pas grand chose de potable à mon goût. J’ai donc décidé de faire comme sur Arduino et d’utiliser l’IDE Xcode sur mon Mac pour avoir un éditeur digne de ce nom (code completion, refactoring, recherches avancées, etc). La mise en oeuvre est un peu plus complexe car cela nécessite de mettre en place des scripts de compilation à distance via un canal SSH mais ça y est ça tourne... :)
Cerise sur le gâteau: XQuartz me permet d’avoir la fenêtre de l’application PI directement sur le Mac (le code s’exécute sur le PI mais l’interface graphique est déportée sur le PC). Je peux maintenant coder sur mon PI avec un minimum de confort! :)
Avancée de l'interface de JARVIS
https://www.youtube.com/watch?v=YOFlksQ5o74Le format paysage me contraint à revoir complètement l'interface de navigation que j'avais imaginé pour l'écran de l'ancien prototype mais cela devrait être d'autant plus confortable à l'usage.
Le retour de ScreenView:
Ceux qui suivent le projet depuis un moment, auront sans doute noté que l’interface rappelle la librairie ScreenView que je vous avais présenté mi 2017. Et pour cause puisque c’est elle que j’utilise. Je l’ai adaptée pour supporter l’écran 4,3’’ sur Arduino Due. Et avant qu’on me pose la question: oui je pense la partager lorsqu’elle sera assez avancée et stabilisée. ;)
Articles connexes:
- Aperçu bibliothèque C++ ScreenView
- Aperçu bibliothèque C++ ScreenView (2)
Nom de code: EM-10 JARVIS
Pour faire court, on a deux options au niveau librairies:
- Adafruit_RA8875
- sumotoy/RA8875
J’ai tout d’abord testé la première mais impossible à l’usage de charger de nouvelles polices de caractère. C’est d’autant plus dommageable que la police par défaut est trop grande. On doit aussi constamment jongler manuellement entre mode texte et mode graphique ce qui est pénible.
J’ai donc opté pour celle de sumotoy. Tout allait pour le mieux jusqu’au moment où j’ai inséré ma carte micro SD pour m’attaquer à l’affichage de l’image de démarrage du projet. Et là catastrophe! Les performances s’écroulent et le tactile ne fonctionne plus. :/
Après moult lectures et notamment les discussions animées par sumotoy il semblerait bien que cet écran souffre du « MISO bug » découvert par Paul Stoffegen:
«There's another **hardware issue on MISO** that's a problem only if you are planning to use any other SPI devices together with RA8875 (example, the SD card holder!), Paul Stoffregen discover the MISO bug that it's not tristate»
https://github.com/sumotoy/RA8875/wiki/RA8875-chip-BUGS!
Bref! Il faut encore que j’investigue mais c’est moyen cool! Dans l’immédiat, j’ai décidé d’avancer malgré tout en intégrant mon image de boot en mémoire flash. Cela fonctionne, c’est relativement rapide côté affichage mais cela monopolise beaucoup de mémoire.
Alors bienvenue à JARVIS, le cerveau de mon projet...
Just A Rather Very Intelligent System... 🤪
Tony Stark: "Jarvis, where's my flight power?!"
Jarvis: "Working on It, sir. This is a prototype."
Amélioration de la librairie adafruit RA8875
https://github.com/MarScaper/Adafruit_RA8875
Le tactile a été revu avec une fifo circulaire afin de réaliser une moyenne glissante pour limiter le bruit...
https://www.youtube.com/watch?v=gKrekKUhyoYEnjoy folks! :)
Booster son code avec la librairie Arduino GPIO

On passe ainsi de 17,58us à 2,042us pour un changement d’état d’une sortie. Cela représente un gain de 8,6x! Et en plus l’écriture du code est allégée. Ce serait dommage de s’en priver. A vous de voir... ;)
Timer hardware ou les 55 cycles manquant...
Je ne sais pas pour vous mais c’est plus fort que moi: Quand quelque chose ne se passe pas comme prévu j’ai besoin de comprendre le « pourquoi? ». Lors de l’écriture de la librairie RunLoop pour Arduino, j’avais constaté à l’époque un décalage sur les timers hardware entre la période demandée par le programme et la périodicité réellement constatée en sortie avec l’analyseur logique.
Le problème c’est que toutes les librairies testées avaient le même décalage que moi: un peu plus de 3us!!! Cela peut paraitre ridicule vu de loin mais pour des fréquences dépassant le KHz, l’erreur est de plus en plus problématique si l’on a besoin de précision. Hors en astronomie, pour le pilotage des moteurs pas à pas, la précision est de rigueur. A l’époque, j’avais donc intégré ce décalage dans RunLoop en l’estimant de manière empirique autour des 3,3us.
Et voilà qu’aujourd’hui, je viens de tomber sur l’excellentissime blog de Bill Grundmann! Si vous lisez l’anglais, c’est par ici que cela se passe:
The overhead of Arduino Interrupts
Pour résumer: il a étudié le phénomène à l’oscilloscope et décortiqué le code assembleur de la librairie Arduino. Et effectivement, la levée d’interruption entraine un surcout de 55 cycles! Soit 55*0,0625 = 3,4375us précisément!!! Hors faute de le savoir, les librairies qu’on trouve sur le net n’en tiennent pas compte. Et bim!
J’ai donc le plaisir de vous annoncer que je viens d’en profiter pour affiner encore un peu plus le code de RunLoop et de le publier sur mon github. Un test à 20Khz, montre maintenant une périodicité quasi parfaite à +-40ns près d’après l’analyseur logique (hors avec ses 12MS/s max on est dans la limite de précision d’échantillonnage donc même pas sûr que la variation résiduelle soit réelle).
Note: en toute logique, le phénomène constaté n’est présent que pour des timers hardware levant une interruption au niveau logiciel. Je ne pense pas qu’un usage en PWM soit concerné.
Veni, vidi, vici et big up à Bill! :)
Démo d'avancement du goto prédictif...
L'ATmega2560 de la MKS MINI au taquet...
Interprétation de la mesure à l’analyseur logique:
Le code exécuté dans l’interruption en elle même prend 3,375us (remise à zéro du compteur du timer comprise) avec une périodicité d’à peine 8us soit plus de 123 000 impulsions par seconde!!! On arrive ici à la limite extrême en se limitant à un seul moteur. En prenant un peu de marge cela signifie qu’en déplacement bi moteurs (A.D. et déclinaison en simultané) pour du goto on peut sans complexe espérer atteindre les 50Khz avec encore un peu de temps CPU pour le reste du programme.
Pour atteindre de telles performances, le code des interruptions moteur a été réduit à sa plus simple expression (comptage de pas + envoi impulsion moteur). Toutes les fonctions d’écriture -digitalWrite()- ont été optimisées avec l’excellente librairie Arduino-GPIO. Enfin, la gestion des accélérations/décélérations, changement de direction, activation/désactivation moteur, ont été dévolues à un timer dédié servant de « modulateur de fréquence » comme le montre cette capture...
Les avantages:
- Le fonctionnement des moteurs à vitesse constante est très peu gourmand en temps processeur.
- Cela ouvre la porte pour faire sans souci du goto en microstepping 1/16 là où d’autres projets sont contraints de basculer à la volée en 1/2 pas voire même en fullstep pour tenir la cadence.
- L’intégration du rattrapage de jeu et la correction d’erreur périodique pourront se faire au niveau du timer d’accélération sans impacter les performances des interruptions moteur.
Démo gestion des moteurs pas à pas du télescope
https://www.youtube.com/watch?v=dwV1hC2yCYI
Le résultat est sans appel en terme de performances mais aussi de simplicité de code. L’ajout du rattrapage de jeu et la modulation de fréquence pour la correction d’erreur périodique devrait être une partie de plaisir par la suite. :)
Dans l’immédiat, je travaille maintenant sur le goto car j’en ai besoin pour d’autres projets. Mon idée serait de ne pas compter les pas à la volée en regardant si on est pas trop loin mais plutôt de créer un modèle mathématique permettant de déterminer le temps de déplacement nécessaire à la milliseconde près pour chaque axe. L’idée est séduisante sur le papier mais dans les faits cela demande beaucoup de précision.
Affaire à suivre...
Contrôle de l'accélération et estimation des pas pour le goto
Reprenons l’exemple d’une accélération comme celle que j’utilise pour ma monture...
Dans la réalité, pour obtenir un tel résultat, je dois progressivement augmenter la fréquence des pas moteur de 0 à 100% de la vitesse souhaitée. Le graphique ci-dessous montre des paliers de 0.1s d’accélération pour passer de 0 à 400Hz (vitesse solaire de ma monture avec micro stepping de 1/16) en 2 secondes.
Astuce: Après avoir étudié la question, j’ai fait le choix sur Arduino d’utiliser le Timer 0 pour gérer les accélérations/décélérations/inversions de mes moteurs. Il faut savoir que ce timer matériel est notamment utilisé par les fonctions delay(), millis() et micros() sur Arduino. On peut néanmoins l’utiliser pour peu de ne pas modifier sa fréquence (calée à 1ms ) en le programmant pour lever une seconde interruption sur la même base de temps...
// Timer0 is already used for millis() - we'll just interrupt somewhere
// in the middle and call the "Compare A" function below
OCRA = 0xAF;
TIMSK |= _BV(OCIE0A);
Le nombre de timers matériels étant très limités sur une carte Arduino (seulement 4 timers sur Uno et 6 timers sur les cartes MEGA) c’est donc un luxe non négligeable de ne pas en monopoliser un juste pour le timing des variations de vitesse. Sur ma MKS MINI, il me reste donc 5 timers matériels soit la possibilité de piloter les 4 drivers de moteur pas à pas avec une grande précision.
A la fin de mon accélération, j’aurais donc théoriquement parcouru la somme des pas des paliers de mon graphique soit... 201 pas. Et le goto dans tout cela? Et bien le comptage de pas c’est la base bien sûr car comme dans la vie: pour savoir où l’on va, il faut savoir d’où l’on vient! -je suis d’humeur littéraire aujourd’hui. Profitez, c’est cadeau.- On peut donc évaluer de façon assez précise, au niveau logiciel, le temps nécessaire pour atteindre un point donné et s’épargner l’achat de couteux encodeurs de position.
Aujourd'hui c'est optimisation...
Et bien oui mais non. Il n’y a pas que la puissance qui compte. Un Arduino ne fait pas grand chose mais il le fait bien. C’est un véritable environnement temps réel. Bien maîtrisé, il est capable de piloter des entrées/sorties avec une régularité et une finesse que n’atteindra jamais un puissant PC qui lui est certes très performant mais qui doit faire beaucoup de choses à la fois (sans même qu’on le sache).
Dans le cadre de moteurs pas à pas par exemple, la régularité est primordiale. La capture ci-dessous montre les pulsations de chaque pas moteur en ascension droite et déclinaison sur mon projet. La précision obtenue est supérieure à la micro seconde.
Voilà c’était la pensée du jour. Je retourne à mon optimisation de code pour grappiller de précieux cycles d’horloge. Au passage, si vous codez sur Arduino de manière un peu avancée, je vous recommande de tester l’excellente librairie Arduino-GPIO de Mikael Patel: https://github.com/mikaelpatel/Arduino-GPIO. Elle permet de remplacer notamment les fonctions digitalRead() et digitalWrite() de la librairie Arduino par des accès hyper optimisés.
Aperçu bibliothèque C++ ScreenView (2)
- Captures réalisées avec la fonction de capture d’écran intégrée à ScreenView. -
Aperçu bibliothèque C++ ScreenView
Elle a pour but de faciliter la conception et la gestion d'interfaces graphiques avec un écran tactile sur Arduino. Elle sera compatible avec les écrans exploitant la librairie Adafruit.
Dans les grandes lignes la bibliothèque permettra:
- Mise à dispo de composants graphiques de base (label, boutton, slider, image BMP 16 bits et 24 bits, conteneurs, etc).
- Agencement hiérarchique des composants graphiques.
- Rafraichissement optimisé pour ne mettre à jour que les zones modifiées.
- Le tactile de la bibliothèque d'Adafruit a été amélioré pour gérer le touch down, touch move et touch up.
- Possibilité de réaliser des captures d'écran en bmp vers carte micro SD (pratique pour faire de la doc).
- Un mode "vision de nuit" est intégré d'origine pour les projets astro. :D
Compter un peu plus de 7€ pour l'écran 400x240 sur volumerate.com. De quoi relayer dans un tiroir les écrans LCD 16x2. :D
La monture prend vie...
Voici les premières captures officielles…


Et une mini vidéo…
https://www.youtube.com/watch?v=h8L5rXhS2R0
La maquette de travail ressemble à ceci...

Accélération/décélération: Sinus or not Sinus?
Soit t un nombre réel compris entre [0,1] représentant le temps d’accélération.
La réponse f(t) est un nombre réel compris entre [0,1] qui représente la vitesse du moteur en pourcentage.
Le graphique ci-après montre:
- Une accélération linéaire.
- Une accélération sinusoïdale parfaite.
- Une accélération sinusoïdale partielle.
La vitesse par accélération linéaire vaut:
f(t) = t
C’est la forme la plus simple. L’accélération est une simple fonction linéaire sur toute la plage. L’accélération est donc constante…
La vitesse par accélération sinusoïdale complète vaut:
f(t) = (sin(t*pi-pi*0.5)+1)*0.5
L’accélération est douce au départ, maximale en 0,5 et vient se radoucir sur la fin...
La vitesse par accélération sinusoïdale partielle vaut:
f(t) = sin(((2*t+1)*pi-pi)*0.25)
L’accélération est maximale au départ et vient se radoucir ensuite...
L’idéal va être des les mettre en oeuvre sur le terrain pour voir le ressenti en terme de confort d’utilisation.
L'analyseur de moteur pas à pas livre ses premiers chiffres...
- Période de rotation de la sortie moteur: 7,98min (7min 59s) soit 9,98min/dent au niveau de la vis roue dentée de 144 dents)
- Fréquence des pas moteur: 25,063Hz en Fullstep.
- Vitesse angulaire du télescope (tenant compte de la démultiplication supplémentaire de 0,8 et de la roue dentée de 144 dents): 15,04’’/s.

Conclusion rapide: ça cartonne! La vitesse sidérale est quasi parfaite.
Seule ombre au tableau pour le banc d’essai, les vibrations du moteur viennent noyer la précision de mesure sidérale instantanée…

Ce qui me fait dire que ce n’est pas du bruit lié à l’analyse c’est que, quand on y regarde de plus près, ce fameux « bruit » est identique pour chacune des 4 mires périphériques. Je pense que le passage en micropas 1/16 avec la nouvelle électronique devrait solutionner cette incertitude.
Chose intéressante tout de même, le repère centrale rouge semble moins impacté. Du fait de son léger décentrage, ses positions x/y génèrent une légère sinusoïde qui semble laisser entrevoir les « crans » d’une sous période...

Avec un peu de chance, il s’agit de la fameuse sous période d’environ 1,28m que j’ai imputé à l’engrenage 4 de la démultiplication.
Enquête à suivre.
Sky Catalog dispo sur mon Github

Et pour en savoir plus c’est par ici…
http://em10-usd-arduino-takahashi.eliotis.com/librairies-arduino/skycatalog/index.html
Librairie RunLoop dispo sur mon Github
http://github.com/MarScaper/runloop
La librairie est compatible avec le gestionnaire de librairie de l’IDE Arduino et fournie avec quelques exemples d’usage. Et en voici une illustration concrète dans le projet:
Buzzer, led, télécommande infra rouge, écran LCD et GPS fonctionnant de concert.
Run Loop Library: une boite à outil pour Arduino

Dénommée RunLoop, elle permettra:
- la facilitation des traitements parallèles via un « run loop » (une boucle d’exécution) à multi-niveaux hiérarchiques.
- la gestion des timers logiciels.
- la gestion de tous les timers matériels du Arduino (dont les 3,4,5 dispo uniquement sur le Mega).
- les notifications asynchrones via paradigme de délégation.
- une gestion 100% C++.
Test en grandeur réelle du coucher du Soleil

L’estimation avec Ephemeris était de 18m42m17s. Manque de bol des nuages en bord d’horizon ont limité la précision de la mesure. Dernier rayon photographié à 18h41m12s…

Zoom sur la zone centrale de la photographie...

Il nous reste à vue d’oeil un « demi soleil » à une 1 minute et 5s du dernier rayon estimé. On est vraiment pas mal du tout niveau précision si l’on fait abstraction des nuages. :)
PolarisFinder dispo dans Ephemeris

https://github.com/MarScaper/ephemeris/tree/master/examples/PolarisFinder
Abaque numérique pour le viseur polaire de l'EM10
La monture, équipée d’usine d’un viseur polaire, était accompagnée d’un abaque en carton permettant de déterminer facilement l’endroit où placer l’étoile polaire en fonction du jour et de l’heure…

Après près de 20 ans de bons et loyaux services à coup de lampe rouge dans l’obscurité j’ai décidé de lui fabriquer un successeur numérique digne de ce nom!
Le concept est simple: un arduino, un écran TFT et un puce Bluetooth. Dès que l’on approche l’ensemble à quelques centimètres de la raquette de commande, la liaison Bluetooth s’établie automatiquement et les infos (localisation sur la Terre, date, heure, altitude) du module GPS de la raquette sont rapatriées. Le Arduino calcule alors le positionnement de la polaire et affiche l’abaque numérique. Et voici le résultat à côté du logiciel Polaris Finder proposé par Optique Unterlinden sur PC…

Pour le calcul de l’angle de l’étoile polaire c’est on ne peut plus simple: j’utilise ma librairie Ephemeris. La longitude est celle du lieu d’observation et par contre pour la latitude on se place au pole Nord c’est à dire à +90°. Notre pôle céleste est alors parfaitement au dessus de notre tête et la polaire va réaliser sa ronde autour durant la nuit. Connaissant ses coordonnées équatoriales, on calcule ses coordonnées horizontales avec la librairie ce qui nous donne son angle en azimut. Le tour est joué.
En langage programmeur cela donne quelque chose comme ces quelques lignes…

La classe à Dallas non?!? ;)
Système solaire embarqué et opérationnel! :)

Ephemeris dans le gestionnaire de bibliothèque Arduino

Librairie à télécharger ici…
http://github.com/MarScaper/ephemeris
Le matin vient de se lever...
Coordinates of Solar system objects (10/4/2014 19:21:0)
_____________________________________
Sun
R.A: 01h17m00s.65
Dec: 08d08'00".12
Azi: 292.30d
Alt: -8.08d
Rise: 5h10m16.53s
Set: 18h34m40.20s
Dist: 1.002 AU
Diam: 31.93'
_____________________________________
Et cela fonctionne pour le Soleil, Mercure, Venus, notre Lune, Mars, Jupiter, Saturne, Uranus, Neptune et avec en bonus une méthode publique permettant d’estimer l’heure de lever/coucher de n’importe quel astre pour peu de connaitre ses coordonnées en ascension droite (ex: galaxies, etc).
Librairie à télécharger ici…
http://github.com/MarScaper/ephemeris
Fly me to the Moon avec Ephemeris
Coordinates of Solar system objects (10/4/2014 19:21:0)
_______________
Earth's Moon
R.A: 09h56m34s.76
Dec: 07d40'11".96
Azi: 154.47°
Alt: 46.27°
Dist: 401178.68 Km
Diam: 30.13'
_______________
Les calculs sont basés sur les termes périodiques ELP2000 mis en forme dans le fichier d’entête « ELP2000.h ».
Librairie à télécharger ici…
http://github.com/MarScaper/ephemeris
Librairie Ephemeris dispo sur mon Github
http://github.com/MarScaper/ephemeris
Elle est conçue avant tout pour le Arduino Mega mais codée pour rester multiplateforme. On peut ainsi obtenir les coordonnées équatoriales (R.A/Dec), les coordonnées horizontales (Alt/Az), la distance en AU et le diamètre apparent des planètes du système solaire ainsi que du Soleil pour une date et un lieu donné.
Il ne manque que la Lune que j'attaque dans la foulée. :)
VSOP87 exit pour les Arduinos de base (Uno, etc)
Seule ombre au tableau, la théorie VSOP87, malgré qu’elle soit tronquée, demande un peu plus de 29Ko rien que pour le stockage des thermes permettant le calcul des coordonnées héliocentriques. Exit donc la compatibilité avec les Arduinos de base en l’état. De même, le stockage des données dans la mémoire flash (PROGMEM) est impératif pour le Arduino Mega car ses 8Ko de SRAM sont insuffisant.Coordinates for Mars (10/04/2014 19:21:00)
R.A: 13h10m55s.10
Dec: -4d54'45".09
Azi: 111.50°
Alt: 11.62°
Dist: 0.62 AU
Diam: 15.13"
Bien sûr on pourrait trouver des subterfuges si c’était vraiment nécessaire:
- utiliser la méthode de calcul de base présentée dans l’ouvrage mais elle est peu précise car elle ne tient pas compte des interaction entre les planètes.
- stocker les termes VSOP87 dans des fichiers sur une carte SD avec accès à la volée.
- stocker les termes VSOP87 dans une mémoire flash annexe en utilisant la librairie SPIFlash.
Dans mon cas, je vais me borner à mon besoin. Autant exploiter le Arduino Mega.
Conception de la librairie Ephemeris pour Arduino

Les algorithmes sont développés sur la base de l’ouvrage de Jean Meeus et découpés en une classe C++ Calendar pour les calculs de dates et une classe C++ Ephemeris pour ce qui concerne les calculs d’éphémérides à proprement parlé.
L’idée est de faire quelque chose d’assez léger et adapté aux possibilités d’un Arduino.
Calculs des éphémérides planétaires
J’ai donc maintenant de quoi m’amuser pour calculer les éphémérides (Soleil, Lune, planètes) avec mon Arduino. L’application des formules proposées par Jean Meeus n’est pas très complexe en soit pour peu d’être méthodique car chaque étape des calculs est bien détaillée. Là où cela se complique un peu c’est qu’il va falloir jongler avec un microcontrôleur « simple précision » hors certains calculs nécessitent une précision plus importante.
Intégration du GPS dans le projet

Et pour le fun, je me suis même amusé à animer les ondes qui émanent de l’icône de localisation pendant qu’on patiente. :)
Amélioration des performances de l'écran TFT
https://www.youtube.com/watch?v=Tjh4EQe2xGI
Optimisation:
- Librairie SD de base remplacée par SDFat qui offre de meilleurs performances.
- Modification de la méthode pushColor() de la classe Adafruit_TFT afin de permettre l’usage d’un buffer de pixels supérieur à 256. On peut ainsi allouer toute la largeur d’une image plein écran de 320 pixels.
- Les fichiers bitmap 24 bits sont remplacés par de vrais fichiers bmp 16 Bits. On évite ainsi tout besoin de conversion pour l’écran 16 bits.
- Les fichiers bmp sont aussi préalablement retournés haut/bas du fait de l’origine inversée entre le format bmp et l’écran. Ainsi on peut se déplacer linéairement lors de la lecture (pas besoin de seek).
Au final les performances sont améliorées d’un facteur 3x pour de l’affichage bitmap. :)
Détails de l'écran LCD 16x2
De haut en bas, l’affichage des coordonnées en ascension droite et déclinaison avec pour le fun à gauche un icône de mire de pointage et en fonction de la vitesse de suivie: des étoiles (vitesse sidérale), un croissant de Lune (vitesse Lunaire), un soleil (vitesse solaire).

J’ai prévu dans la foulée d’agrémenter l’électronique d’un capteur de température interne pour le miroir, d’un capteur de température externe et d’un capteur d’humidité. Les capteurs de température seront tout particulièrement utiles pour le contrôle de la mise en température du télescope.
