Bonjour, on va parler des différents types d'interfaces série qui existent autour du microprocesseur. Ces interfaces permettent de communiquer avec des circuits extérieurs, des cartes, par exemple les shields Arduino. Vous achetez une carte, vous chargez la librairie, si ça ne marche pas bien, vous essayez de trouver l'information dans des forums. Vous trouvez des très bons livres qui décrivent, avec un peu plus de détails, comment interfacer ces cartes et comprendre un peu leurs librairies. Nous allons nous concentrer sur le principe de ces interfaces. UART, SPI, I2C et les commandes RC5, One-wire entre quatre et un fil, il y a un certain nombre de solutions qui sont intéressantes à comprendre et pas si difficiles à programmer pour la plupart. Si on commence avec le UART, le grand principe est de transmettre les bits en série avec une horloge qui les synchronise. Et la difficulté de toutes ces interfaces série, c'est de savoir quand ça commence, quand ça finit. Le principe des UART, Universal Asynchronous Receiver/Transmitter, c'est d'avoir un start bit, la ligne est au repos à l'état 1, et au moment où elle passe à 0 pour une période d'horloge, et bien, le récepteur est informé qu'un nouveau message arrive, il n'a qu'à receptionner les 8 bits dans un registre à décallage ou à travers un bit d'un port et l'instruction supérieur supérieur hein, qui permet de décaller. Et, pour savoir que les 8 bits sont arrivés, un stop bit dans le fond génère un espace avant un éventuel redémarrage immédiat avec un stop bit. Mais on n'est pas obligé de redémarrer immédiatement, d'où le terme asynchronous. D'autres schémas série dont on ne va pas parler permettent de compactifier un petit peu plus l'information avec différentes astuces. Donc voilà le grand principe, un start bit, un stop bit, et, du côté du récepteur, et bien au moment où vous avez le start bit euh, qui suit un silence suffisamment long ou qui suit un stop bit qui a été reconnu, et bien vous attendez une demi-période en utilisant un oscillateur qui a la même fréquence. Et puis en suite, toutes les périodes, vous échantillonez la valeur et puis vous la récupérez. Alors l'oscillateur à la réception peut admettre une certaine erreur dans le fond. Il va y avoir un décallage mais tant que ce décallage est inférieur à une demi-période, ça ne pose pas de problème. Alors maintenant qu'on a des quartz et des oscillateurs très précis partout, on n'a plus du tout besoin de se préoccuper de ce décallage éventuel. Les valeurs usuelles pour ce motif qui est transmis, c'est 8 bits de données, historiquement, il y a une première version il y a plus d'un siècle avec seulement 5 bits, un stop bit, pas de parité, alors on n'a pas le temps d'en parler, et 9600 bits par seconde, cette fréquence qu'on exprime en bits par seconde, parfois en Bauds, bien que le terme ne soit pas correct, elle a été normalisée, les tout anciens modems acoustiques sur les téléphones travaillaient à 300 bits par seconde, Arduino et beaucoup d'applications fonctionnent parfaitement bien à 9600 avec des interfaces qui ont été bien calibrés du point de vue du timing on peut atteindre jusqu'à 115 200 bits par seconde. Alors vous avez un microcontrôleur. Il dispose, presque tous disposent des signaux Tx et Rx compatibles avec ce qu'on vient de voir. Vous pouvez transmettre à un périphérique ou à un autre microcontrôleur, l'interface se prête extrêmement bien à des communications entre microcontrôleurs. Et la difficulté traditionnelle, c'est que vous avez un signal qui sort du microcontrôleur, qui s'appelle Tx, qui arrive de l'autre côté, qui doit s'appeler Rx, à quel moment est-ce qu'il change de nom, quel est le nom des pins à donner à un connecteur intermédiaire? C'est souvent une source d'erreur puisque les gens n'ont pas très bien compris cette fonctionnalité. De même pour le Rx, Tx, vous avez compris et naturellement, il y a toujours une référence de potentiel entre les unités que l'on interconnecte avec un bus ou avec un autre. Si vous voulez vous relier avec USB, le protocole est assez complexe, et cela a mis un certain temps avant que les microcontrôleurs contiennent les signaux pour commander USB, il y a tout un petit paquet de logique à mettre à l'intérieur du processeur, qui utilise beaucoup de transistors. Donc ce que vous voyez encore sur beaucoup de cartes Arduino, c'est un circuit FTDI qui fait l'interface entre les signaux Tx, Rx et USB. Alors maintenant si vous voulez vous connecter avec un PC, on a déjà vu les possibilités avec le terminal, il y a des possibilités plus performantes qui sont offertes, par exemple avec processing.org qui vous permet de faire une visualisation graphique sur l'écran du PC de données que vous avez préparées sur votre microcontrôleur. Deux mots sur le RS232, qui est en fait la source historique de cet UART, c'était prévu pour transmettre sur une certaine distance avec des tensions de plus ou moins 12V, le signal est simplement inversé par l'amplificateur 12V. Le RS232 original contenait, contient des lignes de contrôle pour un modem, c'est un connecteur à 25 pattes qui, souvent, a des versions réduites à 9 pattes sur les anciens PC. Bien, ce protocole qu'on vient de voir, vous transmettez et vous n'êtes pas sûrs qu'il y avait quelqu'un à l'autre bout pour recevoir le message. Donc c'est ce qu'on appelle un protocole, en aglais, Send and pray, envoyer et prier pour que ça arrive et j'aimerais le comparer avec un autre protocole, qui évidemment est plus intéressant, qui s'appelle Handshake, il n'y a pas de traduction française, c'est la poignée de main qui fait que lorsque vous avez transmis à votre périphérique, et bien vous savez qu'il est bien là et qu'il va vous répondre. Alors un exemple ancien dont on trouve des résidus encore dans certains processeurs c'est l'interface parallèle de Centronics, qui est un fabricant d'imprimantes qui a eu beaucoup de succès il y a 20 ou 30 ans, vous envoyez 8 bits en parallèle et avec ces 8 bits en parallèle, vous avez un signal Strobe qui va vous dire : l'information est présente. Vous avez préparé vos 8 bits et vous avez un signal Stobe qui peut être positif, qui peut être négatif, qui en fait à l'époque, je crois, est un signal statique. Donc le récepteur peut prendre cette information et maintenant il va vous répondre avec un signal qui s'appelle Aknowledge, le temps se déroule horizontalement, et comme ça, vous savez que le caractère a été reçu, ici, ça va activer un flag dans le périphérique pour dire : c'est arrivé, il faut s'occuper du data, ici, ça va activer un flag, un fagnon, dans le, le maître pour lui dire : tu peux envoyer le caractère suivant. Donc là , on n'a pas de contrainte de timing et ce bus Centronics avait aussi, à l'époque on n'avait pas peur des gros connecteurs, c'était un énorme connecteur de 38 pins avec des signaux de contôle pour l'imprimante. Un type de transmission qu'on va retrouver dans différentes formes, c'est le SPI, Serial Peripheral Interface. Vous avez un maître qui envoie une impulsion d'horloge avec les données associées, comme dans le cas de l'UART, mais les horloges démarrent au moment où vous avez de l'information à envoyer. Dans l'état de repos, le clock est à l'état 1, dans certains cas à l'état 0, les données sont quelconques et il faut maintenant bien savoir à quel moment vous allez modifier les données, échantillonner ces données, ici c'est avec un flanc montant, et puis ensuite, continuer la transmission de 8 bits. Alors peu de choses sont précisées, il y avait, à propos de ce, de cette façon de transmission, donc il faut chaque fois bien se renseigner : quel est l'état de repos du clock, quel est le front actif? Alors, en même temps que vous transmettez vers l'esclave, vous pouvez récupérer de l'information de l'esclave et là , remarquez la clarté de ces noms, pour une fois, MOSI, mircoprocesseur out, vous savez que cette pin, sur le maître, c'est du out pour le microprocesseur, slave in, vous savez sur l'esclave que c'est une entrée. Et en sens inverse, MISO, microprocesseur in, slave out. Alors là aussi, il faut savoir à quel moment l'esclave va transmettre les données par rapport au maître, donc là j'ai pris l'option où c'est au niveau de l'esclave, le flanc montant aussi qui va déclencher le décallage. Donc vous allez trouver le bit 0 et vous remarquez que c'est décallé, ce qui, dans certains cas, peut poser certains problèmes au moment de la lecture où soit vous lisez trop vite, soit vous lisez trop tard et vous perdez le dernier bit. Donc là il faut bien analyser ces diagrammes d'état. Maintenant, on avait vu qu'on a besoin d'un start bit, qu'on a besoin du stop bit. Ici, il est réalisé avec une ligne supplémentaire qui s'appelle Slave select. Au moment de la transmission, on active ce signal qui veut dire : une information arrive, et puis le stop bit, ici, l'information est arrivée. Un autre interface beaucoup plus astucieux, c'est l'I2C. Alors avec I2C, il y a une convention absolue maintenant alors concernant l'horloge, qui s'appelle SCL, Serial Clock, c'est que les données sont échantillonnées par un flanc montant et les données de doivent pas changer pendant la durée de l'horloge. Donc vous avez une impulsion positive de l'horloge et les données doivent être stables pendant cette période. Ceci nous permet de faire une astuce qui est de dire : mais si les données ne changent pas quand l'horloge est à 1, on peut décider que si les données changent, c'est une information différente. Donc, ici, au début du message, l'horloge est à 1 et le fait que les données passent de l'état 1 à l'état 0, au repos la ligne est à l'état 1, on a ici un start, l'équivalent du start bit. Et de la même façon, on va trouver un stop bit ici en remettant le signal à 1. Alors il peut être nécessaire évidemment de, pendant que l'horloge est à 0, de bien remettre ici le signal à 0 pour qu'il ait son effet. Un peu plus en détail le début de la séquence, vous avez le start bit, vous avez les données qui sont stables ici, pendant que l'horloge est à 1, vous transmettez 8 bits, et là il y a une jolie astuce qui est de dire : je vais transmettre un neuvième bit en donnant la parole à l'esclave. Ce qui veut dire que le maître, ici, arrête d'envoyer de l'information et l'esclave peut intervenir pour imposer un 0 sur la ligne ou, au contraire, ne pas imposer une action, ce qui peut être considéré comme catastrophique ou contraire, une simplification dans l'interface où on n'avait pas besoin de ce, de ce Handshake, de cette synchronisation des échanges. Alors là , on a en fait le signal avant l'amplificateur de sortie du maître. Là , on a le signal avant l'amplificateur de sortie de l'esclave. Comment est-ce que c'est combiné au niveau du bus? Alors, on a, SCSI est vraiment un bus avec certaines parentés avec les bus des microcontrôleurs, bus internes. Vous avez un maître, vous avez des esclaves. Je n'ai pas mis de noms parce que on a une belle symétrie sur ce bus et dans le protocole qui fait qu'il faut, naturellement, un maître pour coordonner les échanges mais ce maître peut très bien donner la parole à un esclave en lui disant : dorénavant, c'est toi qui est le maître, moi je serai l'esclave. Ça se produit dans les sociétés humaines aussi. Alors une différence importante par rapport aux bus des microcontrôleurs, dans un bus de microcontrôleur, vous avez l'état 0, vous avez l'état 1 quand c'est programmé en sortie, vous avez l'état flottant quand l'entrée d'un microcontrôleur est en entrée et au niveau de ce bus avec les signaux clock, data, le 0 sera l'élément actif, le 1 est exclu, le 1 sera forcé par des pull-ups et ça veut dire que si vous avez une pull-up qui impose l'état 1, n'importe quelle unité peut imposer un 0 sans se trouver en court-circuit avec une autre unité qui chercherait à mettre un 1. Donc ce grand principe de ce qu'on appelle collecteur ouvert, mais on ne vous l'a pas présenté comme ça. Donc on va travailler entre l'état 0 et l'état flottant et, au lieu d'écrire sur le bus des 0 et des 1, on va préparer un 0 dans le port de sortie et puis programmer état so, avec le registre de direction qui a différents noms suivant les processeurs, on va programmer ici direction sortie et on aura 0 sur la sortie puisqu'on l'a préparé dans le port et puis direction entrée et c'est soit un état 1, soit une possibilité de lire de l'information qui vient d'une autre unité. Alors la programmation est un petit peu plus délicate à cause de ça mais quand on a bien compris, on définit des modules qui correspondent à ces différentes fonctions start bit, stop bit, data euh, aknowledge. Mais je vous conseille quand même d'utiliser des librairies qui sont bien faites et qui correspondent aux besoins du périphérique parce que j'ai expliqué comment transmettre 8 bits mais en fait on va transmettre des messages avec des adresses, avec des répétitions de données et ceci dépend beaucoup des périphériques utilisés des circuits intégrés qui ont été connectés. Bien, quelque chose de bien connu aussi, c'est les, la télécommande infrarouge, ou les transmissions radios, où là en fait, il y a l'équivalent que d'un seul fil pour transmettre. Alors avec les circuits de télécommandes infrarouges, vous avez une diode infrarouge sur laquelle vous envoyez des trains d'impulsions à 40 kH. Et la durée de ces trains est de l'ordre de la milliseconde et des circuits spéciaux, il ne faut pas en utiliser d'autres, ils sont faciles à obtenir vous permettent d'intégrer, dans le fond, cette séquence avec un certain retard et de aussi fournir un signal, actif à 0 en général, qui correspond à ce train d'impulsions avec un léger retard. L'intérêt de ces circuits, c'est que non seulement ils intègrent, mais ils ont aussi un contrôle automatique de gain. Qu'est-ce que ça veut dire? Ça veut dire que si le signal est faible, et bien il y a une amplification plus importante et ça permet de couvrir des distances beaucoup plus, un petit peu plus grandes puisque, évidemment, l'intensité du signal, ici, diminue avec le carré de la distance. Alors évidemment, si vous êtes loin, le contrôle automatique de gain augmente la sensibilité au maximum et vous allez plus facilement capter des parasites. Alors dans les télécommandes commerciales, on trouve beaucoup le code RC5 Qui a ce type. On n'a plus qu’un fil pour transmettre des 1 et des 0. Donc on va jouer sur la longueur des impulsions ou sur le déphasage. Là , toutes les fois que vous avez un flanc descendant, c’est un 0, toutes les fois que c’est un flanc montant, c’est un 1. Donc tout cela donne des communications dites sans fil, mais, pour nous il y a un canal de transmission, une ligne de transmission. Eh bien, on rencontre des protocoles plus ou moins, on rencontre des formes d’ondes plus ou moins astucieuses dont on ne va pas parler. Alors, chaque impulsion, ici, correspond en fait à un train de 32 impulsions, bon il y en aura 2 fois plus ici. Et, c’est ce que j’avais représenté là . Alors il y a quelque chose qui devrait vous faire sourire dans cette figure : 1 virgule 7, 7, 8 millisecondes de largeur d’impulsion. Celui qui a écrit ça est certainement pas ingénieur, on ne peut pas, en physique, sauf dans des cas, vraiment en investissant beaucoup d'énergie, arriver à des précisions pareilles, moins de 1 pour 1000 et du point de vue programmation, c’est clair que vous ne pourrez jamais, jamais respecter des temps pareils. C’est absurde de donner des valeurs aussi précises et c’est inutile de donner une valeur précise, ce qu’on veut c’est avoir une fourchette de valeurs. Vous allez devoir programmer cette durée, et puis, étant donné la durée de la boucle, la durée des instructions, la vitesse du processeur, vous aurez le choix entre 1,7 et 1,8, peut-être un petit peu plus de précision. Ce qu’il nous faut, ici, c’est avoir la fourchette, dire le code que vous transmettez sera décodé ou sera décodable correctement si le temps est compris entre 1,5 et 1,9. Évidemment, plus la fourchette est large, plus le système sera tolérant aux changements de température et à d’autres conditions de fabrication. Et c’est vraiment quelque chose que beaucoup de fabricants n’ont pas compris. Donc, évidemment, ben, une fois que vous avez les, le minimum et le maximum, ben c’est facile de savoir, en vérifiant à l’oscilloscope, si vous êtes bien centrés par rapport à la gamme et mieux vous êtes centrés, mieux vous aurez de marge en cas d’un fond d’incertitude. Alors, pour revenir à ce code RC5, vous avez 3 bits de synchronisation, je dirais, bits de départ. Ensuite, vous avez ce qu’ils appellent « system bits », c’est en fait une adresse, c’est des encodages. Et puis vous avez vraiment, ici, la commande. Alors, pour un fabricant donné, ben, il va définir ces temps, il va appeler ça RC5 mais il va définir des temps à son idée, il va définir des bits de départ à son idée, il va définir des codes et des commandes qui dépendront des instruments qu’il a mis en production. Évidemment, il s’arrange d’être incompatible avec la concurrence, puisqu’il faudrait pas que sa télécommande commande, dans le fond, un appareil concurrent, ce que l’utilisateur n’apprécierait pas. Donc, voilà , je ne vous encourage pas à croire que c’est facile d’utiliser une télécommande que vous n’utilisez pas pour programmer votre robot ou autre chose. Sans oscilloscope, vous aurez de la peine à savoir exactement quel est le code utilisé, en, sachant que c’est des structures comme ça, en pressant les boutons, on arrive à repérer en général cette partie-là qui contient la commande et passer sur le reste de l’information et arriver à décoder correctement ce qui nous intéresse. Bien, un dernière interface, maintenant, qui a, lui, véritablement, dit un seul fil. Mais en fait, un seul fil ne suffit pas, il faut toujours une masse et puis il faut une alimentation pour alimenter les esclaves, ici. Et ce principe qui a été proposé par Dallas, qui s’appelle « 1-wire » et a peut-être d'autres noms. Vous avez un maître qui fait tout, qui va interroger les unités. Et comment est-ce que ça fonctionne? Et bien le principe, pour envoyer les bits, c’est de dire si j’ai un 0, par exemple, j’envoie une impulsion courte, si j’ai un 1, j’envoie une impulsion longue. Je mets suffisamment de silence entre eux deux pour pouvoir générer ces signaux. Vous voyez, ici, que c’est une valeur de 6 microsecondes, ça se laisse tout à fait gérer avec des routines c'est de bas niveau, il ne faut pas utiliser un « digital right » qui lui prend 10 microsecondes. Mais si vous utilisez directement les instructions et bien c’est facile de respecter ces timings et naturellement, il faut un oscilloscope ou d’autres trucs pour vérifier les temps. Alors maintenant, en réception, là , c’est un petit peu plus astucieux, puisque c’est toujours le maître qui commande et le maître va faire comme s’il envoyait un 1, ici, en partant de l’idée que c’était un 1 mais ensuite, il va se mettre à l’écoute. Et l’esclave qui a repéré cette sélection va dire, ben, voilà au bout de 6 millisecondes, le maître va se déconnecter donc moi, dans cette milliseconde, je vais m’activer en sortie et si c’est un 1, je ne fais rien, si c’est un 0, je maintiens le signal pendant assez longtemps, pour que le maître puisse l’observer. Donc, voilà , alors, au bout de 15 microsecondes, ben, le maître va observer ce signal, ça peut varier entre 10 et 20, ça pourrait même varier, apparemment, jusqu'à 60, puisque l’esclave va maintenir son information pendant 60 microsecondes en tout, et puis ensuite, garantir dans le fond que ça remonte à 1 en 10 microsecondes. Donc voilà un joli petit exercice de programmation, que vous risquez de retrouver. Alors encore une chose à propos du nombre de fils. Eh bien, étant donné que le signal, ici, est à 1, on impose ce 1 avec une pull-up, là , parce que, au moment où le maître se met à l’écoute, les esclaves doivent transmettre leur information et je crois qu’en général, il y a une pull-up, là , elle est peut-être pas indispensable, oui, elle est indispensable pour éviter un court-circuit dans cette zone-là , où il y a inversion de la direction. Bien, puisqu’on a un 1 en permanence, ici, enfin, la majorité du temps, on peut charger un condensateur avec cet état 1 à travers une diode et obtenir l’alimentation du circuit, à travers cette petite alimentation, même pas régulée mais les circuits sont très tolérants à des variations de tensions entre 3 et 5 volts. Donc voilà , on a pu réaliser un bus à 2 fils sur lequel on peut accrocher toute une série de circuits, vendus par Dallas et d’autres fabricants, qui permettent de mesurer des températures, de stocker de l’information et cetera. Et c’est évidemment très avantageux en domotique. Vous partez avec 2 fils, à travers, à travers votre maison et vous récupérez l’information. C’est lent, mais ça n’a pas d’importance pour mesurer des températures et surveiller des portes qui vont mettre en tout 15 secondes pour s’ouvrir. Bien, alors, voilà , on a pu voir et comprendre plusieurs interfaces série, se rendre compte que c’est très important de bien réfléchir aux impulsions d’horloge, à la stabilité des données, et deviner qu’il y a, là , derrière, une masse d’applications, beaucoup de circuits intégrés qui permettent de faire des choses très intéressantes avec un microcontrôleur.