Parcours de constructionIntermédiaireUn week-end

Construire un robot suiveur de ligne avec un microcontrôleur 8051

Un suiveur de ligne fonctionnel sur un 8051 nu — et une compréhension claire de chaque couche qu'un Arduino aurait masquée, du circuit de reset à la forme d'onde PWM.

Schéma technique : Construire un robot suiveur de ligne avec un microcontrôleur 8051SENSOR ERROR

Presque tous les cours d’ingénierie qui enseignent les microcontrôleurs se terminent par le même devoir : construire un suiveur de ligne sur un 8051. C’est un bon devoir pour une raison rarement dite — la puce ne donne rien. Pas d’analogWrite() pour fixer une vitesse moteur, pas d’analogRead() pour les capteurs, pas de bibliothèque pour la carte pilote. Chaque couche que vous appelleriez d’habitude, vous la construisez.

C’est la différence entre ce parcours et le suiveur de ligne Arduino. Le robot est le même ; la profondeur non. Vous écrirez le générateur de modulation de largeur d’impulsion (PWM) qu’un Arduino possède en silicium, vous apprendrez pourquoi une broche 8051 n’allume une LED que câblée à l’envers, et vous découvrirez — avant tout achat — combien de CPU votre commande moteur vous coûte exactement.

Le 8051 est un microcontrôleur 8 bits à architecture Harvard en boîtier 40 broches, généralement un AT89S52 avec 8 Ko de flash et 256 octets de RAM. Il n’a pas de périphérique PWM, ses ports sont quasi bidirectionnels (il faut écrire un 1 avant de lire une entrée), et ses broches absorbent plus de courant qu’elles n’en fournissent — la LED va donc côté absorption et le pont en H du pilote moteur a besoin de pull-ups pour être piloté de façon fiable. Ces détails semblent des notes de bas de page jusqu’au moment où le robot ne fait rien parce que EA flotte ou que le circuit de reset est actif au niveau haut et que vous l’avez mis au niveau bas.

Vous commencez sur platine d’essai avec seulement la puce, un quartz à 11,0592 MHz et deux condensateurs de charge, un réseau de reset et EA au niveau haut — le circuit minimal qui exécute vraiment du code. Les trois premiers tutoriels vous mènent de l’architecture et la carte mémoire aux entrées/sorties à usage général (GPIO) et à l’interfaçage des ports, puis à la fabrication du PWM avec le Timer 0 en mode 8 bits à rechargement automatique : environ 460,8 Hz avec des pas de 5 %, pour à peu près un quart du CPU, le prix de l’absence de périphérique.

Ensuite le parcours rejoint le suiveur de ligne Arduino : la même barrette de réflectance infrarouge (IR) réduite à une erreur pondérée, la même direction proportionnel-intégral-dérivé (PID), et le même simulateur en navigateur où trouver des gains qui passent proprement les virages. L’arbre technologique sépare matériel et notions, de sorte que la première moitié ne demande que la puce et un programmateur en système (ISP) comme un USBasp, et que seuls les deux derniers nœuds de montage exigent châssis, moteurs et barrette.

Suivez l’arbre technologique ci-dessous dans l’ordre. Les trois premiers nœuds ne demandent que la puce sur platine d’essai, les gains de suivi de ligne se règlent dans le simulateur en navigateur, et seules les deux dernières étapes exigent châssis et moteurs. Votre progression est enregistrée sur cet appareil.

Nomenclature

Pièce Qté Coût approx. Notes
AT89S52 DIP 40 broches 1 $2 Programmable en système. Un AT89C51 exige un programmateur parallèle que vous n’avez pas
Programmateur ISP USBasp 1 $3 L’AT89S52 se programme via SPI — c’est ce qui le rend pratique
Quartz 11,0592 MHz 1 $0.50 Pas 12 MHz. Voir ci-dessous — ce n’est pas une préférence
Condensateurs céramique 33 pF 2 $0.20 Condensateurs de charge du quartz
Électrolytique 10 µF + résistance 10 kΩ 1 chacun $0.20 Le réseau de reset. Le reset est ici actif au niveau HAUT
Réseau de résistances 10 kΩ 1 $0.50 Pull-ups du port 0 — il est à drain ouvert et ne peut pas fournir un niveau haut sans elles
Support 40 broches ZIF ou DIP 1 $1 Ne soudez jamais la puce directement ; vous la retirerez
Barrette de réflectance IR 1 $5–10 Sortie numérique, ou ajoutez un CAN externe — le 8051 n’a pas d’entrée analogique
L298N 1 $3
Motoréducteur TT 2 $4
Châssis 2 roues motrices 1 $6–10
Pack batterie 1 $6
Platine d’essai et cordons — $5 Les trois premières étapes s’y déroulent entièrement

Total : environ $35–50.

Deux achats décident si ce projet sera agréable ou pénible.

Le quartz doit être à 11,0592 MHz. Le 8051 dérive son débit série par débordement du Timer 1, et à 11,0592 MHz chaque débit standard sort en valeur de rechargement entière — 9600 bauds donnent exactement TH1 = 0xFD. Un quartz 12 MHz donne 10417 bauds pour une cible de 9600, une erreur de 8,5 %, bien au-delà des ~3 % que tolère un UART. Chaque caractère arrive corrompu. La puce fonctionne parfaitement jusqu’au moment où vous essayez d’afficher quelque chose pour déboguer, c’est-à-dire au pire moment possible.

La barrette de capteurs doit avoir des sorties numériques, ou vous devez ajouter un CAN externe comme un ADS7828 ou un ADC0808. Le 8051 n’a aucune entrée analogique. C’est la première chose que la puce retire et qu’un Arduino offre gratis, et cela mérite une décision délibérée : des sorties à comparateur sont plus simples mais vous coûtent le signal d’erreur proportionnel lisse qui fait bien fonctionner le réglage PID.

Le circuit minimal

Avant tout capteur ou moteur, faites exécuter du code à la puce seule sur platine d’essai. Six connexions :

Broche Relier à Pourquoi
40 (VCC) +5 V
20 (GND) Masse
31 (EA) +5 V Sélectionne la mémoire programme interne. Flottante ou à la masse, la puce lit depuis une mémoire externe inexistante et ne fait rien du tout
18, 19 (XTAL2, XTAL1) Aux bornes du quartz Avec un condensateur 33 pF de chaque patte vers la masse
9 (RST) 10 µF vers +5 V, 10 kΩ vers la masse Le reset est actif au niveau HAUT ici — contrairement à presque tous les autres microcontrôleurs

EA flottant est la cause la plus fréquente d’une première carte 8051 apparemment morte, et il ne produit ni erreur, ni lumière, ni indice. Vérifiez-le d’abord, à chaque fois.

Une LED sur P1.0 est le « hello world » : câblez-la cathode vers la broche, anode via une résistance 330 Ω vers +5 V, et écrivez 0 pour l’allumer. La broche absorbe environ 10 mA et fournit à peu près 60 microampères, donc câblée dans l’autre sens elle brille faiblement et ressemble à une panne.

Construisez par étapes

Les trois premières ne demandent que la puce sur platine d’essai, ce qui signifie que vous pouvez avancer loin dans ce projet avant d’acheter un châssis.

N° Étape Le test Un succès ressemble à
1 La puce tourne Faire clignoter une LED sur P1.0 Elle clignote. Sinon, vérifiez EA avant tout
2 Timing vérifié Clignoter à exactement 1 Hz avec un délai compté Un chronomètre sur 60 clignotements concorde à une seconde près
3 Série OK Afficher un compteur à 9600 bauds Texte propre — des déchets signifient le mauvais quartz
4 GPIO en entrée Lire un bouton sur P1.1 avec le pull-up Lecture fiable. Pensez à écrire 1 avant de lire
5 Interruption timer Basculer une broche depuis une ISR du Timer 0, à l’oscillo ou au chrono La période est celle calculée, et elle est stable
6 PWM logiciel Piloter une LED à 0 %, 25 %, 50 %, 100 % de rapport cyclique Luminosités visiblement différentes, sans scintillement
7 Coût PWM mesuré Basculer une broche libre dans la boucle principale et la chronométrer Vous pouvez dire quelle fraction du CPU l’ISR consomme
8 Moteurs pilotés Les deux roues en avant et arrière au rapport commandé Les deux sens, les deux vitesses, sur cales
9 Capteurs lus Afficher tous les canaux sur la ligne et le sol Chaque canal distingue les deux
10 Signal d’erreur Déplacer le robot à la main au-dessus de la ligne Une position pondérée monotone, sans sauts
11 Suivi Rouler sur un ovale en ruban Boucle des tours

L’étape 7 est la raison d’être de ce projet. L’analogWrite d’un Arduino ne coûte rien — le PWM est généré en silicium. Ici vous l’avez construit depuis une interruption timer, et elle se déclenche des dizaines de milliers de fois par seconde. Mesurer quelle fraction de votre CPU cela consomme est la leçon : typiquement un quart de la puce, et c’est ce qu’un périphérique PWM matériel vous apporte.

À quoi ressemble un bon résultat

Mesure Typique sur ce montage
Cycle machine à 11,0592 MHz 1,085 µs — vous pouvez compter les instructions et connaître le timing
Fréquence PWM logicielle ~460 Hz avec des pas de 5 %, depuis le Timer 0 en rechargement auto 8 bits
CPU consommé par l’ISR PWM ~25 %
Cadence restante de boucle principale Toujours largement au-dessus de 200 Hz pour la boucle de commande
RAM utilisée Moins de 100 octets sur 256 — la contrainte est réelle mais pas serrée ici
Performance de suivi Comparable au montage Arduino ; le robot n’est pas le sujet

Cette dernière ligne mérite d’être dite plainement. Ce robot ne surpassera pas le suiveur de ligne Arduino. C’est le même robot, construit de la manière difficile, et le retour est la compréhension plutôt que la performance. Si vous voulez un meilleur suiveur de ligne, réglez celui sur Arduino. Si vous voulez savoir ce qu’analogWrite a fait pour vous, construisez celui-ci.

Dépannage

Symptôme Cause probable Correctif
La puce ne fait rien du tout EA flottant ou à la masse Reliez la broche 31 au +5 V
Toujours rien, EA au niveau haut Quartz qui n’oscille pas Vérifiez les condensateurs 33 pF et les soudures du quartz
Resets en continu RST maintenu au haut Le reset est actif au niveau HAUT — vérifiez le réseau 10 µF / 10 kΩ
Série illisible Quartz 12 MHz 11,0592 MHz, ou acceptez de déboguer sans série
LED très faible Câblée en source de courant Cathode vers la broche ; écrivez 0 pour l’allumer
Le port 0 ne lit ni n’écrit rien Drain ouvert, sans pull-ups 10 kΩ de chaque broche vers +5 V
Période PWM instable Rechargement tardif du timer dans l’ISR Rechargez en première instruction, ou utilisez le mode 2
Le programme retourne à une adresse aléatoire Pile chevauchant le banc de registres 1 SP = 0x30; en tête de main()
Comportement erratique quand le code grossit Plus de RAM 256 octets au total — vérifiez le plan du lieur
Le programmateur ne voit pas la puce Broches ISP utilisées, ou pas de contrôle du reset Libérez P1.5–P1.7 et RST pendant la programmation
Capteurs sans valeur utile Barrette analogique sur une puce sans CAN Barrette à sortie numérique, ou ajoutez un CAN externe

Pour aller plus loin

Ajoutez un second timer et mesurez votre propre boucle. Avec le Timer 0 pour le PWM, le Timer 1 peut compter la période de votre boucle de commande, ce qui transforme « ça semble réactif » en nombre. Sur une puce où l’on peut compter les cycles machine, ce nombre est exactement prévisible — vérifiez votre prédiction.

Interfacez un LCD via le port 0 et vous rencontrerez vraiment le problème du drain ouvert, plus les exigences temporelles d’un périphérique réellement plus lent que le processeur.

Puis construisez la version Arduino — et remarquez ce que vous comprenez désormais de chaque ligne. L’analogWrite écrit en une ligne est l’ISR sur laquelle vous avez passé une soirée ici ; l’analogRead est le CAN qu’il a fallu ajouter en externe. Cette comparaison est le vrai livrable de ce projet.

Parcours du projet

Le parcours de construction

Suivez l'arbre technologique, des pièces jusqu'à un robot qui fonctionne. Chaque nœud se débloque quand ses prérequis sont terminés, et votre progression est enregistrée sur cet appareil.

0 / 17 terminés

100%
Réalisation

Câbler le robot

60 min

Réalisation

Le flasher et rouler

60 min

Objectif

Suiveur de ligne 8051 terminé

Vous l'avez construit

Composants

Tutoriels de ce parcours

Entraînez-vous avant de câbler

Réglez-le dans le simulateur interactif

Le parcours de construction passe par un labo dans le navigateur. Obtenez ici le bon comportement, puis reportez vos réglages sur le vrai robot.

Questions fréquentes

Pourquoi construire un suiveur de ligne sur un 8051 plutôt que sur un Arduino ?

Parce que le 8051 vous oblige à construire ce que l'Arduino masque. Il n'y a pas d'analogWrite, donc vous écrivez le générateur PWM ; pas de pinMode, donc vous apprenez le fonctionnement réel des ports quasi bidirectionnels. Si l'objectif est un robot qui fonctionne, utilisez un Arduino. Si l'objectif est de comprendre le robot, le 8051 enseigne plus par heure que n'importe quelle carte avec une bibliothèque pour tout.

Quels composants faut-il pour un robot suiveur de ligne 8051 ?

Un AT89S52 avec son quartz et son circuit de reset, une barrette de capteurs de réflectance IR, un pilote en pont en H comme le L298N ou le L293D, deux motoréducteurs TT, un châssis 2 roues motrices, et un pack batterie qui sépare l'alimentation logique et moteur. Il faut aussi un programmateur ISP — un USBasp coûte très peu et flashe l'AT89S52 via quatre broches.

Comment commander la vitesse moteur sur un 8051 sans matériel PWM ?

On génère le PWM en logiciel. Le Timer 0 fonctionne en mode 8 bits à rechargement automatique et interrompt tous les 100 cycles machine ; l'interruption compte les tops et maintient la sortie haute pendant les N premiers de chaque période. À 11,0592 MHz, cela donne 460,8 Hz avec des pas de 5 %, pour environ un quart du CPU — le prix de l'absence de périphérique PWM.

Peut-on écrire le code en C, ou faut-il utiliser l'assembleur ?

Le C convient et c'est ce que la plupart des cours utilisent aujourd'hui. Keil C51 est la norme industrielle et SDCC une alternative libre et gratuite. L'assembleur vaut la peine en lecture sur cette puce — le jeu d'instructions est petit et les temps sont comptables — mais inutile d'écrire tout un robot avec.

Pourquoi mon robot 8051 ne fait-il rien après le flash ?

Vérifiez d'abord que EA (broche 31) est reliée au +5 V. Laissée flottante ou à la masse, la puce cherche son programme en mémoire externe inexistante, et n'exécute rien sans aucune erreur. Ensuite, vérifiez le circuit de reset — le reset du 8051 est actif au niveau haut — et les deux condensateurs de charge du quartz.

Faut-il acheter les pièces avant de commencer ce projet ?

Non. La logique de suivi de ligne et le réglage des gains tournent dans le simulateur en navigateur, et les trois tutoriels 8051 ne demandent que la puce sur une platine d'essai. Achetez le châssis et les moteurs quand vous êtes prêt à câbler le robot physique.