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.
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
Composants
- Contrôleur8051 MicrocontrollerLa puce de votre programme d'études, sans rien entre vous et le matériel.
- CapteurIR Reflectance Sensor ArrayUne rangée d'yeux infrarouges qui indique au robot où se trouve la ligne.
- PiloteL298N Motor DriverLe double pont en H qui convertit de faibles broches logiques en puissance moteur.
- ActionneurDC Gearmotor (TT Motor)Le moteur à boîte jaune qui transforme un châssis nu en voiture robot mobile.
- Châssis2WD Robot ChassisLe plateau sur lequel se fixent deux moteurs, une roulette libre et votre électronique.
- AlimentationRobot Battery & Power PackLa différence entre un robot qui roule et un qui redémarre sans cesse.
Tutoriels de ce parcours
- Débutant · 30 min de lectureArchitecture 8051 : broches, plan mémoire et registresCœur Harvard, quatre ports, 256 octets de RAM, et une temporisation comptable en cycles machine.
- Débutant · 28 min de lectureGPIO 8051 et interfaçage des ports : puisez, ne sourcez pasPourquoi les LED 8051 se câblent à l'envers, pourquoi on écrit 1 avant de lire, et ce qu'un port peut piloter.
- Intermédiaire · 35 min de lectureTimers 8051 et PWM logicielle pour la commande de moteursConstruisez une PWM depuis une interruption du Timer 0, choisissez le compromis fréquence-résolution, et commandez un pont en H.
- Débutant · 20 min de lectureLire une barrette IR de réflectance pour le suivi de ligneTransformez une rangée de capteurs IR en une position de ligne unique et lisse sur laquelle braquer.
- Débutant · 18 min de lectureCommander des moteurs CC avec PWM et pont en HCâblez et commandez un moteur CC à balais en sécurité avec PWM, un pont en H et des limites de courant réalistes.
- Débutant · 20 min de lectureConstruire un suiveur de ligne : capteurs et pilotage PIDDes capteurs de réflectance IR à l'erreur pondérée et au pilotage PID fluide — comment marche vraiment un suiveur de ligne.
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.