Tip:
Highlight text to annotate it
X
Bonjour, Nous continuons le cours, "Comprendre les microcontrôleurs".
Nous n'avons pas encore beaucoup parlé de
microcontrôleurs, mais cette fois, nous allons enfin
toucher un tout petit peu aux microcontrôleurs,
sans encore en parler avec beaucoup de détails.
Dans ce module, nous allons parler de systèmes séquentiels.
Nous parlerons en particulier de comment représenter
un système séquentiel par un graphe d'état.
Nous regarderons aussi comment réaliser, comment synthétiser
une machine d'état, euh, pour un système séquentiel,
et finalement on montrera que la solution la
plus simple, c'est peut-être, justement, d'utiliser un microcontrôleur.
On avait vu précédemment ce qu'est
un système logique, avec ses entrées, avec ses
sorties, et la description avec une table de vérité pour
autant qu'il s'agisse d'un système combinatoire, et on va
justement, voir des systèmes qui ne sont pas combinatoires, aujourd'hui.
Pour vous convaincre que tous les systèmes ne
sont pas combinatoires, je vous propose un exemple.
En plus, cet exemple, nous allons l'utiliser
durant tout le cours, enfin à plusieurs occasions.
En tout cas, nous aurons l'occasion d'en reparler.
Alors, j'essaie de vous expliquer un petit peu de quoi il s'agit.
C'est un système de perceuse.
On a les pièces qui doivent être percées au moyen d'une mèche.
Ici, le moteur qui fait tourner la mèche. Et lors d'une utilisation manuelle,
l'ouvrier devait placer la pièce au bon endroit, la fixer, et
ensuite, faire descendre la perceuse à une certaine vitesse, jusqu'en
bas, puis ensuite, remonter pour dégager la mèche.
On souhaite automatiser ce processus, et alors, on va
rajouter à notre dispositif, ici, un petit bouton
start qui va permettre de démarrer, de lancer le
percement, au moment où la pièce aura été fixée.
Et donc, je rappelle le scénario, la perceuse doit
descendre jusqu'en bas, puis doit remonter jusqu'en haut et s'arrêter.
Première question qu'on pourrait se poser,
le système qui commande le moteur vertical,
quelles sont ses entrées, quelles sont ses sorties, pour le moment?
Combien de, d'entrées a-t-il?
Combien de sorties a-t-il?
Alors, la réponse est effectivement,
est que, le système a trois entrées et deux sorties.
Je vais vous l'expliquer. Quelles sont les entrées dont on a besoin?
Tout le monde pense, euh, qu'il y a effectivement une
entrée qui s'appelle start; ce n'est pas trop difficile à trouver.
Y a-t-il d'autres entrées?
Oui, il y a d'autres entrées.
Une entrée qui s'appelle bas, qui correspond au fait que j'ai dit
que quand le, la perceuse était arrivée en bas, il fallait remonter.
Donc, il faut bien un système de détection qui donne l'information,
lorsqu'on est arrivé en bas.
Il s'agit en l'occurence d'un interrupteur de
fin de course qui donne cette information.
Et de la même manière, on a un signal qui, euh, note qu'on est arrivé en haut.
En ce qui concerne les sorties, le moteur qui se trouve, ici, c'est lui
qui va permettre de faire descendre et de faire monter le dispositif.
Il y a un seul moteur, mais il y a besoin de deux
valeurs pour le commander. Pourquoi?
Et bien parce que ce moteur, en fait, a trois modes de fonctionnement.
À certains moments, il est arrêté.
À certains moments, il tourne dans un sens qui correspond
à la descente, et à un autre moment, il tourne
dans l'autre sens, et donc ces trois modes de fonctionnement
du moteur doivent être présentés par au minimum, deux sorties.
Par exemple, une sortie qui s'appelerait
avance, et une sortie qui s'appelerait recule.
Donc, nous avons notre système avec les trois entrées, avec les deux sorties,
dont on, naïvement, de voir si une table de vérité va nous permettre de le décrire.
Prenons la première ligne de la table de vérité.
Nous avons
start qui est à zéro, haut qui est à zéro, bas qui est à zéro.
Le fait que start soit à zéro siginifie que l'ouvrier
n'est pas en train de presser sur le bouton start.
Le fait qu'on ne soit ni en haut, ni
en bas, laisse entendre que la perceuse est quelque part
au milieu, et d'après le fonctionnement que j'ai décrit tout
à l'heure, si elle est au milieu, c'est qu'elle est,
par exemple, en train de descendre.
Alors, effectivement, on pourrait mettre, ici, une valeur un, suivie
d'un zéro, qui correspondrait au fait que le moteur avance.
Mais, évidemment, ça serait aussi possible d'être dans la
situation, ou alors, on est en train de monter.
C'est-à-dire que on est à un pour le recul, et à zéro pour l'avance.
Donc, pour cette seule
ligne, on a deux, euh, valeurs différentes de sorties.
Donc, le système n'est pas un système
combinatoire, et en quelques sortes, on peut
tirer un trait sur la table de vérité, elle n'est pas utile dans ce cas-là.
Il faut trouver une autre manière
de représenter notre, euh, système séquentiel.
Bon, ce qu'on va utiliser, c'est un graphe d'état.
L'idée, c'est de trouver des états à notre système.
Alors, les états correspondent au fait qu'on peut dire, le
système est en train de, il est dans une situation stable.
Par exemple, il est à l'arrêt.
Il est à l'arrêt, ou bien il est en train de descendre, ou bien il est en
train de monter, et dans ce cas-là, ce
n'est pas difficile de trouver qu'on a effectivement ces
trois états qui sont présentés, là.
À chaque état correspond très clairement les
valeurs, euh, des signaux avance et recule.
Pour l'arrêt, on a avance et recule qui sont à zéro.
Pour la descente, avance est à un et recule est à zéro, et c'est
le contraire pour la montée, recule est à un et avance est à zéro.
Qu'est-ce qui va nous permettre
de passer de l'état arrêt à l'état descente?
Et bien, on va appeler ça une transition.
Je vais dessiner, ici, une flèche qui va
nous permettre de passer de l'arrêt à la descente.
Quelle est la condition qui est liée à cette transition?
Et bien, évidemment, c'est le bouton start.
On pourrait se poser la question, est-ce qu'il y a une transition qui permet
de passer de descente à arrêt?
Et bien, on se rend compte que avec le scénario que j'ai décrit tout
à l'heure, il n'y a pas de situation où on passe de descente à arrêt.
Lorsqu'on a terminé la descente, on doit remonter, mais on ne doit pas s'arrêter.
Donc, en fait, cette, euh, flèche n'existe pas.
Donc, je vais tout simplement l'enlever. Il n'y aura pas besoin de la dessiner.
De la même manière, on aura des transitions
de descente à montée, et de montée à arrêt.
De telle
manière que finalement, notre graphe d'état se présente de cette manière-là.
Je rappelle, on a les états représentés par, euh, par exemple, un ovale.
On a des transitions.
À chaque état est associé un nom, mais surtout associé des valeurs de sorties,
et à chaque transition, est associée une condition pour cette, pour que
cette transition soit, euh, passée, soit validée.
La question qui se pose maintenant, c'est comment réaliser
avec les circuits logiques que l'on connaît, des portes
logiques, des bascules, notre système séquentiel, notre machine d'état,
à partir du graphe d'état que nous avons décrit?
Alors, la solution se présente de la manière suivante.
Étant donné qu'on a des états, et que ces états doivent être maintenus, on va
utiliser deux bascules qui vont permettre de mémoriser
la valeur de avance et la valeur de recule.
On va, ici, prévoir une horloge qui va, un
certain nombre de fois par seconde, en permanence, par exemple,
à une fréquence de 100 hertz, ou de 1 kilohertz,
recalculer le nouvel état pour le mettre sur les sorties.
Comment peut-on
calculer ce nouvel état?
Et bien, on a besoin d'un système combinatoire.
Certes, ce système combinatoire, va utiliser comme entrée,
les entrées de notre système séquentiel, les fameux
signaux start, bas et haut, et ils ne sont pas suffisants, on l'a vu tout à l'heure.
On a également besoin de reprendre l'état présent pour calculer l'état futur.
Je reprends
l'exemple de tout à l'heure.
Si je suis en train de descendre, c'est parce que
je suis en train de descendre, que je dois continuer.
Ce n'est pas les entrées qui me le disent.
Et si j'étais, au contraire, dans la même situation avec start, bas et haut qui sont
à zéro, mais que je suis dans l'état de monter, je dois continuer à monter.
Donc, l'état présent est réutilisé pour calculer le,
l'état futur.
Et alors, l'état futur est présent, ici, et il est chargé par le coup d'horloge
dans les deux bascules qui est donné,
euh, donc, par cette horloge, par cet oscillateur.
À noter que ces deux bascules ont la même horloge, et on parle dans ce cas-là de
système séquentiel synchrone, c'est le terme technique qui est utilisé.
Il faut maintenant réaliser
le système combinatoire qui est donc, un sous-ensemble de notre système séquentiel.
Il a cinq entrées.
Oh là là, ça signifie qu'il a 32 lignes, puisque le nombre de combinaisons
possibles de cinq entrées, c'est deux à la puissance cinq, c'est-à-dire 32.
visiblement, je ne vais pas avoir la place sur mon tableau, ici.
Je vous avais dit,
toutefois, que, euh, lorsqu'on parlait de table de vérité, on n'était
pas du tout obligé de les faire dans l'ordre binaire traditionnel.
Et en fait, dans ce cas-là, ce que je
vais faire, c'est que je vais tenter de parcourir
mon graphe d'état, en mettant les valeurs, et on
va voir que les choses vont se passer relativement bien.
Je commence par me dire, je suis dans l'état arrêt,
avec recule et avance qui sont à zéro.
Quel est, ou quels sont les états futurs possibles de
cet état arrêt? Et bien, en fait, il y a deux cas.
Il y a le cas où on va rester à l'arrêt, et le cas ou au contraire,
on va passer à la descente. Vous êtes d'accord que, ici, ça représente
l'arrêt, dans les deux cas.
Ici, je reste à l'arrêt, ici, je passe à la decente.
J'ai les mêmes valeurs qu'ici. Qu'est-ce qui va permettre, maintenant,
de savoir si on doit rester à l'arrêt, ou au contraire, passer à la descente?
Et bien, c'est tout naturellement le bouton start.
Lorsqu'il est à zéro, on reste à l'arrêt.
Lorsqu'il est à un, on va passer à la descente.
Et au fond, peu importe les valeurs
de haut ou de bas, dans ce cas-là.
Et vous voyez que, euh, cette manière, au fond de, de, de noter,
ici, avec C X, cette ligne représente en fait quatre ligne de la table de vérité.
Puisqu'on a les combinaisons avec 0, 0, 0, 1, 1, 0 et 1, 1.
Et la même chose pour la ligne suivante.
Alors on peut maintenant continuer notre parcours de
notre graphe.
Je vais euh, voir ce qu'il se passe lorsque je suis à l'état "descente".
Et de nouveau il y a deux cas possibles, le cas où je continue à descendre
et le cas où je vais au contraire passer à la montée.
Et qu'est-ce qui va déterminer si on reste à la descente ou si on passe à la montée?
Et bien c'est tout naturellement le fait que "bas"
soit atteint ou qu'il ne soit pas atteint. Et de nouveau, on ne s'inquiète pas des
valeurs de "start" et de "haut" pour ce choix de l'état futur.
Et finalement, je peux terminer maintenant mon euh, mon parcours en prenant
le cas où je suis, cette fois à la montée, les deux cas où je suis à la montée.
Je peux rester
à la montée ou, au contraire, je peux passer à l'arrêt.
Et, cette fois, c'est l'état du haut qui va influencer euh, l'état futur.
Et les boutons "start", les valeurs de bas ne sont pas importantes.
J'ai terminé le parcours de mon graphe d'état.
Je n'ai pas terminé ma table
de vérité.
Je vous avais en fait dit qu'il était indispensable que
tous les cas soient prévus dans la table de vérité.
Donc, je dois encore signaler ce cas-là, quelles que soient les
valeurs de A euh, de "haut", de "bas" et de "start".
Quand j'ai cette valeur à 1 pour "avance" et
1 pour "recule", c'est un état qui n'est pas prévu.
Par conséquent, ça semble être une erreur technique en quelque sorte.
Par exemple lorsque on alimente notre montage,
on pourrait tomber par hasard dans cet état-là.
Et, évidemment, dans ce cas-là, il faut rapidement revenir
à l'état neutre du système qui est l'état "arrêt".
Et cette fois, j'ai une table de vérité qui est complète.
J'ai ici, quatre lignes, quatre lignes, quatre
lignes, quatre lignes, quatre lignes, quatre lignes.
Huit lignes.
J'ai donc
bien en tout mes 32 lignes de ma table de vérité.
Ça va être relativement simple maintenant à partir de cette table de vérité de
trouver les, la formule logique, avec les expressions de l'algèbre de Boole.
C'est exactement ce qu'on avait fait dans les systèmes combinatoires.
Par exemple, ce 1 ici, correspond au fait que "bas"
est à 1, "recule" est à 0, "avance" est à 1.
Donc "bas", "recule" barre, "avance".
Je prends un autre exemple : ce 1 là correspond au fait
que "bas" est à 0, "recule" est à 0, "avance" est à 1.
"Bas" barre, "recule" barre, "avance". Et donc les
"et" logiques ici pour regrouper chaque fois les deux termes.
J'ai donc ma formule définitive. C'est alors facile maintenant d'avoir le
schéma qu'on va pouvoir euh, dessiner avec les portes "ou" et avec les portes "et".
Alors voilà donc le schéma logique que nous avons dessiné tout à l'heure.
Vous reconnaissez les entrées ici sur des interrupteurs
avec affichage des valeurs pour qu'on voit bien.
Le système
combinatoire avec les inverseurs pour avoir les signaux inversés.
Les deux bascules qui vont donc prendre
les sorties des portes "ou" pour les enregister.
L'horloge, qui va permettre de euh, valider et d'enregistrer l'état.
Ici, les deux sorties "avance" et "recule" et l'utilisation de
ces valeurs pour le système combinatoire selon donc, le schéma.
Alors maintenant,
on va se placer dans une situation réaliste : la perceuse est en haut
et l'utilisateur euh, va bientôt presser sur le bouton "start".
Et lorsqu'il presse sur le bouton "start", voilà, la prochaine fois
que l'horloge est pressée, on passe bien dans le mode "avance".
On peut presser d'autre fois sur le clock, ça ne change rien.
Comme le système va descendre, il va quitter le "haut".
Voilà, il ne se passe toujours rien.
L'utilisateur va cesser de presser sur le bouton "start"
puisqu'il voit que le démarrage a bien été fait.
Il ne se passe toujours rien à la
sortie, on ne change pas d'état, on descend toujours.
Jusqu'au moment où on arrive en bas et à
ce moment là on passe effectivement à la montée, "recule"
est activé et on va conserver cet état malgré le
fait qu'on va quitter le bas puisque la perceuse remonte.
Et c'est seulement au moment où on va arriver en haut que le système
va se retrouver dans l'état initial où on est arrêté.
C'est bien joli d'avoir fait la simulation,
mais nous souhaitons maintenant réaliser ce montage.
Le réaliser d'une manière concrète avec des circuits intégrés
logiques tels qu'on en a parlé dans les derniers chapitres.
Voilà donc notre schéma complet
avec le schéma bloc et le détail du système combinatoire.
Pour réaliser l'horloge, on pourrait utiliser un circuit du type NE555.
Ceux qui ont fait un petit peu d'électronique le connaissent très bien.
Et pour la petite histoire, c'est le circuit intégré le plus fabriqué
au monde depuis sa conception il y a une quarantaine
d'années et j'ajoute encore que sa conception a été faite par un ingénieur
suisse qui travaillait à l'époque dans la société américaine Signetics.
Pour réaliser les bascules, les deux bascules que
nous avons ici, on va utiliser un circuit, par exemple,
du type 74HC74. Pour réaliser le système combinatoire
dont on a le schéma ici, on va utiliser un circuit intégré qui contient trois portes
NAND à trois entrées. Ce circuit s'appelle 74HC10.
On va même avoir besoin de deux de ces circuits intégrés pour pouvoir avoir ces
deux portes et il faudra également utiliser un circuit
du type 74HC04 qui permettra de fournir les inverseurs
dont on a besoin pour les différentes valeurs qui sont inversées ici à l'entrée.
Donc finalement, si je compte, un, deux, trois, quatre, cinq circuits
intégrés pour réaliser ce petit automate qui commande donc notre perceuse.
Ça n'est
plus un schéma digne du XXIème siècle.
Aujourd'hui, nous sommes capables de réaliser avec un seul circuit intégré.
Il existe aujourd'hui une solution plus simple que
la solution qui utilise les circuits logiques traditionnels.
Et, vous l'avez probablement deviné, cette solution, c'est un microcontrôleur.
Ce microcontrôleur a justement les pattes qui nous arrangent bien : la masse, le VCC
pour les deux alimentations.
Ces trois pattes pourront être utilisées comme entrées.
Ces deux pattes pourront être utilisées comme sorties.
Et on a même ici une fonction "reset" qu'on
pourra utiliser par exemple pour l'arrêt d'urgence de notre perceuse.
Je vous présente même ici le schéma de mise en oeuvre de ce circuit intégré.
C'est extrêmement simple, il faut le brancher.
Il faut rajouter
quelques composants discrets : une résistance et
un condensateur, c'est bien peu de chose.
Et on peut entrer ici avec les trois signaux.
On aura ici les sorties.
Alors, il reste une partie un petit peu mystérieuse
qui est cette partie-là avec ce connecteur de programmation.
On aura évidemment l'occasion d'en reparler euh, avec plus de détails.
Il est tout de même à noter que lorsque vous achetez ce circuit intégré,
votre montage ne va pas marcher
parce qu'un microcontrôleur, ça doit être programmé
et c'est justement le but de ce
cours, d'apprendre aussi à programmer ces microcontrôleurs.
Alors j'ai tenté le, l'expérience de programmer un
microcontrôleur selon la logique qui nous est inspirée par ce schéma-là.
Ce programme que j'ai écrit n'est pas optimal.
On verra
dans quelques leçons des manières plus élégantes
d'écrire ce programme mais il fonctionne parfaitement bien.
On remarque que l'horloge ici, qui permet, beaucoup
de fois par seconde, de recalculer l'état courant.
Elle est, au fond, donnée par cette information
ici, boucle, avec un début et une fin.
Ce programme va effectivement être répété
en permanence.
Ce qui jouera un peu près le même rôle que l'horloge.
Maintenant, les entrées ici doivent être lues, on
a des procédures de lecture de ces signaux.
Pour le start, à partir de la patte "start", pour
le bas, à partir de la patte "bas" et cetera.
Même chose pour le haut.
Ensuite on a notre système combinatoire qu'il va falloir programmer.
On reconnaît
ici les formules de tout à l'heure sauf
que la syntaxe est un tout petit peu différente.
Voilà le "et" logique.
Voilà la "ou" logique et voilà l'"inversion" logique.
Et finalement, on a donc nos
signaux "AvancePlus" et "ReculePlus" qui correspondent
donc aux sorties du système combinatoire et donc aux entrées des bascules.
Il faut maintenant que les bascules soient implémentées sour forme d'enregistrement
de la valeur qu'on vient de calculer dans
une variable "Avance" et la même chose pour "Recule".
Et finalement, il faut que les sorties soient mises à
disposition à l'extérieur du circuit par la procédure "digitalWrite" en
signalant que le signal "Avance" doit être copié dans la
patte qui correspond à l'"avance" et la même chose pour "Recule".
Nous avons donc découvert un peu les systèmes séquentiels en regardant comment
il est possible de les décrire avec un
graphe d'état, de les réaliser avec une machine
d'état, dont la réalisation physique est parfois un
peu compliquée avec des portes logiques et des bascules.
Et finalement, on a aussi vu que le microcontrôleur allait nous
aider à réaliser de manière beaucoup plus simple un tel montage.