10) Paramétrages informatique pour l’adaptation logicielle.

Incontournable, heureusement pour vous cette étape bien que cruciale ne sera vraiment pas délicate à conduire avec succès. De plus, divers programmes utilitaires sont ajoutés au didacticiel pour rendre élémentaire cette phase logicielle. Philosophiquement, l’opération consiste à fournir au programme d’exploitation des valeurs qu’il ne peut pas déterminer lui-même. On fournit ainsi des constantes numériques, (Numériques ou chaînes de caractères …) sous forme de directives du genre #define identificateur valeur. L’identificateur est un nom qui désigne la constante, et qui doit symboliser de façon évidente la grandeur concernée. La valeur qui suit l’identificateur est généralement un nombre. En fonction de ce que l’on fournit, ce dernier sera automatiquement interprété comme un entier ou un float par le compilateur. Ces valeurs risquent fort de se voir ajustées ou modifiées à plusieurs reprises durant le développement logiciel. C’est la raison pour laquelle il est très important de toutes les regrouper dans une zone parfaitement délimitée et en tête du code source. Pour repérer facilement les lignes de code, ces dernières sont généralement terminées par un commentaire précisant la nature de la donnée, suivi d’une ribambelle de @@@@@@@@@@@@@ très facile à retrouver quand le texte défile à l’écran de l’éditeur de l’IDE.

Normalement, quand on désire mesurer une tension comme c’est le cas sur A7 par exemple, on doit utiliser des résistances de précision, ces dernières n’étant pas forcément faciles à trouver ou d’un prix d’achat notable. Hors l’informatique élimine royalement cette contrainte, car on prend des composants ordinaires à 5% de précision. Et, par logiciel on ajuste des constantes pour obtenir la précision de mesure maximale compatible avec la définition des convertisseurs analogiques numériques de l’ATmega328. Dans ces conditions on peut aisément atteindre mieux que 0,5% en précision, à condition toutefois d’avoir une référence fiable pour effectuer les manipulations. C’est à dire un multimètre capable de mesurer au moins à cette finesse. Soyons honnête, ici rechercher une telle rigueur est strictement hors propos, toutefois, la méthode sera strictement identique le jour où l’application envisagée le méritera. Nous allons posément passer en revue les divers paramètres à initialiser dans le programme P07_Programme_Complet.ino, et surtout la méthode à adopter pour en déterminer les valeurs, la Fig.42 recopiant l’une des deux zones des définitions concernées.

Constantes d’ordre général.

Présentes dans tout programme un tant soi peu cossu, elles concernent divers items et en particulier les constantes pour « appointer » les résistances servant à mesurer des éléments électriques. La Fig.42 reproduit cette section de déclarations, dont la nature est clairement identifiée par le commentaire (1). Sur ce listage, les identificateurs sont coloriés en vert et les valeurs numériques associées en violet. En ligne (2) la valeur est une chaîne de caractère, donc coloriée en bleu pour copier l’éditeur de l’IDE. Préciser la date de développement d’un programme peut sembler « flonflon ». L’expérience de la programmation durant plusieurs décennies m’a prouvé que cette information dérisoire peut prendre toute son importance, et en particulier quand on a « ventilé » les fichiers sur plusieurs disques durs externes pour des raisons de sécurité. Arrive forcément le jour où vous constatez que tous n’ont pas forcément la bonne date. Lequel est le bon ? Le dernier est-il bien celui publié sur Internet ? (N’oubliez-pas que le développement logiciel s’effectue sur plusieurs mois et que régulièrement on « dispatche » … pas forcément sur tous les supports.)
Les ligne (3) et (4) sont relatives à un thème commun, celui du calibrage des ponts de mesures.

Calibrer des shunts de mesurage.

Opération élémentaire, la seule obligation réside dans la possession d’un multimètre précis et fiable. Pour illustrer ce propos, nous allons commencer par la mesure de la tension fournie par l’alimentation de puissance, avec pour préambule impératif la lecture du contenu de l’encadré situé en fin de ce chapitre. L’entrée analogique A7 est chargée de cette mission. Comme la tension à mesurer fait 5V, on penserait qu’il est possible de l’injecter directement sur A7. Ce n’est pas idéal, car l’alimentation de puissance peut fort bien se voir ajustée à plus de 5V par erreur, intercaler une résistance en entrée protégera l’électronique interne au microcontrôleur. Si l’on veut mettre à contribution une plage importante de CAN, il ne faut pas trop diminuer la tension U. En reprenant les éléments précisés dans l’encadré situé en fin de ce chapitre : R2 / (R1 + R2) on déduit une valeur pour la constante égale à : 1 / (1 +0.27) » 0,7874015. On obtiendra exactement 5v théorique sur la broche An pour 6.35v en entrée U.
(Tension calculé avec : 5 / 0,7874015 » 6.3500006)
Cette tension exacte de 6.35v engendrera une numérisation de valeur entière 1023. Donc, le coefficient théorique pour obtenir la valeur de la tension réelle exprimée en volts est : Coefficient théorique = 6.3500006
En tête de programme on place la directive #define Calibre_U_moteurs 6.35

Notez au passage que pour effectuer la manipulation, on se contente de récupérer le +5Vcc disponible sur le connecteur HE14 et l’on peut ajuster la tension avec un potentiomètre de 2,2kΩ. Il faut utiliser une valeur faible, pour minimiser la perturbation par la sortie, sur le curseur fortement « chargée » par la résistance de 1270Ω constituée par le pont diviseur.

Globalement, pour déterminer le coefficient le la directive „ on procède de façon totalement analogue, sauf que cette fois, le pont diviseur est constitué par une résistance R2 qui présente la particularité de voir sa valeur varier en fonction de la température. S’engager dans de belles formules pour calculer un coefficient initial, puis le corriger après une manipulation de mesurage n’est pas une approche optimale, car la valeur de R2 n’est pas connue. On peut éventuellement la mesurer, mais alors la méthode ne sera pas plus rigoureuse. Aussi, l’approche la plus pragmatique consiste à utiliser une instruction qui détermine directement la valeur de la tension compte tenu des caractéristiques du CAN. Puis, multimètre en témoin on compare la réalité à ce qu’affiche le programme et l’on calcule alors la valeur du paramètre de correction. La logique du logiciel invite à écrire une fonction qui à son appel retourne directement sous la forme d’un int (Car le CAN traitant sur 10 BITs retourne par nature un nombre entier.) la valeur de la tension mesurée. Pour cette approche, la première forme d’écriture en C++ pour cette fonction serait :
int Tension_capteur_temperature() {return analogRead(Entree_thermistance) * 5 / 1023;}
Comme l’instruction débute par l’indication du type de variable, il s’agit d’une fonction et non d’une procédure. Cette dernière retournera un entier. On se doute que Tension_capteur_temperature est l’identificateur de cette fonction, et dans cette dernière Entree_thermistance précise la broche du microcontrôleur dont on va utiliser le CAN. Dans les déclarations, #define Entree_thermistance 15 précise à P07_Programme_Complet.ino que l’entrée concernée sera A1. Quand on effectue un échantillonnage avec analogRead le CAN retournera, théoriquement, la valeur 1023 si en entrée on injecte exactement 5Vcc. Puis, le « Sketch » étant téléversé sur le microcontrôleur et affichant le résultat du traitement sur l’afficheur OLED, avec le montage élémentaire de la Fig.44 on compare cette donnée à la réalité. Il y a une très forte probabilité que dans la pratique on constatera une différence. En effet, une conversion Analogique vers Numérique impose à l’électronique de traitement de comparer la tension mesurée à une tension de référence interne au microcontrôleur. Par défaut, sur Arduino NANO c’est la valeur de la tension d’alimentation +Vcc qui sert de référence. Hors une prise USB n’est pas une alimentation de laboratoire et on peut facilement trouver des valeurs comprises entre 4,85 et 5,25v. Un terme correctif sera alors nécessaire pour « rétablir la vérité ». On peut alors déterminer facilement par un calcul de proportionnalité la valeur d’un coefficient multiplicateur de correction. Comme cette constante est fractionnaire, l’instruction va forcément retourner une grandeur numérique de genre réel, son type devient un float :

Comme sur la prise USB de l’ordinateur utilisé on trouve un peu moins de 5Vcc, le CAN retourne une valeur légèrement supérieure à celle réellement mesurée. La constante de correction nommée Calibre_U_Thermistance est donc un peu plus faible que la valeur théorique de 5 et appliquant la formule Coef de remplacement = Coef actuel / Valeur affichée * Valeur réelle mesurée qui reste valable on en déduit la valeur de la directive :

Déduire de la tension sur A1 la valeur de la température.

À partir du moment où l’on désire établir un lien entre une valeur numérique et un phénomène physique, il nous faut forcément un moyen de mesurer ce dernier. Considérons le tableau de la Fig.3 sur la fiche Comportement du capteur de mesure thermique de la feuille (9). On commence
par établir ce dernier, ce qui impose de chauffer à convenance la thermistance. Un sèche-cheveux fait merveille. Pour établir la relation entre la tension mesurée sur A1 et la température, on se débrouille pour disposer d’un thermomètre « à mercure » de petite dimension. Pour ma part, j’ai retiré la colonne en verre contenant l’alcool rouge du support en bois d’un modèle « rustique ». Je dispose ainsi d’une petite tige en verre facile à immobiliser bien en contact thermique avec la bride 6 sur les Fig.40 et Fig.41 sachant que le flux d’air chaud sera relativement homogène dans toute la zone soufflée.

Lorsque un graphe analogue à celui de la Fig.4 sur la fiche Comportement du capteur de mesure thermique de la feuille (9) aura été établi, il sera aisé de déterminer les constantes des directives (5) et (6) de la Fig.42 pour définir les derniers paramètres « généraux ».


Pas la peine de se prendre la tête pour les deux directives (7) et (8) de la Fig.42 qui concernent uniquement le positionnement sur l’écran graphique des pixels du thermomètre symbolique. Ces deux directives ne font qu’établir une correspondance entre les valeurs extrêmes 33°c et 40°C choisies par le programmeur pour la plage de températures visualisées, et la position de la « colonne de mercure » visualisée sur la matrice de PIXELs de PAGE6() et de PAGE8() sur OLED.
Au final, il faut cinq pages de « palabres » pour expliciter la procédure de calibration de deux ou trois paramètres, qui vont dans la pratique se résumer à deux ou trois mesures suivies de l’ajustement de deux ou trois constantes suite à deux ou trois petits calculs de proportionnalité. Et bien pour le bloc de données vitales relatives aux servomoteurs … c’est encore plus simple !

Paramétrages informatiques pour la motorisation.

Bien délimité par deux lignes de commentaires et par « un encadré d’étoiles », le bloc de directives recopié sur la Fig.46 peut impressionner par le nombre de paramètres définis. Ce n’est qu’une illusion pour « faire peur », car il est infiniment plus simple à renseigner que pour les paramètres généraux. En effet, ici il n’y a pas besoin de brancher des appareils de mesures ou un thermomètre. Quand aux manipulations, elles sont d’une simplicité déconcertante.


La fiche Paramètres d’adaptation du logiciel au matériel de la feuille (10) précise en détails la nature de chaque identificateur. Quand le bras manipulateur est totalement opérationnel, c’est à dire que la Vérifications et validation du circuit principal a été entièrement effectuée, y compris le Protocole de mise en service du bras, on se familiarise avec les commandes USB. Quand on a grosso modo bien cerné les diverses instructions, on passe en pilotage Mouvements indiqués en mode CONSIGNE avec la commande ‘!‘. Puis, en évitant d’envoyer des valeurs qui engendrent la divergence de l’asservissement, on réalise un tableau analogue à celui de la Fig.1 en remplaçant les valeurs de consigne pour les moteurs du prototype par celles relatives à votre motorisation. Il ne reste plus qu’à remplacer dans le bloc de la Fig.46 les huit paramètres de type Csn par les vôtres. Pour mémoire, ces manipulations se font avec les servomoteurs non intégrés sur le bras manipulateur.

La suite est ici