Rolex calculée par Nextion |
Maj : 18/02/20
Abstract :
Résumé : |
L'absence des fonctions trigonométriques
Dans toutes les applications graphiques, vous trouverez le même principe :
Afficher instantanément (temps négligeable !) une image incluse dans le .HMI, élaborée sous Photoshop comme fond d’écran.
Poser par-dessus les couches d’objets calculés.
Créer une aiguille réduite à un pixel d’épaisseur est simple, mais ce n’est pas très joli :
La fonction line suffit en lui indiquant coordonnées de départ, d’arrivée, et la couleur.
Les coordonnées se calculent par les fonctions sinus alpha et cosinus alpha (voir plus loin).
Pour épaissir l’aiguille c’est un peu plus compliqué :
Il faut calculer les coordonnées des extrémités des vecteurs perpendiculaires à l’axe initial, de longueur « d », distance du nouveau segment parallèle à l’initial.
On utilisera pour cela sinus (alpha + 90°) et cosinus (alpha + 90°), pour chaque « d » nécessaire.
Exemple pour une épaisseur de 5 (valeur toujours impaire car on ajoute des segments de part et d’autre de l’initial) : d = 2 , 1, -1 ,-2
Pour la pointe triangulaire, vous verrez que c’est un peu plus compliqué, car les segments ne convergent pas sur la pointe mais en décalé pour éviter les effets de moirage (l’éclaté le montre bien, en espaçant les segments ajoutés). Cela est expliqué dans un chapitre suivant "aiguille complexe".
Le cœur des programmes est dans l’onglet timer qui lance le calcul de chaque nouvelle page au changement de condition angulaire.
J’utilise les diverses méthodes possibles pour calculer les indispensables sinus et cosinus absents.
Cela impose d’utiliser l’EEPROM car il est impossible d’exploiter la RAM de l’ESP32, ce qui impose la version enhanced, la basique ne disposant pas de mémoire.
Le principe général est de calculer des tables (voir les exemples sur Arduino) et de récupérer le résultat sur le terminal, puis de faire un copier-coller dans la page d’appel du Nextion.
Exemple de création de la table :
wepo « valeur 0 calculée », 0 // 0 = première adresse
wepo « valeur 1 calculée », 4 // 4 = deuxième adresse
etc.
La lecture et l’écriture sur le Nextion se fait par bloc de quatre octets (64 bits), il faut exploiter au maximum cet espace pout l’efficacité maximale.
Première méthode : 60 positions
Première méthode, pour des aiguilles d’horloge, il suffit de 60 positions.
Chaque valeur stockée contiendra sinus et cosinus ainsi :
(30000 * sinus Alpha) + 65536 * (30000 * cosinus Alpha)
Ce facteur 30000 permet d’exploiter au mieux la dynamique pour contourner l’absence de valeurs flottantes, en faisant les calculs en entier pour diviser au dernier moment et récupérer des positions avec le meilleur arrondi 0 < X < 800 et 0 < Y < 480.
Dans 2 octets l’espace est de +/- 32768, la valeur +/- 30000 est le compromis le plus pratique.
Pour récupérer les valeurs utiles, il suffira de faire :
Ne pas confondre < % > = modulo, et < / > = divise. C’est tout simple, il ne reste ensuite qu’à bricoler les valeurs. |
var.val = repo minute *4 X.val = var.val%65536 (ou %0x10000 en hexa) Y.val = var.val/65536 (ou /0x10000) |
Après avoir testé les diverses méthodes, une grosse erreur de conception est apparue !
L’aiguille trotteuse se déplace par à-coups de 6 degrés à chaque seconde, ce qui est normal pour une vraie montre. Il n’y a que sur les chronomètres analogiques à l’ancienne, que l’aiguille tourne de manière continue. Nous oublierons ce cas particulier impossible à réaliser à cause de la lenteur du Nextion.
La trotteuse sautant de seconde en seconde est donc très réaliste en utilisant la méthode des 60 positions.
Le problème est avec la représentation des aiguilles des minutes et des heures, car les sauts de 6 degrés ne sont pas du tout réalistes. Sur une vraie montre les déplacements semblent continus car les aiguilles tournent d’un écart infime à chaque seconde.
C’est ce qu’il faudrait arriver à simuler.
En pratique, on ne peut faire mieux que des pas d’un degré, au vu de la résolution limitée de l’écran, ce n’est pas parfait mais suffisamment réaliste.
Il faudra résoudre au mieux les calculs des sinus sur 360 positions plus les cosinus, ce qui est tout sauf trivial, sachant que les appels de fonctions sont interdits…
Deuxième méthode : 0 ... 360 degrés
Deuxième méthode plus générale pour calcul 0 ... 360 degrés.
Tous les sinus et cosinus d’un angle quelconque peuvent être déduits de cette table.
On commence toujours par multiplier avant de diviser pour ne pas perdre en résolution (pour simplifier, je n’ai pas fait d’arrondi), le Nextion utilisant 32 bits pour un entier étant de +/- 2 147 483 648, il y a de la place.
Il n’existe pas de méthode plus simple et efficace à ma connaissance. |
if(angle.val<90) cos.val+=240 |
Pour illustrer l’intérêt d’utiliser les fonctions sinusoïdales en graphisme, nous allons montrer comment créer des aiguilles complexes sur un cadran de montre ou de galvanomètre.
Il est très facile de dessiner une aiguille simplifiée, limitée à un simple segment d’un pixel :
Il faut d’abord définir les diverses grandeurs.
° Le centre, l’axe de l’aiguille, de coordonnées Xc, Yc
° La longueur de l’aiguille R1 (en nombre de pixels, toujours positif)
° La base de l’aiguille R0.
°° Si R0 = 0, l’aiguille part du centre.
°° Si R0 > 0 (avec R0<R1) aiguille décalée du centre.
°° Si R0 < 0, l’aiguille dépasse vers l’arrière comme la trotteuse de la Rolex.
° Il ne reste plus qu’à fixer l’angle Alpha (en choisissant ce que l’on veut comme angle 0 degré) et nous avons tout pour calculer le segment minimaliste de notre aiguille de 1 pixel d’épaisseur, de coordonnées X0, Y0 et X1,Y1.
Le calcul des coordonnées est élémentaire :
X0= Xc + R0 * sin (Alpha) | Y0= Xc + R0 * cos (Alpha) | X1= Xc + R1 * sin (Alpha) | Y1= Xc + R1 * cos (Alpha) |
Une seule instruction crée ce segment sur le Nextion : line X0, Y0, X1,Y1, color
Avec cette méthode il est possible de créer n’importe quelle aiguille tarabiscotée.
Le programme de démonstration des aiguilles complexes
Voici un logiciel de démonstration qui montre en pratique comment se construisent les aiguilles, en mode très ralenti et éclaté.
Le curseur de droite permet de régler l’espacement de l’éclatement, au minimum la distance est de 1 pixel correspondant à une aiguille normale.
Le cœur des pages et dans le timer tm0 qui contient le plus gros du logiciel qu’il faudra comprendre.
Après installation du logiciel Nextion Editor, vous pouvez le tester sans avoir un vrai Nextion en utilisant le mode simulateur incorporé.
Ce logiciel fonctionne bien, le seul reproche lors de la compilation ou debug est que les messages d’erreurs sont trop peu explicites et parfois confus.
Il faut développer par petites étapes, tester et en cas d’erreur repartir de la dernière version sans bug pour avancer.
Les warnings sont souvent peu clairs, mais il faut essayer de tous les éliminer.
Dans l'éditeur, il faut d’abord déclarer le hardware, 7 pouces enhanced, horizontal. (La version "basic" non enhanced ne peut absolument pas fonctionner par manque de mémoire.)
Une fois le programme chargé, lancez Debug et testez toutes les possibilités avant de décortiquer le logiciel.
Focalisez-vous d’abord sur le timer tm0 qui contient le cœur du logiciel et fixe le temps entre les actions.
Il faut considérer cela comme un exercice de style visant à pousser le Nextion dans ses limites, mais ce n’est pas la voie à adopter à cause des incompréhensibles carences du produit, dont l’impossibilité d’implanter la moindre fonction. Ce n’est qu’un prétexte pour faire travailler le cerveau.
La méthode par calcul via Arduino est bien plus simple, mais le résultat est plombé par la lenteur des lourds transferts série.
J’ai persisté sur le Nextion seulement à cause de l’écran tactile, mais je suis passé à d'autres solutions...
Tous les détails et logiciels sont dans cette page à jour au : 220511 |