Bonjour,
Pour la mémoire, super site, je vais le visiter plus en détail.
Je suis un fan de TME. Choix suffisamment large, prix excellents, livraison du jour pour le lendemain si la commande est passée avant 15h pour un tarif raisonnable.
Enfin, concernant la mémorisation des positions des servos en cas de coupure de courant, j'ai prévu un monitoring des tensions par les entrées analogiques de l'Arduino. Qu'en penses-tu?
J'y ai pensé aussi au début mais ça ne fonctionnera pas. En effet, la tension de référence pour la conversion analogique numérique est la tension d'alimentation (ou bien dérivée de la tension d'alimentation). Si la tension d'alimentation chute, la référence chute également. Par conséquent une lecture analogique de la tension d'alimentation renvoie 1023 quelque soit la tension d'alimentation. La chute n'est donc pas détectable de cette manière.
La question qui subsiste est le temps dont on dispose pour sauvegarder les données. Si les servos sont à l'arrêt et en butée, un octet suffit, chaque bit représentant la position, droit ou dévié, de chaque servo. Mais si on veut également gérer le fait qu'un ou plusieurs servos sont en cours de déplacement au moment de la coupure, il faut mémoriser la position, entre 500 et 2500, donc 2000 valeurs possibles, de chaque servo. Il faut 12 bits par servo, soit 12 octets en tout. Il faut également 2 bits de plus par servo pour déterminer si il était à l'arrêt, en mouvement vers l'angle min ou en mouvement vers l'angle max. Donc 2 octets de plus. Dispose-t-on de 14 x 3,3ms = 47ms avant que le programme plante et/ou que l'EEPROM ne soit plus programmable ? Une autre solution est de ne pas sauvegarder les 12 bits par servo mais seulement les 8 bits de poids fort et d'oublier les 4 de poids faible, on peut ajuster ce poids fort si le poids faible est > 7 pour n'avoir qu'une erreur maximum de 3 bits = 8µs en plus ou en moins. Sachant que 8µs représente une erreur d'angle de 8/2000 * 180 = 0,72°, ça me semble tolérable. On économise 4 octets et on tombe à 33ms. On peut également tolérer une erreur plus importante, surtout dans la manœuvre d'un aiguillage, et intégrer les 2 bits d'état dans l'octet qui code la position et l'état d'un servo. On a alors 5 bits d'erreur, soit 32µs maximum et un angle de 2,88° ce qui me semble aussi tolérable, sachant que les angle min et max mémorisée par ailleurs ne seront pas dépassés. On tombe alors à 8 octets et donc 26,4ms de temps d'écriture.
On peut également décider qu'on ne fait bouger qu'un seul servo à la fois. Dans ce cas il y a beaucoup moins de chose à mémoriser : 1 octet pour la position des servos qui sont en butée, 4 bits pour spécifier quel servo est en mouvement (il faut un bit pour dire « aucun n'est en mouvement »), 1 bit pour indiquer dans quel sens il bouge et le reste pour sa position. On est à 3 octets, soit 10ms.
Dans le manuel, il est aussi fait mention de taille de page pour l'EEPROM. Une page fait 4 octets. Visiblement une page peut être écrite d'un seul coup. Dans ce cas, peut être que 3,3ms suffisent pour écrire nos 3 octets. Le bibliothèque EEPROM gère-t-elle l'écriture par page ? Je je sais pas, il y a une étude à faire
De combien de temps dispose-t-on ? Le micro tourne à 16MHz et page 316 du manuel, on a une courbe qui définit une zone de fonctionnement sûr en fonction de la tension d'alimentation et de la fréquence. La tension min à 16MHz se situe vers les 4V. Le circuit de surveillance que j'ai vu déclenche à 4,3V mais un diviseur de tension peut le faire déclencher avant, 4,6 ou 4,7 V par exemple.