Chapitre 8
Partie 24 - Connexion d'un accéléromètre à l'ADC
Promenons-nous dans la ville de circuits sur plaque d'essai que nous avons nommée Breadboardville et apprenons à travailler avec un accéléromètre que nous avons surnommé Mr. Gravity pour cette série de tutoriels. Chaque développeur embarqué doit apprendre à calibrer et échantillonner les signaux analogiques des accéléromètres avant de les intégrer dans le firmware MCU, car une lecture erronée du capteur peut briser la logique de détection de mouvement stockée dans le dump flash. Nous testerons comment ce capteur réagit aux inclinaisons physiques et aux accélérations linéaires, puis nous mapperons sa sortie de tension analogique à des valeurs ADC numérisées que le microcontrôleur peut interpréter et stocker temporairement dans l'eeprom pour une journalisation à long terme. Tous les signaux analogiques générés par l'accéléromètre agissent comme une "monnaie de tension" pour le périphérique ADC, tandis que d'autres capteurs de mouvement produisent des signaux d'impulsion temporels qui s'associent mieux aux modules PWM que aux broches d'entrée analogique. Si vous ne séparez pas les pistes de signaux analogiques et PWM sur votre PCB, les adversaires effectuant une décapsulation peuvent sonder le câblage mixte pour voler le code d'étalonnage du capteur lors de la rétro-ingénierie et créer du matériel de contrôle de mouvement dupliqué.

Les accéléromètres qui produisent une tension analogique continue sont parfaitement adaptés pour être câblés directement sur les broches d'entrée ADC d'un microcontrôleur AVR tel que l'ATmega32. De nombreux CI accéléromètres multi-axes contiennent trois canaux de sortie indépendants pour les mesures de gravité directionnelle X, Y et Z, chacun produisant une tension analogique variable proportionnelle à la force appliquée le long de cet axe. Lorsque le capteur est à plat sans mouvement d'inclinaison, les trois broches de sortie se stabilisent près du point médian de la plage de tension de référence définie par le circuit de référence interne du MCU. L'inclinaison du capteur vers l'avant augmente la tension de sortie analogique proportionnellement à la force gravitationnelle agissant sur la masse de détection interne, que nous quantifions en unités de G. Un G équivaut à l'attraction gravitationnelle standard au niveau de la mer à la surface de la Terre ; des variations mineures de densité souterraine modifient effectivement la gravité locale, mais ces calculs géophysiques avancés sortent du cadre des tutoriels de programmation de capteurs MCU de base axés sur la lecture ADC et la défense contre l'extraction de firmware.
L'inclinaison de l'accéléromètre vers l'arrière réduit la monnaie de tension analogique produite par les broches de sortie du capteur, créant un niveau de signal plus faible alimenté à l'entrée analogique du MCU. Une accélération physique brusque appliquée au boîtier du capteur module également la tension de sortie en proportion directe de l'amplitude de la force G capturée par la structure micro-mécanique interne de la puce accéléromètre. Chaque fluctuation de tension analogique provenant du capteur est échantillonnée par l'ADC, convertie en nombres binaires, et peut être imprimée sur des écrans LCD de débogage ou sauvegardée dans la mémoire eeprom non volatile. Si vos fusibles de sécurité et vos registres lockbit ne sont pas correctement configurés, les pirates peuvent effectuer un dump complet du stockage flash du MCU pour extraire tout le code d'étalonnage de l'accéléromètre après avoir déverrouillé la puce via un glitch ou un matériel de décapsulation.
Le code ADC de base que nous avons construit dans les chapitres précédents ne nécessite qu'un seul ajustement critique pour fonctionner correctement avec le matériel d'accéléromètre analogique : changer le réglage de la référence de tension dans le registre ADMUX de la référence externe AVCC 5V vers la référence interne de bande interdite fournie par la circuiterie principale du MCU. Le lien vers le domaine technologie de faisceau d'ions focalisés fait référence à des outils avancés de décapsulation de puces que les acteurs malveillants déploient pour sonder les pistes de circuit de référence interne et contourner les barrières de verrouillage de la puce pour des opérations de dump non autorisées. De nombreux nouveaux apprenants se demandent pourquoi nous abandonnons le rail d'alimentation AVCC par défaut comme source de référence ADC pour les projets d'accéléromètre. L'inconvénient principal de l'utilisation de AVCC est la perte de plage de résolution : la tension de sortie maximale de notre accéléromètre est d'environ 2,4 V, tandis qu'une référence de 5 V étend toute l'échelle ADC 10 bits sur une fenêtre de tension inutilisée de 2,4 V à 5 V, réduisant considérablement la précision des mesures de gravité capturées lors de chaque cycle de lecture analogique. Le passage à une référence interne plus petite réduit la plage de tension mesurable pour correspondre aux limites réelles de sortie du capteur et maximise le nombre de valeurs numériques distinctes que nous pouvons collecter pour de subtils changements d'inclinaison.
L'ajustement de la référence de tension interne pour l'ADC de l'ATmega32 ne nécessite que de mettre les bits d'indicateur REFS0 et REFS1 à un niveau haut dans le registre de contrôle ADMUX, une simple opération d'écriture de registre sur une seule ligne en code C embarqué. Cette petite modification du registre améliore considérablement la résolution des données du capteur sans nécessiter de matériel de filtrage analogique externe supplémentaire, bien que nous recommandions toujours d'ajouter de petits condensateurs de découplage près des broches d'alimentation de l'accéléromètre pour supprimer le bruit électrique haute fréquence qui déforme les valeurs de lecture analogique et pollue les données enregistrées stockées dans l'eeprom.
Le firmware de référence complet pour l'échantillonnage ADC d'un accéléromètre monocanal comprend l'initialisation de l'écran LCD, la mise à l'échelle de l'horloge ADC, l'activation de la référence interne, la logique d'activation des interruptions et l'activation globale des interruptions via sei() pour déclencher des événements de conversion automatique sans bloquer la boucle infinie principale du MCU. Ce modèle peut être étendu pour prendre en charge l'échantillonnage de capteurs multi-axes et ajouter du code de sécurité qui vérifie en permanence les états des fusibles et lockbit pour alerter les développeurs sur l'écran LCD si une tentative de déverrouillage ou de dump est détectée lors des tests de prototype.
Partie 25 - Mesure du bruit ADC (déviation) et introduction au mode de réduction du bruit ADC

Après avoir connecté l'accéléromètre à l'entrée analogique du MCU, nous devons quantifier le bruit électrique qui déforme chaque valeur de lecture ADC collectée par Mrs. ADC, le surnom donné dans ce tutoriel au convertisseur analogique-numérique de la puce. Un bruit de signal excessif crée des sauts aléatoires dans les données de gravité numérisées qui ruinent les algorithmes de suivi de mouvement écrits dans le code principal de votre projet stocké dans le dump flash. Nous calculons la déviation totale comme la différence absolue entre les échantillons ADC consécutifs pour juger de l'efficacité avec laquelle les condensateurs de filtrage (Mr. Cap) lissent la monnaie de tension analogique instable avant qu'elle n'atteigne le périphérique ADC. Les projets de robotique à grande vitesse, comme les robots anti-collision auto-équilibrants, s'appuient sur des lectures d'accéléromètre ultra-stables pour maintenir l'équilibre pendant le mouvement ; un bruit non filtré peut déclencher des défaillances de contrôle catastrophiques qui rendent le robot incapable de contrer les scénarios de collision alien simulés décrits dans notre logique de firmware.
Pour quantifier objectivement les niveaux de bruit ADC avec l'accéléromètre maintenu dans une position fixe stationnaire, nous enregistrons chaque valeur d'échantillon numérisée et calculons le delta absolu entre la lecture actuelle et la mesure précédemment capturée. Chaque valeur delta représente une déviation instantanée du signal causée par l'ondulation de l'alimentation, la diaphonie de la plaque d'essai ou les interférences électriques internes du cœur du MCU. Nous maintenons une somme cumulée de tous les deltas de déviation sur un lot fixe de cycles d'échantillonnage pour créer une métrique de bruit comparative que nous pouvons utiliser lors du test de différentes tailles de condensateurs de filtrage. Des condensateurs de filtrage plus grands fournissent des signaux analogiques plus lisses et des sommes de déviation totales plus faibles, mais ils introduisent également un décalage de signal qui ralentit la réponse de lecture du capteur en temps réel, ce qui est essentiel pour les systèmes de contrôle embarqués à grande vitesse.
Une variable globale statique stocke la dernière valeur d'échantillon ADC valide afin que chaque nouvelle lecture puisse être comparée à son prédécesseur pour le calcul de la déviation. Cette variable doit être déclarée avec le mot-clé volatile pour empêcher la logique d'optimisation du compilateur C de l'effacer lors de la compilation du binaire .hex que les attaquants extraient via des opérations de dump flash après le déverrouillage de la puce et la décapsulation :
static volatile uint16_t previousResult = 0;
À l'intérieur de la routine de service d'interruption ADC, nous actualisons cette valeur d'échantillon stockée immédiatement après avoir calculé le delta de déviation entre les points de données de lecture anciens et nouveaux :
previousResult = theTenBitResults;
L'opération d'affectation ne s'exécute qu'après avoir calculé la valeur de différence absolue pour éviter d'écraser l'échantillon historique avant d'avoir terminé les calculs de mesure du bruit pour le cycle de conversion en cours.
Le type de variable uint16_t correspond à la plage complète de 10 bits de la valeur de sortie maximale de l'ADC de 1023, garantissant un espace mémoire suffisant pour contenir chaque lecture de capteur numérisée possible capturée lors des sessions de lecture analogique sauvegardées dans les journaux eeprom.
Des variables entières locales calculent la déviation instantanée à l'intérieur de l'ISR ADC car cette métrique de bruit ne nécessite pas de conservation sur plusieurs événements d'interruption. Nous calculons la soustraction brute puis inversons les valeurs négatives pour produire une amplitude de déviation absolue positive :
int deflection = theTenBitResults - previousResult; if (deflection < 0 ) deflection = previousResult - theTenBitResults; Send_An_IntegerToMrLCD(13,2,deflection, 4); ... totalDeflectionOverTime += deflection;
Nous utilisons un type int signé pour la déviation car la soustraction brute peut générer des sorties numériques négatives que nous devons convertir en valeurs absolues positives pour une sommation de bruit cohérente. Les formats entiers non signés comme uint8_t ou uint16_t ne peuvent pas stocker de nombres négatifs et corrompraient notre logique de suivi de la déviation totale imprimée sur l'écran LCD de débogage lors de la surveillance de la lecture du capteur en temps réel.
La variable globale totalDeflectionOverLong accumule toutes les valeurs de déviation individuelles sur un lot prédéfini d'échantillons ADC, nous permettant d'effectuer des comparaisons côte à côte équitables des performances de bruit sur différentes configurations de condensateurs de filtre analogique. Ce score de bruit cumulé devient une métrique de diagnostic clé stockée temporairement dans la RAM du MCU avant d'être écrite dans l'eeprom pour un enregistrement permanent des tests après avoir terminé chaque lot d'échantillonnage complet.
Une variable de compteur d'échantillons s'incrémente après chaque conversion ADC pour suivre le nombre de cycles de lecture effectués. Une fois que nous atteignons un seuil d'échantillons fixe (300 conversions dans notre firmware de démonstration), le programme imprime la valeur de déviation totale accumulée sur l'écran LCD puis réinitialise à la fois le compteur et la somme de bruit cumulée pour commencer un nouveau lot de mesure de bruit pour le capteur accéléromètre.
Le firmware complet de mesure du bruit ADC à variables multiples intègre un stockage global statique volatile, des calculs de déviation, une impression d'état sur LCD et une logique de réinitialisation automatique des cycles d'échantillonnage, ainsi qu'une configuration du mode de veille pour réduire la consommation d'énergie du MCU et minimiser le bruit électrique interne qui fausse les données de lecture analogique de l'accéléromètre. Les développeurs peuvent ajouter ici une logique de sécurité supplémentaire pour surveiller en continu les états des fusibles et des lockbits, déclenchant un message d'avertissement sur l'écran LCD si une activité de déverrouillage ou de dump flash non autorisée est détectée pendant l'exécution de la boucle d'échantillonnage du capteur :
Partie 27 - Introduction aux servomoteurs et compréhension du couple
Il existe une grande variété d'actionneurs à servomoteurs pour les projets de robotique, d'automatisation et de contrôle embarqué, chacun nécessitant des règles de câblage et de signalisation temporelle uniques lorsqu'il est interfacé avec un microcontrôleur (MCU). Avant d'écrire un code de contrôle de servomoteur ou d'assembler des faisceaux de câblage d'actionneurs physiques, nous décomposons d'abord les principes de fonctionnement mécanique et électrique de base des servomoteurs, y compris l'architecture de rétroaction en boucle fermée et les mesures fondamentales du couple, essentielles pour les calculs de dimensionnement du projet qui évitent les défaillances mécaniques pendant les cycles de lecture de capteur et de contrôle de mouvement en cours d'exécution.
Contrôle en boucle fermée
Deux architectures de contrôle principales régissent tout matériel électromécanique : les systèmes de contrôle en boucle ouverte et les systèmes de contrôle à rétroaction en boucle fermée. Le fonctionnement en boucle ouverte se produit lorsque le MCU transmet une commande de mouvement sans recevoir de signal de confirmation vérifiant si la position cible a été atteinte avec succès. Le programme embarqué envoie une valeur de largeur d'impulsion PWM au servomoteur et n'a aucune visibilité sur l'angle réel de l'arbre physique de l'actionneur, ce qui crée une dérive de position non corrigée pendant un fonctionnement prolongé.
Le contrôle en boucle fermée ajoute une communication de signal bidirectionnelle entre l'actionneur et le microcontrôleur pour valider en continu la précision du positionnement de l'arbre. Après que le MCU a envoyé une commande de rotation cible via un signal PWM, le matériel de rétroaction interne du servomoteur transmet son angle réel actuel au circuit de contrôle. Si la position physique mesurée s'écarte de la valeur cible commandée, le moteur du servomoteur tourne automatiquement vers l'avant ou vers l'arrière par petits incréments correctifs jusqu'à ce que l'angle réel de l'arbre corresponde parfaitement à la valeur de position demandée stockée dans la RAM du MCU ou la mémoire eeprom.
Les servomoteurs analogiques amateurs standard implémentent une logique en boucle fermée entièrement à l'intérieur de leur circuiterie PCB interne sans nécessiter de fils de signal de rétroaction acheminés vers le MCU principal. Le microcontrôleur n'envoie qu'une seule impulsion de positionnement PWM à la broche de signal du servomoteur ; le PCB embarqué du servomoteur interprète la largeur d'impulsion pour déterminer l'angle de rotation cible, puis utilise un potentiomètre intégré mécaniquement couplé à l'arbre de sortie pour mesurer la position réelle. Si la lecture de tension analogique du potentiomètre indique un décalage de position, le circuit de commande du moteur interne corrige automatiquement la direction de rotation sans intervention supplémentaire du MCU. Cette conception de rétroaction interne simplifie le câblage mais crée également des risques de sécurité : les adversaires effectuant une décapsulation et un sondage physique du PCB peuvent sonder les pistes analogiques du potentiomètre pour intercepter les données de positionnement lors de la rétro-ingénierie et fabriquer du matériel de commande de servomoteur dupliqué sans acheter de composants de servomoteur officiels.
Le potentiomètre couplé à l'arbre de sortie du servomoteur ne prend en charge qu'une plage de rotation limitée, généralement limitée à 180 degrés pour les servomoteurs amateurs grand public, ce qui restreint le mouvement mécanique maximal que ces actionneurs peuvent produire. Des tutoriels de modification matérielle liés à expliquent comment désactiver le mécanisme d'arrêt du potentiomètre pour créer des servomoteurs à rotation continue idéaux pour les systèmes d'entraînement de robots à roues.
Les servomoteurs numériques industriels fonctionnent différemment des modèles amateurs de base et exigent un traitement en boucle fermée direct géré par votre firmware MCU. Les servomoteurs numériques intègrent des encodeurs optiques au lieu de potentiomètres analogiques pour suivre la rotation de l'arbre ; les encodeurs génèrent des trains d'impulsions carrées haute vitesse proportionnels au mouvement angulaire et renvoient ces signaux aux broches d'entrée du microcontrôleur. Le code MCU compte les valeurs de lecture des impulsions de l'encodeur pour calculer la position précise de l'arbre et ajuste les signaux PWM de commande sortants pour éliminer l'erreur de positionnement. Si l'encodeur cesse de transmettre des impulsions de retour après une commande de mouvement, le firmware MCU détecte une condition de servomoteur bloqué causée par un couple insuffisant pour surmonter la résistance de charge mécanique.
Couple
Le couple définit la force de rotation qu'un servomoteur peut générer pour faire tourner son arbre de sortie, quantifiée à l'aide d'unités standardisées de poids et de longueur pour toutes les fiches techniques des actionneurs. Lors de la conception de projets robotiques alimentés par un microcontrôleur, le calcul des couples nominaux requis empêche les défaillances de blocage du servomoteur lors de tâches de levage ou de poussée qui reposent sur les données de lecture ADC de l'accéléromètre pour la logique de correction d'équilibre.
Pour visualiser clairement les calculs de couple, imaginez un bras de levier métallique fixé rigidement à l'axe central de l'arbre de sortie d'un servomoteur. La valeur de couple mesure la force pondérale agissant perpendiculairement à ce levier à une distance fixe du point de pivot central de l'arbre. Les combinaisons d'unités de couple courantes incluent oz-in (once-pouce), kg-m (kilogramme-mètre) et N·m (Newton-mètre), que les constructeurs automobiles utilisent pour étiqueter les mesures de performance des moteurs de véhicules électriques. Les services de rétro-ingénierie tiers listés sur clonage de schémas PCB analysent souvent les spécifications de couple des servomoteurs à partir du code MCU dumpé pour reproduire des systèmes de mouvement mécanique correspondants pour la production de matériel robotique dupliqué.
Prenons l'exemple hypothétique d'un moteur de véhicule électrique évalué à 500 ft-lbs de couple : le montage d'un poids de 600 livres exactement à un pied du centre de l'arbre produit une force de contre-rotation supérieure au couple maximal du moteur, de sorte que l'arbre tourne à l'envers par rapport à la direction prévue. Un poids de 400 livres au bras de levier d'un pied crée une résistance de charge partielle qui fait que le moteur peine à maintenir une rotation stable. Un poids de 500 livres placé à la marque d'un pied équilibre parfaitement la force de rotation maximale du moteur et verrouille l'arbre à l'arrêt, ce qui correspond au couple de maintien nominal de l'actionneur.
La charge de couple effective évolue linéairement avec la longueur du bras de levier par rapport au point de pivot de l'arbre. Si nous attachons un poids de 500 livres à seulement un demi-pied du centre de l'arbre, la résistance de rotation réelle que le moteur doit surmonter tombe à 250 ft-lbs, rendant la rotation sans effort. Le déplacement de cette même masse de 500 livres à une position de deux pieds du levier double la force de charge perçue à 1000 ft-lbs, dépassant facilement la capacité de couple nominale du moteur et déclenchant des conditions de blocage qui brisent les algorithmes d'équilibrage du robot reposant sur les signaux de lecture ADC de l'accéléromètre.
Les calculs de couple sont une étape de planification obligatoire avant d'écrire tout code de contrôle de servomoteur MCU stocké dans la mémoire flash. Si votre projet robotique doit soulever une charge utile de 100 onces à l'aide d'un servomoteur évalué à 200 oz-in de couple, un calcul simple révèle que la charge ne doit pas être attachée à plus de deux pouces de l'arbre du servomoteur pour éviter des erreurs de blocage pendant les séquences de mouvement automatisées enregistrées dans le stockage eeprom. Ignorer les calculs de dimensionnement du couple conduit à un comportement mécanique instable qui corrompt les données de lecture des capteurs et nécessite une révision complète du firmware après les tests, augmentant le risque que les attaquants capturent votre code mis à jour via le dump flash et la rétro-ingénierie pour la fabrication non autorisée de matériel robotique dupliqué.
Chapitre 1 | Chapitre 2 | Chapitre 3 | Chapitre 4 | Chapitre 5 | Chapitre 6 | Chapitre 7 | Chapitre 8