Contrôler la fréquence d'un Arduino...

Voici une manip que je trouve géniale et qui a été proposée par ChristopheFr sur le forum français d’arduino.cc. Son idée permet de contrôler très simplement la fréquence réelle de fonctionnement des cartes Arduino et compatibles. Et cela sans aucun matériel complexe! Il suffit de télécharger le logiciel gratuit Processing.

processing3-logo

Dans l’éditeur arduino, on copie/colle le sketch suivant et on l’upload sur la carte:
void setup() {
  Serial.begin(115200);
}

void loop() {
  static uint32_t t = micros();

  while (micros() - t < 16000000);
  t += 16000000;
  Serial.write('1'); // envoi un octet sur le port série toutes les 16 secondes
}


Et dans l’éditeur Processing, on utilise le code suivant:
import processing.serial.*;

Serial Port;
int t1,t2;

void setup() {
  int i;
  Port = new Serial(this, "COM7", 115200); // remplacez COM7 par le port occupé par l'Arduino, sinon bug!
  
  t1 = millis();
  while(true) {
    while(Port.available() > 0) {
      i = Port.read();
      t2 = millis();
      println(256000000 / (t2-t1) + "KHz"); // affiche la fréquence du quartz de l'Arduino en KHz toutes les 16 secondes (la première mesure n'est pas fiable).
      t1 = t2;
    }
    delay(1);
  }
}

void draw() {
}


C’est terminé! On lance l’exécution du code sur Processing et on patiente.

Testé chez moi avec la MKS MINI V2.0 Makerbase et une carte Arduino MEGA de chez SUNFOUNDER:
- La SUNFOUNDER tourne à 15996KHz (avec +-1 KHz de variation entre les mesures).
- La MKS MINI est parfaitement calibrée à 16000KHz.

J’ai ensuite testé en chauffant les cartes avec un sèche cheveux:
- La carte SUNFOUNDER perd quasi instantanément 10Khz et elle descend encore un peu pour se stabiliser autour des 15983Khz au bout de quelques minutes.
- La MKS MINI ne bronche pas et reste parfaitement stable à 16000KHz.

Voilà qui confirme la MKS MINI comme un excellent choix pour mon projet. Sa fréquence est conforme et elle ne souffre pas de dérive en fonction de la température ambiante. :)

Moralité: attention aux cartes choisies pour un usage en astronomie. Si possible, vérifiez bien dans les specs qu’elles sont équipées de Quartz. Moi je me suis fait berner de visu avec la SUNFOUNDER qui est équipée de résonateurs céramiques en boitier métallique ressemblant à un boitier de Quartz (merci à al1fch pour l’info).

Lien vers le topic original lancé par ChristopheFr:
Mesurer la fréquence d'un Arduino avec Processing

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.

RunLoop

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).

50us-20khz


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...

Ce n’est pas encore parfait mais on approche... :)


https://www.youtube.com/watch?v=CCw-PU-hffA

L'ATmega2560 de la MKS MINI au taquet...

Après avoir bien poussé les optimisations de code, voici un benchmark montrant les impulsions d’un des moteurs pas à pas poussées au maximum des capacités de la carte Arduino (le mode PWM permettrait d’aller encore plus loin mais sans aucun retour pour le comptage de pas donc incompatible avec les besoins du projet)...

arduino-moteur-pas-a-pas-frequence-max

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...

accel-timer

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

Bien. Depuis quinze jours, j’ai effectué un gros gros taf sur la gestion des moteurs. J’ai repensé en profondeur l’algorithme s’occupant des interruptions timer. Illustration en vidéo... -Désolé pour la qualité du son. Mon PC n’aime pas la chaleur actuelle.-

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...

TeenAstro utilise la librairie Ephemeris

Pour changer un peu, j’ai le plaisir de vous présenter le superbe projet TeenAstro de Charles! :)

teenasto


Si comme moi vous êtes amateur du système FS2 conçu et commercialisé par Astro Electronic, l’hommage ne vous aura pas échappé... :)

raquette-TeenAstro raquette-fs2


Personnellement, j’utilise encore un FS2 sur la monture ZX4 Trassud supportant mon Mewlon 250. Bien que vieillissant, il est reste très agréable à l’usage... :)

mewlon-250-fs2

Donc pour faire simple, TeenAstro c’est le FS3 que beaucoup ont longtemps attendu. En se basant sur une version modifiée du code du projet OnStep, Charles s’est lancé dans l’aventure de créer un kit reprenant le concept de simplicité et d’efficacité du FS2 mais mis au goût du jour.

Et pour les calculs d’éphémérides et conversions astronomiques c’est ma librairie Ephemeris qui s’y colle. Cela fait plaisir de la voir utilisée sur un beau projet comme ça! :)

Vous pouvez découvrir tous les détails et avancées de TeenAstro dans cette discussion initiée par Charles sur le forum webastro.net...
https://www.webastro.net/forums/topic/158652-teenastro-une-variante-onstep-en-kit/

Contrôle de l'accélération et estimation des pas pour le goto

Les choses commencent à devenir intéressantes. J’évoquais dans le précédant billet l’intérêt d’un micro contrôleur en terme de précision. L’avantage indéniable des moteurs pas à pas est comme leur nom l’indique « les pas ». En comptant chaque pas au niveau logiciel, on peut contrôler la position avec une grande précision. Mais cette force est aussi une faiblesse car qui dit contrôle dit responsabilité. On ne peut pas dire à un moteur pas à pas d’aller à un endroit précis, d’accélérer ou de décélérer de façon autonome en le branchant et en claquant des doigts. Tout doit être géré par le programme.

Reprenons l’exemple d’une accélération comme celle que j’utilise pour ma monture...

courbe-acceleration


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.

comptage des pas acceleration moteur


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...

On me demande souvent pourquoi avoir choisi de développer sur plateforme Arduino MEGA? Après tout, on fait quoi avec 16MHz et 8Ko de SRAM!?! Un Raspberry PI serait hachement plus puissant!

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.

100x-sideral-speed


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)

Quelques captures montrant l’avancement de ces derniers jours. J’ai essentiellement travaillé sur les différents types de boutons: simple, fléché, fléché avec cadre (voir capture de l’écran « Menu »). J’ai aussi enrichi le fonctionnement des éléments répondant au tactile (attribut activé/désactivé). Je pense intégrer le gamepad comme un élément de la librairie pour qui voudra créer une raquette de commande facilement.

boot polaris
gamepad menu
- Captures réalisées avec la fonction de capture d’écran intégrée à ScreenView. -

Aperçu bibliothèque C++ ScreenView

Démo d'avancement de ma nouvelle 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

Amélioration de l'écran tactile TFT 400x240

J’ai profité du démontage du prototype pour apporter une légère amélioration à l’écran. On peut voir sur cette photo que l’écran couvre toutes les pins latérales du Arduino Mega mais sans toutefois les exploiter…

tft-dx-volumerate

Un coup de Dremel plus tard, on récupère l’accès aux entrées/sorties A6 à A15 et 14 à 21…

IMG_1934

IMG_1930

Côté PCB, pas de problème pour la découpe puisque aucune piste ne passe par là. Il faut juste faire attention à ne pas toucher l’écran avec la mini scie circulaire du Dremel.

L’amélioration est très intéressante car on récupère l’accès à 18 entrées/sorties! Dans mon cas, l’accès aux liaisons séries 1, 2 et 3 va être tout particulièrement utile. Je vais ainsi pouvoir connecter la puce GPS et la puce Bluetooth en hardware. :)

arduinomega2560_r2_front

Et pour finir un aperçu du prototype actuel démonté et placé sur un support bricolé et décoré avec ma fille (on ne voit pas bien sur la photo mais il y a des planètes et des étoiles dessinées)…

IMG_1940

Pour rappel, le lien vers l’écran TFT 240x400 (7,31€):
http://www.volumerate.com/product/open-smart-touch-screen-expansion-shield-w-touch-pen-for-arduino-450238

Test d'un écran tactile TFT 400x240

Ce weekend, je teste un nouveau modèle d’écran TFT trouvé sur VolumeRate. L’offre est alléchante car pour à peine 20€, on a en plus un Arduino Mega et une carte micro SD de 256Mo…
http://www.volumerate.com/product/450236

kuman-vs-dx

Par rapport au Kuman K60 2.8’’, j’aime:
- Ecran plus grand.
- Résolution de 400x240 contre 320x240 pour le Kuman.
- Meilleur contraste et meilleur angle de vue que le Kuman. On l’aperçoit sur la photo, le Kuman vire vite au bleuté dans les noirs dès qu’on est pas dans l’axe.
- Affichage plus rapide (environ 2x) que ce soit en dessin vectoriel ou lors du chargement de bitmaps depuis une carte micro SD.
- L’écran chauffe moins que le Kuman.
- On dispose d’une sonde de température LM75 intégrée.
- Malgré le gain en taille, ce modèle n’occulte pas les ports supérieurs du Mega...

tft-dx-volumerate


Maj du 25/06 : le nouvel écran permet aussi l’accès au buffer d’affichage contrairement au Kuman. Il m’est ainsi possible de faire des captures d’écran en bmp sur la carte micro SD… :)

screenshot-arduino-red screenshot-arduino-white
Ebauche de viseur polaire (mode nuit à gauche et mode jour à droite).

Sky Catalog dispo sur mon Github

Et voilà pour Sky Catalog. La librairie C++ est dispo sur mon Github avec encore un joli logo d’illustration pour le plaisir...
SkyCatalog
Et pour en savoir plus c’est par ici…
http://em10-usd-arduino-takahashi.eliotis.com/librairies-arduino/skycatalog/index.html

Régulateur Foxnovo HOBBYWING 3A UBEC 5V

Le Arduino supportant une tension Max de 9v, un régulateur sera nécessaire pour le câblage sur batterie 12v. La consommation des moteurs étant relativement limitée (2,32A max avec les deux moteurs à pleine vitesse et l’électronique d’origine), j’ai opté pour un régulateur UBEC 3 Ampères (Foxnovo HOBBYWING 3A UBEC 5V) à 6€ sur Amazon. Cela devrait être suffisant pour l’ensemble…
Foxnovo HOBBYWING 3 a UBEC 5V

Nouvelle librairie SkyCatalog en cours de dev

Ce weekend, c’était bdd (base de données) party!!! But du jeu: créer une base de fichiers sur carte SD pour servir de pseudo base de données d’objets célestes (étoiles, Messier, NGC, IC). Faute de trouver des bases de données homogènes et cohérentes en accès libre sur le web, j’ai opté pour le logiciel Coelix qui permet d’exporter ses données. Simple et efficace, je le recommande vivement.

Une fois les fichiers d’export générés, j’ai ensuite traité les données pour les transformer en une arborescence de fichiers et ne conserver que les données utiles. Ce travail devrait donner lieu à une nouvelle librairie Arduino baptisée SkyCatalog et complétant Ephemeris.

coelix

Arduino sous Xcode

Cela faisait un moment que je bricolais entre Xcode et l’IDE Arduino et ça y est j’ai craqué. Je me suis enfin posé sur le problème afin d’avoir un environnement de travail 100% Xcode. N’en déplaise aux développeurs du projet Arduino, l’IDE d’origine est bien trop juste pour travailler confortablement sur de gros projets.

A noter que si vous recherchez un template dédié pour la dernière version d’Xcode, jetez un oeil à embedXcode:
http://embedxcode.weebly.com

Pour ma part, j’ai préféré opter pour du configuré maison car embedXcode ne supporte que la dernière version 8 d’Xcode voire au mieux 7 au moment d’écrire ces lignes. J’avoue que j’en ai marre de cette marche forcée imposée par Apple pour pousser à migrer sur leur dernier système d’exploitation poussif à souhait.

Mais revenons à nos moutons. Plutôt que d’opter pour des makefiles, je me contente de piloter l’ide Arduino à partir d’Xcode 4 (OS X 10.7.5 oblige) et d’un projet custom. C’est plutôt aisé puisque l’IDE Arduino propose tout ce qu’il faut pour l’accès en ligne de commande. Voir la doc officielle…
https://github.com/arduino/Arduino/blob/master/build/shared/manpage.adoc

Je peux ainsi lancer la compilation et l’upload...
xcode-arduino-1

…tout en éditant mon projet avec « code completion » et toutes les joyeusetés qu’on attend d’un environnement de travail productif.
xcode-arduino-2

Pour l’affichage de la liaison série, j’ai opté pour CoolTerm que je pilote par AppleScript à partir d’Xcode (lancement, connexion/déconnexion, effacement, affichage en avant plan à la fin du transfert). L’ensemble est beaucoup plus robuste et agréable que la console du logiciel Arduino…
xcode-arduino-3

Bref c’est maintenant que du bonheur pour bosser! <3 <3 <3

Ephemeris fait des petits...

S’il est bien une chose agréable c’est de voir le travaille qu’on partage donner vie à d’autres projets. Je vous présent le bébé de Bram van Zoelen en Hollande qui exploite Ephemeris pour son dobson fait maison…

scherm

totaal

full2

La raquette de commande est entièrement réalisée en matériaux de récupération. Pas mal non? :D

Plus d’infos sur le blog de Bram… :)
http://zoelen.net

Librairie RunLoop dispo sur mon Github

Le premier jet de la librairie C++ RunLoop est dispo sur github...
http://github.com/MarScaper/runloop

Logo 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

Dans la continuité des développements pour mon projet d’astronomie, j’ai décidé de mettre au point une nouvelle librairie pour me faciliter la tâche et je l’espère celle d’autres Ardui-bidoulleurs.

RunLoopClassHierarchy
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++.
Plus de détails à venir prochainement avec la publication du code sur mon Github. :)

Test en grandeur réelle du coucher du Soleil

Et c’est parti pour un tour à Guidel plage pendant les vacances pour observer le coucher de soleil en bord de mer. Février? Vous avez bien dit Février?!? Tiens! Des phoques sur des planches! Y sont fous ces Bretons… ;)
sunset arduino ephemeris

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…
sunset arduino ephemeris

Zoom sur la zone centrale de la photographie...
sunset arduino ephemeris
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

PolarisFinder (version simplifiée sans GPS ni Bluetooth) est maintenant intégré dans les exemples de la librairie Ephemeris sur mon Github…

PolarisFinder
https://github.com/MarScaper/ephemeris/tree/master/examples/PolarisFinder

Abaque numérique pour le viseur polaire de l'EM10

Je me souviens très bien de cette nuit de mi-août 1998 où je mettais à l’oeuvre pour la première fois ma flambant neuve EM10. Avec cette monture et le CN-212, j’allais enfin pouvoir passer dans un autre monde: celui de l’astrophotographie et de l’indispensable alignement polaire (aussi appelé « mise en station ») qui va avec.

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…
abaque carton
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…
polaris-arduino-em10

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…

code polaris

La classe à Dallas non?!? ;)

Système solaire embarqué et opérationnel! :)

La boucle est bouclée, Ephemeris est maintenant intégrée au projet EM10 USD Arduino. Les coordonnées du lieu et l’altitude sont initialisées avec la puce GPS. Ici pour le test, les données sont calculées par le arduino de la raquette puis envoyées à ma console Bluetooth de debogage. C’est une affaire qui roule… :)

bluetooth console arduino systeme solaire

Ephemeris dans le gestionnaire de bibliothèque Arduino

Tout est dans le titre de ce billet: le code d’Ephemeris est maintenant compatible avec le gestionnaire de bibliothèque pour une intégration facile dans d’autres projets Arduino.
ephemeris_library_embeded_in_library_manager

Librairie à télécharger ici…
http://github.com/MarScaper/ephemeris

Le matin vient de se lever...

Dernière finitions sur la librairie Ephemeris pour mon Arduino avec la gestion des heures de lever/coucher des astres de notre système solaire. Voilà qui est fait. De quoi allumer l’arrosage automatique lorsque le Soleil se couche enfin si le télescope est pas dehors hein!?! ;)

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

Voilà qui est fait. La librairie Ephemeris intègre les calculs des coordonnées de notre bon vieux satellite. :)

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 ».

ephemeris_include_graph_2

Librairie à télécharger ici…
http://github.com/MarScaper/ephemeris

VSOP87 exit pour les Arduinos de base (Uno, etc)

Le codage de la librairie Ephemeris avance bien et la précision de calcul devrait s’avérer largement suffisante pour le pointage automatique du télescope.

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"

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.

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

J’avance actuellement sur le codage de la librairie Ephemeris. Elle sera dévolue aux calculs des éphémérides pour le Arduino afin de permettre le pointage automatique des astres du système solaire.

arduino-ephemeris-library

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é.

ephemeris_8ino__incl


L’idée est de faire quelque chose d’assez léger et adapté aux possibilités d’un Arduino.

Intégration du GPS dans le projet

Voilà qui est fait. L’horloge a été remplacée par la puce GPS et c’est opérationnel. Lors du démarrage, la raquette se met en attente des satellites jusqu’à localisation. On peut éventuellement shunter cette étape en appuyant sur n’importe quelle touche de la télécommande infra rouge.
screenshot-lcd-gps
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. :)

Ecran déporté de débogage via Bluetooth

Je l’avais évoqué précédemment lors du test de cet écran TFT Kuman et voilà qui est fait: un écran nomade pour afficher les logs lors de la phase de débogage du projet. Il est monté sur un Arduino chinois défectueux (mauvaise gestion des Timers matériel) sur lequel j’ai connecté un module Bluetooth. Dès que l’écran est à proximité de la raquette de commande, il s’appaire automatiquement. Cela va me permettre de remonter des informations utiles pour la phase de mise au point sans forcément avoir besoin d’un PC connecté.

ecran-debogage-bluetooth

Et voici le résultat en vidéo…

https://www.youtube.com/watch?v=Eh7B9osfDkk

Note pour plus tard: plus j’y pense et plus je me dis qu’à terme cela pourrait être assez classe d’avoir un petit écran d’abaque numérique pour le viseur polaire. On allume l’écran. On l’approche de la monture. Il se connecte en Bluetooth et à partir des informations GPS nous affiche automatiquement l’emplacement de la polaire dans le réticule.

Prototypage de la raquette de commande avec OpenSCAD

Quoi de mieux qu’un patron en carton pour faire dans la dentelle? Voici à quoi pourrait ressembler le squelette de la nouvelle raquette de commande de ma monture Takahashi...
em-10-proto-raquette

em-10-proto-raquette2

Pas assez parlant? Ok. Une connaissance de mon Fab lab ayant eu la bonne idée de m’initier à OpenSCAD, voici donc un début d’ébauche que je vais peaufiner avec le temps (le squelette en carton est ici représenté en bleu)…
em-10-proto-openscad
A terme le but est de modéliser l’ensemble des pièces électroniques pour contrôler leur intégration et au final réaliser la raquette de commande avec une imprimante 3D.

Amélioration des performances de l'écran TFT

Pour le fun je me suis amusé à améliorer les performances d’affichage de l’écran TFT. Le résultat en vidéo...

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. :)

Arduino Mega

Ca y est. J’ai reçu un Arduino Mega qui tient la route. Avec ses 54 entrées/sorties, ses 256 KB de mémoire Flash et ses 8KB de SRAM là on commence à avoir un peu de marge! Lol
arduino mega sunfounder
Autre chose intéressante, alors qu’un Arduino Uno dispose d’un seul timer 16 bits matériel (Timer1) le Mega en a 4 (Timer1, Timer3, Timer4, Timer5). Après quelques essais, il s’avère que les timers matériels sont beaucoup plus précis pour la gestion des pulsations de moteurs pas à pas. Avec un Arduino Mega, on peut donc piloter les deux axes avec des timers matériels ce qui est idéal.

Note: attention aux Arduinos chinois. Le premier modèle à bas prix que j’avais commandé sur Ebay s’est avéré avoir des Timers au fonctionnement hasardeux. Ils fonctionnaient au premier chargement du programme et ensuite plus rien après un reset. Heureusement, pas de mauvaise surprise avec ce modèle SunFounder un peu plus cher (18€) commandé sur amazon.

Calculs des éphémérides planétaires

Après une quête peu fructueuse sur le net à la recherche d’une librairie pour Arduino, je décide de m’y coller pour mon projet. L’ouvrage de référence en la matière est « Calculs astronomiques à l’usage des amateurs» par Jean Meeus. Un très bel ouvrage concret édité par la SAF pour seulement 13€. C’est une initiative à saluer car il est rare de trouver des ouvrages spécialisés aussi abordables.

calculs_astronomiques_jea_meeus

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.

Nouveau prototype nomade pour le dev...

Le prototype pour l’EM-10 continue de progresser. Afin de faciliter le développement et d’être moins embêté par les câblages volant, j’ai intégré l’ensemble dans une petite boite en carton. Je peux ainsi travailler de manière plus efficace sur le projet dès que j’ai du temps libre.



Il suffit d’ouvrir le coffret, de le brancher et hop c’est parti pour les devs...



Le prototype en l’état est maintenant quasi complet et constitué des éléments opérationnels suivant:
- Arduino Mega.
- Ecran LCD 16x2.
- Buzzer.
- Led de mise en veille.
- Capteur de température/humidité DHT 11 (qui sera remplacé à terme par un DHT22 pour plus de précision).
- Puce GPS qui remplace l’ancienne horloge.
- Lecteur micro SD en remplacement du premier lecteur SD trop encombrant.
- Puce bluetooth pour la connection sans fil avec un ordi, un ipad ou un iPhone.

Voici une vue côté câblage interne...


Ecran TFT or not écran TFT?

Je continue à faire des folies de mon corps ou plutôt de mon Arduino avec le test d’un Kuman K60 2.8 pouces à 14€.

Kuman K60
https://www.amazon.fr/gp/product/B01C3RDFN6/ref=oh_aui_detailpage_o02_s00?ie=UTF8&psc=1

L’écran offre une résolution de 320x240 en 16bits (65535 couleurs). Au dos on trouve un lecteur de carte micro SD. Et pour le tactile c’est du résistif on ne peut plus commun. Alors autant le dire tout de suite, pour 14€ ce shield est une plagia pur et simple du produit proposé par Adafruit…
2.8" TFT TOUCH SHIELD FOR ARDUINO WITH RESISTIVE TOUCH SCREEN
D’ailleurs, Kuman fournit le code source du driver sur demande uniquement par mail. Et pour cause, c’est une version à peine modifiée du code proposé par Adafruit. Sacrés chinois!!!

roger-rabbit-tft

Les plus:

  • Shield plug & play.
  • Pas cher.
  • Lecteur de carte SD intégré.
  • Qualité d’écran très correcte notamment en mode portrait.

Les moins:
  • Performance d’affichage assez limitées.
  • Utilise quasiment toutes les connections d’un Arduino Uno.
  • Angle de vue optimisé pour un affichage portrait ce qui devient désagréable visuellement si on préfère un usage en mode paysage.
  • L’usage en simultané des librairies pour l’affichage, le tactile et la carte SD consomme quasi entièrement les 32Ko de stockage. L’usage d’un Arduino Mega n’est donc pas du luxe.

Astuce: le remplacement de la librairie SD par la librairie SDFat permet un gain substantiel: l’usage de la mémoire Flash est plus réduit (environ 9% sur un Uno) ainsi que l’usage de la SRAM et les performances sont sensiblement améliorées.

Dans l’immédiat, je ne pense pas utiliser cet écran TFT pour la raquette de commande mais il pourrait être pratique pour concevoir une console de débogage déportée avec une connexion Bluetooth.

Prototype en vidéo...

Détails de l'écran LCD 16x2

Voici quelques captures d’écran du LCD agrémenté d’un début d’iconographie maison. En plus des caractères standards ont peut ainsi créer jusqu’à 8 caractères spéciaux en simultané donc je me suis amusé un peu :).

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).
ecran-lcd-16x2

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.
Sondes em 10

Début du prototype


Voici un aperçu du prototype destiné à valider les premiers composants du système de commande. Ok, c’est un peut « roots » mais l’essentiel est là...
em10-proto1

En complément du kit, un lecteur de carte SD (situé à proximité de la télécommande sur la photo) a été ajouté pour le stockage de la base de donnée d’objets célestes.

Observations:
- Je pensais que l’afficheur LCD 16 caractères sur 2 lignes serait un peu juste mais c’est pas si mal.
- Le capteur d’humidité du kit est un DHT-11. Il fait le job mais sa précision de +-2°c n’est pas idéale. Prévoir de le remplacer par un DHT-22.
- Le lecteur de carte SD est un peu gros. Je vais le remplacer par un lecteur micro SD plus compact.
- L’Arduino Uno du prototype est déjà au taquet niveau entrées/sorties et la librairie du lecteur SD est assez gourmande en mémoire. Il va falloir passer à un Arduino Mega pour tenir la route.

Un kit Arduino comme base de travail

L’idée étant d’optimiser les coûts, ce kit payé 55€ chez DX me semble un bon point de départ…
http://eud.dx.com/product/uno-learning-kit-for-arduino-with-ir-1602lcd-relay-temperature-humidity-clock-module-resistor-card-844424271
Attention: prévoir un délai d’un bon mois pour réception.
uno learning kit for arduino
Listing du kit (in English sur le site):
1 x UNO main board
1 x 1602 screen
1 x Stepper motor driver board
1 x Temperature humidity module
1 x Clock module
1 x 1 relay module
1 x 400 holes breadboard
1 x Small breadboard
1 x Fixed board
1 x Battery box (6 x AA, 15cm-cable)
4 x Button switches
3 x Photoresistors
1 x Flame sensor
2 x Buzzers
1 x Temperature sensor
2 x Tilt switches
1 x IR receiver
1 x LED light
1 x Adjustable resistor
1 x 74HC595
1 x Remote controller
1 x 1-digit seven-segment display
1 x 4-digit seven-segment display
1 x 8x8 dot matrix
1 x 9g servo (25cm-cable)
1 x Stepper motor (23cm-cable)
10 x Jumper wires (10cm)
20 x Jumper wires (20cm)
10 x DuPont wires (20cm)
1 x USB cable (139cm)
8 x 220R resistors
5 x 1K resistors
5 x 10K resistors
5 x Red led
5 x Yellow led
5 x Blue led
1 x Resistor card
1 x 16 pin header
1 x Box

Les éléments qui me semblent les plus intéressants:
- Un contrôleur Arduino Uno pour commencer le prototype.
- Un écran LCD deux lignes pour l’affichage.
- Un capteur IR avec une télécommande plutôt bien adaptée pour nos besoins.
- Un buzzer pour les effets sonores (ex: signalement fin de pointage).
- Led pour la mise en veille.
- Horloge avec pile.
- Capteur d’humidité/température pour les mesures ambiantes.
- Capteur de température simple pour le miroir.
- Un moteur pas à pas et son circuit de puissance pour se faire les dents (utilisable pour se faire une mise au point électrique à terme?).
- Capteur d’inversion pour la position du télescope (détection du pointage Ouest ou Est).
- De quoi voir venir pour câbler le prototype et vérifier la faisabilité du projet.

Présentation du projet

Bienvenue sur mon blog dédié à l’amélioration de ma monture d'astronomie Takahashi EM10 USD. L’idée de base est assez simple: utiliser les possibilités d’un Arduino, et la pléthore de modules électroniques bon marché qui entourent ce petit contrôleur, pour mettre cette légendaire monture au gout du jour. Les améliorations possibles ne manquent pas:
  • Calibration plus précise de la vitesse sidérale.
  • Rattrapage automatique du backslash sur la déclinaison.
  • Correction d'erreur périodique par modulation de fréquence.
  • Interface d'autoguidage modernisée (genre protocole LX200).
  • Goto relatif.
  • Etc.
Par l'intermédiaire de ce blog, je vais essayer de vous partager l'aventure de mes investigations à mesure que j’avance sur mon projet. Bonne lecture et n'hésitez pas à souscrire au flux RSS pour être notifié des nouveaux articles.

Librairie Ephemeris dispo sur mon Github

Le premier jet de ma librairie C++ Ephemeris est dispo sur 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. :)