Tesseract : la reconnaissance de caractères pour tous

Depuis des décennies, on nous promet un avenir sans papier, où tout serait numérique. Pourtant les courriers s’accumulent chez nous, et les administrations (en France et un peu partout en Europe) continuent de ne jurer que par le papier. Factures, attestations, chèques, journaux, bulletins de paie, carnets scolaires, procès verbaux, comptes-rendus médicaux… Ces documents s’entassent, se froissent, s’oublient, puis se perdent.

Foutu karma

Puis un jour, vous en avez besoin. Seulement d’un. Celui que vous aviez reçu il y a quelques mois en vous disant «Ah oui, ce papier, il est important lui !», vous l’aviez mis sur la pile «IMPORTANT» comme les quarante-sept autres avant lui. Vous fouillez cette pile, pleine de pub, enveloppes, factures téléphoniques,… Aucune trace du sésame. La pile du dessous ? Pas plus de résultat. Celle derrière l’imprimante alors ? Cherchez encore.

Vous finissez par retourner votre bureau, puis votre chambre, et ensuite le salon. Le meuble de l’entrée y passe aussi. D’autres papiers s’échouent entre vos mains, et vous soupirez «Celui là est important aussi, je le met de coté».

Soit, après deux heures de recherche vous abandonnez, avant de le retrouver plié en-dessous d’une ramette de papier éventrée. Bilan, votre bureau semble avoir été traversé par une tornade. Dans le salon, des tas de feuilles occupent le canapé, la table basse ainsi qu’une partie du sol. Mais vous l’avez.

Ouf, jusqu’à la prochaine…

Combien sommes-nous, a souhaité disposer d’une fonction de recherche dans nos appartements ? Dans nos rangements ? Dans nos vies ?

Comme vous pouvez le deviner, je n’ai pas la fibre du rangement, que mes parents semblent pourtant avoir. J’entasse. Et je pousse plus loin tant que j’en ai pas besoin.

Aujourd’hui, il y a pourtant des solutions permettant de scanner vos documents, afin de les trier. Mais c’est fastidieux. Au-delà de l’acquisition en une image, il faut ensuite les nommer, les trier, les classer par date, etc. On passe au moins quelques minutes par document, et c’est inenvisageable de vouloir rattraper un arriéré de plusieurs centaines de courriers.

Les logiciels OCR (Reconnaissance optique des caractères) permettent de transformer une image, comme un courrier scanné, en texte. Il en existe depuis les années 80, mais outre les solutions industriels, hors de portée pour un particulier, le grand public a longtemps dû se contenter de programmes de mauvaise qualité qui frôlaient l’arnaque.

Jusqu’à la publication de Tesseract.

Merci Google, HP (et les autres)

Tesseract est une solution mise au point par HP puis abandonnée dans les années 90. En 2005, le code source a été placé sous licence libre Apache, et Google sponsorise son développement depuis. La solution consiste en une simple commande, que l’on peut enrichir de greffons et de distribution de langue. En effet, donner la langue d’un texte à un logiciel de reconnaissance permet d’améliorer grandement la qualité, celui-ci pouvant comparer les résultats plausibles avec des dictionnaires.

Il devient possible de produire un fichier texte, un fichier HTML ou un fichier PDF depuis une image. La qualité est très bonne, et la légèreté de la solution permet de l’embarquer dans une suite plus complète.

L’installation

Les distributions Linux proposent Tesseract dans leur dépôts par défaut, pour Fedora :

ou Ubuntu :

Il est également nécessaire d’installer des distributions de langues pour profiter au mieux de la solution :
Fedora :

Ubuntu :

Il existe des Ports pour Mac OS, et des paquets non-officiels pour Windows, vous pourrez les trouver sur le Wiki GitHub du projet.

L’utilisation

Une fois le document acquis au format TIF, PNG, GIF, BMP ou JPG, il suffit d’appeler la commande de la façon suivante :

Le texte s’affichera sur la sortie standard. Pour avoir un résultat optimal, il est recommandé de scanner à au moins 300ppp (point par pource, soit dpi).

Il est possible de créer un PDF à partir de cette image, afin d’y superposer le texte reconnu:

Vous trouverez un fichier PDF où le texte peut être sélectionné et copié.

Au boulot !

Des solutions, comme Mayan EDMS, intègrent Tesseract et construisent un moteur de recherche sur les termes issus de la reconnaissance. Ainsi, il suffit d’alimenter une boite aux lettres avec les documents fraîchement scannés, pour les voir être automatiquement trier et classer. Puis mettre le papier dans une archive, et ne plus jamais l’ouvrir !

Ethereum : Premiers pas sur la blockchain

La blockchain est un mot à la mode ces derniers temps, d’autant plus après les annonces d’IBM de Canonical et de Samsung, et avec le développement de solutions comme Rubix ou Ethereum, ce nom cache pourtant une technologie qui pourrait autant révolutionner la société que ne l’ont fait la démocratisation d’Internet ou de l’avènement de la base de données.

Qu’est-ce que la blockchain ?

Comme déjà décrite dans mon article sur les cryptomonnaies, la blockchain est une succession d’ensembles de transactions, appelés blocs, où chaque bloc s’ajoutant apporte une somme de contrôle relative aux blocs le précédant. Ainsi, plus le temps passe, plus les vieilles transactions sont considérées comme authentiques, car la moindre modification à leur niveau engendrerait une toute autre blockchain, contenant des sommes de contrôle radicalement différentes.
La distribution pair-à-pair de ces blocs vient enfin partager l’information entre les nœuds, afin d’assurer une résilience et une sécurité véritablement démocratique.

La blockchain est donc la technologie au cœur des cryptomonnaies, comme le Bitcoin, et le caractère immuable et irréfutable des ses transactions en font un modèle unique pour le stockage d’informations authentiques.

Pourquoi la blockchain ?

En effet, la blockchain n’a pas pour but premier l’efficacité de son modèle, ni la confidentialité. Il n’est donc pas question ici de stocker des documents professionnels, ou des programmes gourmands en ressource. Cependant, ces documents peuvent être signés par des applications de la blockchain, et les programmes peuvent déporter une fraction critique de leur exécution ici également.

Un document signé de cette façon disposera d’une preuve mathématique de cette signature, tout comme le résultat d’une fonction exécutée par la blockchain sera validé par l’intégralité de ses nœuds. La blockchain se mue ainsi d’une série de transactions en une longue file d’informations et procédures se sécurisant les unes après les autres.

Ethereum : Rendre la blockchain intelligente

La première application de la blockchain a été le Bitcoin. Les instructions déployées sur la blockchain se limitaient à des transactions.

Ethereum est un projet ambitieux, qui dispose d’une cryptomonnaie propre (l’Ether), mais qui vise également à développer une blockchain programmable. Il est ainsi possible d’exécuter tout type de programme au sein de la blockchain, celui-ci étant alors exécuté quasi simultanément sur tous les nœuds. Attention, il ne s’agit pas ici d’un programme découpé pour être exécute sur plusieurs processeurs pour le rendre plus rapide ; chaque instruction du programme est exécuté sur l’ensemble des nœuds de la blockchain, dans une machine virtuelle appelée EVM (Ethereum Virtual Machine).

Bien entendu, la monopolisation d’une telle quantité de ressources ne se fait pas gratuitement, il est nécessaire de rétribuer les mineurs qui vont sécuriser l’exécution pour nous. Cela se fait en leur envoyant du Gas (Essence en anglais). Le Gas est une jeton dont la valeur est directement convertie en Ether lors de l’utilisation (on ne stocke donc pas de Gas), mais dont la valeur est ajustée afin d’éviter des coûts de fonctionnement trop variables par rapport à la vie réelle.

La consommation en Gas d’un programme sera directement liée à son coût en temps de processeur dans l’EVM, à son utilisation de la mémoire, ainsi qu’a la quantité d’informations stockées dans la blockchain.

Le Gas dispose d’une limite haute, que l’on ne peut pas dépasser pour une seule transaction. Cela permet ainsi d’empêcher une personne très riche de monopoliser la blockchain, ou encore à un attaquant de tenter d’envoyer une boucle infinie qui paralyserait tout le réseau. Cette limite est variable et dépend de la puissance de calcul fournie par le réseau de mineurs.

Une estimation de la consommation en Gas d’une transaction ainsi qu’une limite maximale permettent d’évaluer le coût réel et de garantir qu’une transaction sur la blockchain ne dépassera pas un certain montant en Ether, auquel cas, la transaction sera annulée et les sommes engagées rendues.

Programmer la blockchain

Les programmes au sein d’Ethereum porte le nom de Contract. Chaque contrat dispose de son propre code EVM. Ce code peut cependant être compilé depuis:

  • un langage derivé de JavaScript : Solidity, il est le plus couramment utilisé, je ne m’intéresserai qu’à celui-ci dans cet article
  • un autre dérivé de Python : Serpent
  • ou encore depuis du LISP : LLL

Un contrat est considéré comme un compte (il dispose ainsi de sa propre balance d’Ether) qui peut être administré par un autre compte. Les contrats sont publiques : tout le monde peut voir leur code et leur solde, et il est également possible de leur appliquer des fonctions.

Une fois déployé au travers de la blockchain d’Ethereum, les contrats peuvent recevoir des transactions (de l’Ether) ou des messages (des appels aux fonctions).

Ses messages peuvent être envoyés non seulement au travers d’un porte-feuille (Wallet), mais également au travers de la ligne de commande (geth) ou encore d’applications (Đapps) au travers d’une API JavaScript.

Des applications infinies

L’engouement que suscite la blockchain vient en grande partie de la variété d’applications que celle-ci peut supporter, avec un investissement en infrastructure nul et un coût d’utilisation très modeste.

Voici quelques exemples:

  • La blockchain pourrait remplacer facilement un réseau de notaires, ou chaque bien serait un jeton que des utilisateurs pourraient s’échanger. La transaction est ainsi inviolable et perenne : impossible de revendre un bien plusieurs fois ou de tricher sur sa propriété comme un notaire peu scrupuleux pourrait l’envisager (je ne vise absolument personne, je ne fais qu’imaginer un exemple).
  • On pourrait entièrement dématérialisé les passeports, ceci pourraient être communiquer verbalement à l’agent des douanes sous la forme d’un nom, prénom, date et lieu de naissance, ainsi qu’une clef. Ces informations seraient « hashées » sous la forme d’une somme de contrôle, qui accèderait ainsi à un fichier de photos et d’empreintes digitales stocké dans la blockchain. Ces enregistrements dans ce fichier seraient signés par un bureau de citoyenneté (mairie, préfecture, …) auquel le bureau des douanes choisirait de faire confiance ou non. Un passeport volé serait ainsi facilement repéré, et les passeports issus de bureaux compromis pourraient être interceptés très facilement. Enfin, un voyageur pourrait s’identifier sans document, ou tout au plus avec un simple QR-code.
  • Une organisation très répartie sur un territoire (parti politique, coopérative, …) pourrait organiser des élections très facilement, en autorisant les comptes de ses membres à utiliser un contrat de la blockchain. Les résultats sont ainsi infalsifiables, et chacun peut vérifier les méthodes d’accès au vote et de calcul dans le code, tout en garantissant l’anonymat des participants.
  • Un service de noms de domaines pourraient être implémentés très facilement. Sa décentralisation accorderait une haute résilience au service, et il serait possible de gérer la réservation et l’expiration sans aucune intervention humaine.

Cet article s’est surtout intéressé à une blockchain publique, mais il est toujours possible de créer sa propre blockchain. Il sera alors nécessaire de fournir soi-même des mineurs, et l’infrastructure aura un coût que la vente d’Ether ne pourra pas amortir (l’Ether privé n’intéressera personne, contrairement à la blockchain publique). Cependant la robustesse de cette technologie en fait une candidate toute trouvée pour de nombreuses applications dans les domaines financiers.

Bilan de la première semaine de sommeil «biphasique»

Voilà une semaine que l’experience a démarrer. Je vais donc commencer par un petit bilan positif/négatif:

Positif :

  • Je me sens moins fatigué en début de journée
  • Je ressens beaucoup moins de difficultés à me lever, mnais ce n’est pas encore parfait
  • Prendre la route du retour aussi tôt permet d’éviter beaucoup de bouchons

Négatif :

  • Hormis pour le weekend, je n’ai fait qu’une soirée au-dela de 22:00
  • Je n’ai reussi que deux siestes jusqu’ici, et elles ont duré trop longtemps (plus d’une heure et demie)
  • La route le matin à 6h n’est pas moins chargée qu’à 9h

J’ai réussi lundi après-midi à faire une vraie sieste, et pas seulement à tourner en rond dans mon lit en attendant le sommeil.
Il faut dire que je conditionne l’heure du coucher de nuit en fonction de la durée et de la qualité de la sieste.

Ainsi, vu que les jours précedents ne contenaient pas de sieste, je n’ai pas voulu tenter de veiller trop tard, afin de disposer de suffisement de sommeil pour ne pas louper le reveil.

Pour le moment je ne touche à rien concernant les heures de lever et coucher.

Experimentation de sommeil «biphasique»

Depuis une dizaine d’années déjà, je peine à équilibrer mon sommeil correctement. Plus  précisément, j’éprouve beaucoup de difficultés à me réveiller le matin. Je n’ai jamais conscience que mon réveil a sonné et que je dois, à ce moment, me lever. Au lieu de ça, j’ai «appris» à éteindre mon réveil pendant qu’il sonne, allant jusqu’à résoudre des puzzles ou des calculs mentaux sans jamais en avoir conscience une fois réveillé.

J’ai pourtant essayé toute sorte de dispositifs : applications, réveil-lumière, musique préférée, son infâme, douce mélodie ; rien n’y fait.

La faute à quoi ?

Aux trop nombreuses heures passées à bricoler, jouer, glander ? Aux nuits blanches arrosées du week-end qui transforment mes dimanches en siestes comateuses et mes lundis en sombres retours au quotidien ? Aux écrans qui embrasent ma vue à toute heure ? Au stress du trafic, du travail et de la performance permanente ?

Il doit y avoir de tout cela, oui.

J’ai essayé déjà quelques remèdes de grand-mère :

  • Ne penser à rien pour s’en dormir (authentique)
  • Manger très léger le soir, pour se réveiller affamé le matin (non, vraiment)
  • Changer d’heure de réveil de façon aléatoire, quitte à complétement oublier l’heure fatidique (cela n’amène que du stress, le cerveau adore calculer le nombre d’heures de sommeil restantes)
  • Traquer le sommeil par une application sur smartphone (qui va se transformer en véritable morceau de lave le matin)

Mais cela ne s’arrange pas

Le stress amenant le stress, je me retrouve maintenant à tourner en rond dans mon lit, attendant que le sommeil m’assaille, parfois plusieurs heures. Alors je traîne, je joue, je tente de me détendre. Mais voilà quelques mois que des raideurs parcourent mon cou, d’abord éphémères, elles provoquent maintenant des céphalées, comme si quelque chose essayait d’extraire mes yeux par la nuque.

Bref, aux problèmes de réveil s’ajoutent maintenant les tracas pour m’endormir, ce qui n’aide pas à passer des journées épanouissantes et réjouissantes.

La suite va vous étonner (ou pas)

Je suis actuellement dans une phase de transition au niveau professionnel. Je viens de terminer une longue mission, et je dois retrouver un emploi plus diversifié et moins orienté vers la performance. Il y a donc une «fenêtre de tir» pendant laquelle j’espère trouver la paix intérieure corriger ma gestion de sommeil catastrophique.

Par ailleurs, ce problème me pesant depuis un certain nombre d’années, j’ai eu le temps de glaner quelques méthodes, parfois exotiques, pour améliorer l’expérience utilisateur du sommeil.

Pour des modalités pratiques, je me suis mis d’accord avec mon employeur afin de travailler avec des horaires décalées, sauf en cas d’impératif extérieur.

J’ai donc entrepris d’adapter mes horaires de sommeil, de travail et de sieste, afin de trouver un cycle plus réparateur et plus régulier.

Et pour être sûr d’y arriver, j’ai décidé de

  • traquer mes heures de sommeil, trajets, travail et sieste
  • noter la qualité de mon repos
  • calculer ma «dette de sommeil», en prenant en compte l’accumulation sur quinze jours
  • faire un retour d’expérience (vous êtes en plein dedans), ceci afin de partager mon ressenti, mais surtout pour me motiver. Si quelqu’un lit un jour ces lignes, je suis sûr qu’il ou elle voudra connaitre la suite.
  • poursuivre cette expérience pendant tout le mois de mars 2016, et la renouveler si cela est concluant.

Dans les faits, ma journée ressemblera à cela :

  • 5:20 : levé, douche et départ pour le travail
  • 7:00 : arrivée au travail
  • 12:00 : pause déjeuner
  • 15:30 : fin de la journée de travail
  • 16:30 : sieste
  • 17:00 : réveil
  • 21:30 : coucher

Je n’ai pas encore décidé à quoi ressembleront mes weekends.

J’écris cet article au troisième jour de l’adaptation de ces cycles. La nuit dernière ne s’est pas bien déroulée (fièvre, cauchemar, nausée). Cela s’est calmé pendant la journée.

J’essaie de faire un point dans le courant de la semaine prochaine.

Microcontrôleur – Chapitre 3 – Les périphériques

Les entrées/sorties

La plupart des broches d’un microcontrôleur (en général toutes, sauf GND, VCC et RESET) ont comme comportement par défaut la possibilité d’être utilisée comme entrée ou sortie numérique.

On parlera des I/O (ou GPIO pour General Purpose Input/Output) ou E/S en français. Ces broches sont rassemblées communément par port. Il y a souvent plusieurs ports par microcontrôleur, et leurs broches ne sont pas nécessairement côte-à-côte.

Ces I/O sont accessibles au travers de plusieurs registres ; rassemblés par port. On trouve principalement les registres suivants :

  • le registre de direction, où on indique dans quelle direction est utilisé la broche (entrée ou sortie)
  • le registre de sortie, où on peut écrire l’état souhaité d’une broche
  • le registre d’entrée, qui permettra de lire les états des broches d’un port

Il est possible de définir une interruption lors du changement d’état sur un port, ce qui permet au développeur de ne pas avoir à surveiller l’état des broches en permanence.

Il convient de réfléchir néanmoins au projet que l’on souhaite créer en utilisant les I/O, car presque toutes les broches ont des fonctions cumulées, c’est à dire qu’une broche en particulier peut servir d’I/O mais aussi faire partie d’un bus de communication, une autre peut être une entrée analogique, etc.

La réduction de la taille des microcontrôleurs poussent les constructeurs à faire des sacrifices ; et il existe des alternatives, que l’on verra surement plus tard, qui permettent d’étendre les ports.

Les compteurs

Pièce maitresse de nombreux mécanismes au sein d’un microcontrôleur, le compteur (parfois appelé timer) est un outil puissant qui se contente d’incrémenter un registre (ou plusieurs) et de déclencher une interruption à partir d’un certain seuil. Selon les microcontrôleurs, vous trouverez des compteurs de 8bit, 16bit ou autres, avec généralement les paramètres suivant :

  • le seuil ; c’est à dire le moment ou le microcontrôleur va déclencher l’interruption
  • la valeur de départ
  • le sens (descendant ou montant)
  • le diviseur ; qui permettra de définir des compteurs plus long en terme de cycle (par un exemple un incrément n’aura lieu que tous les 64 ou 1024 cycles). Ceci permet de ralentir un compteur pour permettre de passer du MHz au kHz voire en dessous pour de multiples applications (créer des sons, des effets visibles à l’œil donc inférieurs à 25Hz, …).
  • le mode (en montée, en montée puis descente, etc.)

Ainsi, avec un processeur cadencé à 1Mhz, si je configure un compteur 16bit pour déclencher une interruption dès qu’il atteint 976, lorsque son diviseur est à 1024, j’obtiendrai une interruption au bout d’une seconde.

Ces paramètres dépendent fortement du constructeur et du modèle de microcontrôleur utilisé, et comme beaucoup d’autres concepts, il est obligatoire de disposer de la documentation.

Les convertisseurs analogique vers numérique

Souvent abrégé CAN en France (à ne pas confondre avec le bus CAN), on parle d’Analog to Digital Converter en anglais (ADC). Il s’agit d’un montage dont le but est d’approximer une grandeur sur une échelle de taille déterminée.

Par exemple, un convertisseur de résolution 10bit pourra donner une valeur entre 0 et 1023. Si je cherche à mesurer une tension entre 0V et 5V, j’aurai une précision au mieux de 4,88mV. Aussi, si la valeur réelle est de 3,82V, j’obtiendrai un résultat de 782 ce qui équivaut en réalité à 3,818V.

La conversion est un processus qui demande beaucoup de cycles pour être précise. Il existe plusieurs méthodes de conversion (je ne vais pas les détailler) et chaque microcontrôleur va pouvoir réaliser un certain nombre de conversions en un temps donné, avec une résolution donnée. On parlera ici d’échantillon (sample en anglais). Par exemple, un convertisseur peut fournir 15ksps avec une résolution de 12bit, soit 15000 échantillons par seconde, chacun compris entre 0 et 4095. Mais dans le cas d’une conversion avec une résolution de 16bit, la vitesse peut être de 1ksps.

Dans la pratique, il s’agira de configurer la conversion, de la lancer, puis d’attendre une interruption (ou une valeur particulière dans un registre) pour ensuite lire la valeur obtenue.

Les convertisseurs numérique vers analogique

On parlera plus communément de PWM (Pulse Width Modulation, soit Modulation de largeur d’impulsion). Ce mécanisme va permettre d’obtenir une pseudo-valeur de tension analogique depuis une valeur numérique.

Pourquoi pseudo ? Parce qu’en réalité le microcontrôleur ne peut fournir que la masse GND (0V communément), ou la tension d’alimentation VCC (par exemple 5V). Donc quand on utilisera un PWM, pour obtenir 1V, on devra faire en sorte qu’une impulsion sur cinq soit à VCC tandis que les autres seront à GND.

Pour faciliter la configuration, les sorties PWM sont liées à des compteurs (parfois plusieurs sorties sur un même compteur), les paramètres sont donc similaires, mais on peut en ajouter quelques uns :

  • seuil de bascule ; le moment ou la sortie PWM passera de GND à VCC ou vice versa
  • le mode (à compteur triangulaire ou en dent de scie, …)

Il est important de garder en tête que le signal PWM tel qu’obtenu reste un signal numérique, et qu’il peut atteindre une tension égale à celle qui alimente le microcontrôleur. Afin d’éviter d’endommager des composants sensibles (par exemple un composant qui ne supporterait une tension que d’1.5V alors que le microcontrôleur est alimenté en 5V), il peut être nécessaire de filtrer la sortie (avec un montage R/C) pour passer d’une tension en créneaux à une courbe plus juste.

On peut également isoler galvaniquement les circuits (c’est à dire qu’il n’y a aucun contact électrique entre alimentation et pilotage) ; il faudra cependant ajouter une alimentation indépendante du microcontrôleur, mais ceci permettra d’obtenir des tensions bien différentes (piloter du 12V depuis un circuit 5V).

Les comparateurs

Il n’y a pas de démystification à faire ici, puisqu’un comparateur se contente de comparer deux entrées analogiques, sans nécessairement les mesurer.

Il suffit de lier un circuit analogique avec une masse commune à chaque du comparateur (variateur, photorésistance, capteur analogique, …), il sera alors possible de lire directement dans un registre quel circuit délivre la plus grande tension.

Il est également possible de déclencher une interruption sur un changement d’état.

L’interruption RESET

La plupart des microcontrôleurs (et beaucoup de circuits intégrés) dispose d’une broche RESET. Celle-ci, comme son nom l’indique, permet de réinitialiser l’appareil.

Si on applique la masse à cette broche, alors on déclenche la réinitialisation ou un état particulier (écoute de la programmation en SPI par exemple).

Le chien de garde

Ce mécanisme, appelé Watchdog en anglais, permet de s’assurer qu’un microcontrôleur n’est pas figé. Le concept est simple ; lorsque le chien de garde « surveille » l’exécution, un registre doit être mis à jour avant un certain délai continuellement. Si une période trop longue s’écoule sans mise à jour, le watchdog va lever une interruption.

La plupart du temps, il va s’agir de redémarrer le microcontrôleur comme un RESET. Il est possible de changer ce comportement (par exemple forcer l’arrêt d’un moteur en cas de défaut du programme avant le redémarrage, ou allumer une diode d’erreur), et de faire varier le délai d’alerte (par exemple 60ms, 250ms ou 8s).

Les autres périphériques

Si on monte en gamme, on peut trouver au sein du microcontrôleur des fonctionnalités plus pointues comme :

  • un superviseur d’alimentation
  • un thermomètre
  • une horloge temps-réel (RTC)
  • un générateur de fréquences
  • une unité de chiffrement
  • une unité de signature

Microcontrôleur – Chapitre 2 – Le processeur

Le processeur est un composant complexe et incontournable. Après son invention à la fin de la Seconde Guerre Mondiale, sa taille a fortement diminué (de plusieurs dizaines de mètres de large à quelque millimètres) pour donner naissance au microprocesseur dans les années 1970.

Depuis, la densité de transistors présente au sein d’un processeur n’a cessé de croitre au point de doubler tous les deux ans (selon la célèbre loi de Moore). Ainsi les processeurs actuels (en 2015) contiennent un million de fois plus de transistors que les premiers microprocesseurs mis sur le marché quarante ans auparavant.

Le processeur d’un microcontrôleur est caractérisé par :

  • son architecture qui lui fournira un jeu d’instructions ainsi qu’une taille de registre (8bit, 16bit, …)
  • ses registres internes
  • la cadence de son horloge, qui peut être configurée de quelque kHz à plusieurs dizaines de MHz.

Les instructions disponibles peuvent être en nombre très variable selon les architectures. Elles sont en générales très primaires ; il s’agit :

  • d’opérations arithmétiques et logiques qui peuvent être effectuées sur les registres internes du processeur ou sur les mémoires ou entre les deux
  • d’opérations sur des adresses pointant vers des secteurs de mémoire
  • des sauts d’exécution vers des endroits de la mémoire

L’horloge

Un microcontrôleur possède généralement un cristal interne (quartz), qui jouera le rôle d’horloge par effet piézoélectrique. Il est souvent possible d’exploiter à la place un cristal externe, notamment pour utiliser des fréquences plus élevées que le cristal interne.

L’horloge va cadencer le processeur ; un tic correspondra à une instruction élémentaire. Une fréquence basse ralentira forcement l’exécution d’un processus, et empêchera d’utiliser des protocoles nécessitant une fréquence plus élevée. Elle permettra néanmoins de consommer beaucoup moins d’énergie. Une fréquence élevée permettra d’être plus efficace mais consommera plus d’énergie, ce qui peut également dégager de la chaleur.

Certains microcontrôleurs permettent de modifier leur fréquence pendant l’exécution ; c’est une fonctionnalité très intéressante qui permet d’économiser énormément d’énergie en mettant le montage en veille, en attendant par exemple une interruption (appui sur un bouton, détection de lumière, …). La fréquence passera alors à quelques kilohertz, remontant à plusieurs MHz lors d’une utilisation active.

La fréquence peut également être amplifiée par un mécanisme appelé « boucle à verrouillage de phase » ( PLL ; Phase-locked loop en anglais). On peut attendre ainsi des fréquences très élevées (2 à 10 fois la fréquence maximale), au prix de la stabilité et de la fiabilité du microcontrôleur.

Les registres

Il faut bien différencier ici deux concepts :

– les registres internes du processeur

– les registres externes en mémoire

On parlera dans les deux cas de registres, mais on se réfèrera la plupart du temps a des registres externes.

les registres internes

Un registre (interne) est un emplacement de mémoire particulier au sein du processeur. La quantité de registres est très limitée (quelques dizaines tout au plus). Leur taille est une constante du processeur ; un processeur 16-bit aura des registres de 16 bits.

Il y a plusieurs registres internes significatifs :

  • le compteur ordinal : il s’agit du registre qui pointe vers l’instruction en cours
  • le registre d’instruction : il contient l’instruction en cours
  • les registres « données » : leur utilité est principalement de charger des données qui vont être manipulées dans les prochains cycles, afin de minimiser le temps de traitement
  • les registres « adresses » qui font office de pointeurs vers des zones de la mémoire
  • (il existe beaucoup d’autres types que je ne détaillerai pas ici)

Dans le cadre du développement sur microcontrôleur, leur utilisation est totalement transparente, sauf à vouloir utiliser des commandes assembleurs brutes.

les registres externes

Ces registres, stockés en mémoire, sont liés à l’état d’un composant ou d’un périphérique de façon directe. Ils peuvent être en accès libre, en lecture seule ou en écriture seule.

Dans le cadre d’un microcontrôleur, les registres commandent directement les principales fonctionnalités ; par exemple :

  • changer l’état d’une broche reviendra à changer un bit dans un registre
  • récupérer la valeur d’un compteur reviendra à lire un registre
  • écrire dans la mémoire reviendra à écrire dans un registre l’adresse dans laquelle on souhaite écrire, afin que le registre suivant dans lequel on écrira la valeur pointe vers ce secteur de la mémoire
  • lire une valeur analogique reviendra à écrire dans un registre pour déclencher l’évaluation d’un échantillon, attendre qu’un bit dans un autre registre atteigne une valeur particulière, et enfin lire un troisième registre (voire un quatrième registre selon la résolution) pour récupérer la valeur de l’échantillon
  • communiquer sur un port série reviendra à configurer une liaison dans plusieurs registres, puis à veiller un registre d’état de l’entrée de la liaison, pour enfin lire un registre de données jusqu’à ce que le registre d’état indique que la communication est terminée.

Vous l’aurez compris, les registres sont indispensables pour piloter un microcontrôleur.

Si vous voulez vous en convaincre, je vous encourage à lire les sources fournies avec les principales bibliothèques de développement pour microcontrôleur. Vous remarquerez, par exemple, que la fonction C utilisée pour changer la valeur d’une sortie va pointer vers un alias qui se contentera de changer la valeur d’un registre en particulier, ledit alias n’étant rien d’autre qu’une adresse en mémoire qui changera selon le modèle de microcontrôleur choisi lors de la compilation.

les registres de configuration

On les trouve très souvent sous le nom de « fuses » (fusibles) dans les documentations, car, historiquement, il s’agissait de petits fusibles rassemblés au sein d’une grille. On appliquait une tension de 12V à ceux que l’on voulait faire « claquer ». Cela rendait leur écriture définitive. Ils ont depuis été remplacés par de simples cases en mémoire.

Les registres de configuration sont utilisés pour configurer le comportement du microcontrôleur dès la mise sous tension ; on y trouvera des paramètres comme :

  • la configuration de l’horloge (interne ou externe)
  • la protection en écriture et/ou lecture
  • le comportement du watchdog
  • l’activation du débogage
  • l’activation de la broche RESET

Ces registres doivent parfois être configuré à part. Il est important de prendre toutes les précautions en les manipulant ; car une erreur de configuration pourrait rendre le microcontrôleur inutilisable.

Les bus internes

Pour assurer la communication du processeur avec sa RAM, sa ROM et ses périphériques, trois bus sont reliés:

  • le bus d’adresses, où le processeur va indiquer l’adresse qu’il souhaite accéder (en écriture ou en lecture)
  • le bus de données transporte les données selon l’adresse demandée
  • le bus de contrôle, qui permet aux périphériques d’annoncer une interruption et au processeur d’indiquer la direction (écriture ou lecture) d’une opération

Ici aussi, tout est transparent, mais il est toujours intéressant de savoir qu’ils existent.

Les interruptions

Ce concept est important à saisir, car une fois correctement exploitées, les interruptions vont permettre d’effectuer des opérations en réaction à un évènement particulier :

  • un appui sur un bouton
  • l’expiration d’un délai
  • la réception de données sur un bus de communication
  • la fin d’activité d’un périphérique
  • le déclenchement explicite d’une interruption

Les opérations ainsi déclarées dans une interruption permettront d’économiser énormément de cycles au processeur ; car il n’aura pas besoin de gérer de façon logicielle l’éventualité de ces évènements. Ceci permettra également d’alléger considérablement le code source, et même souvent le programme envoyé au microcontrôleur.

Comme dit un peu plus haut, les interruptions transitent sur le bus de contrôle. Une fois arrivée au processeur, celui-ci interrompt son exécution en cours, et exécute une routine particulière déclarée explicitement (par le développeur) ou implicitement (par exemple un chien de garde ou watchdog chargé de redémarrer un microcontrôleur en cas d’état figé). Une fois sa routine terminée, il reprend l’exécution ou il s’était arrêté (ou non, selon ce que décide le développeur). Chaque processeur possède son catalogue d’interruptions disponibles, il est donc nécessaire de se référer à la documentation pour comprendre chaque cas d’utilisation.

Microcontrôleur – Chapitre 4 – Les mémoires

Afin de stocker un programme, des données temporaires ou des données persistantes, le microcontrôleur dispose de plusieurs types de mémoires, ayant chacune des caractéristiques particulières.

La mémoire vive (ou RAM)

Il s’agit d’un espace de stockage où va se dérouler l’exécution d’un programme. Elle doit être rapide en lecture et écriture. Elle est généralement volatile, c’est à dire qu’elle est remise à zéro lorsqu’elle n’est plus sous tension.

Ses caractéristiques la rendent chère, c’est pourquoi elle est en disponible de façon très limitée au sein d’un microcontrôleur (de quelques dizaines d’octets à plusieurs kilo-octets pour l’entrée de gamme). Cette limitation encourage particulièrement l’optimisation du code afin de l’utiliser et la nettoyer efficacement.

En utilisant un compilateur, le developpeur n’a pas à s’occuper de la RAM, il doit seulement veiller à ne pas la gaspiller. En revanche, si on souhaite écrire un programme en assembleur, il devient necessaire de se familiariser avec les instructions d’ecriture et lecture en RAM, ainsi qu’avec l’adressage de ses secteurs.

La mémoire morte (ou ROM)

Cette mémoire est beaucoup plus lente mais permet de rester persistante même hors-tension. Un microcontrôleur va utiliser deux types de mémoire morte :

  • la mémoire « programme », qui va contenir le code assembleur à executer sur le processeur lors de la mise sous tension
  • la mémoire « données », où le programme pourra stocker des données de façon persistante. Elle est souvent appelée EEPROM pour Electrically-Erasable Programmable Read-Only Memory (mémoire effaçable électriquement, programmable en lecture seule).

Les mémoires peuvent être stockées sur un même composant ; on distingue ensuite deux architectures :

  • Harvard, qui va séparer l’accès (par les instructions) à la mémoire programme de la mémoire données, au point que les bus utilisés soient séparés. On peut ainsi transférer simultanément des instructions depuis la mémoire programme et des données vers la mémoire données
  • Von Neumann, où une unité de contrôle gère les entrées et sorties vers une mémoire unifiée. Les instructions y sont donc des données manipulables comme celles-ci.
    (il y a bien entendu d’autres subtilités, mais on restera sur celles-ci)

    Bien que ROM signifie à l’origine « Read-Only Memory » (soit mémoire en lecture seule), il est possible d’y écrire et y réécrire, même depuis le programme lui-même. Sa taille varie beaucoup en fonction de la gamme, et peut aller de quelques centaines d’octets à plusieurs millions.

    Il est possible d’utiliser également des mémoires externes, au travers des bus de communication. Celle-ci sont  très lentes comparées à la ROM interne, mais permettent d’étendre la mémoire disponible pour des programmes très gourmands. Il faudra par contre gérer au niveau du logiciel l’écriture et la lecture depuis ces composants.

Microcontrôleur – Chapitre 1 – Introduction aux microcontrôleurs

Un microcontrôleur est un circuit intégré qui réunit :

  • un processeur,
  • des mémoires,
  • des interfaces,
  • et des périphériques.

Depuis l’avènement de l’informatique embarquée, on le retrouve partout (industrie, téléphonie, automatisation, automobile, …). Ses applications sont infinies.

Nous allons approcher quelques concepts qui permettront de nous lancer dans le développement d’applications utilisant un maximum de fonctionnalités.

Caractéristiques

Il existe une immense variété de microcontrôleurs ; chaque modèle est décrit par :

  • l’architecture de son processeur (PIC, AVR, ARM, MSP430, …) voire sa sous-architecture
  • sa taille de registre (8bit, 16bit, 32bit, 64bit, …)
  • son nombre de broches (8, 12, 32, 48, 64, 100, …)
  • son format (DIP, SMD, VQFN, …)
  • la plage de fréquence de son processeur (par exemple, de 32768Hz à 16MHz)
  • sa plage de tension de fonctionnement (par exemple, 1.8V à 6V)
  • la taille (128o, 2ko, 256ko) et le type de ses mémoires (RAM, SRAM, FRAM, ROM, EEPROM, Flash, …)
  • ses périphériques internes :
    • des canaux convertisseurs (analogique vers numérique), décrits par leur précision (10bit, 12bit, 16bit, …) et leur vitesse
    • des compteurs (aussi appelé timers) de 8bit, 16bit, …
    • des sorties PWM
    • des comparateurs
    • divers outils (débogueur, chien de garde, RESET, …)
  • ses bus de communication (SPI, I2C, CAN, UART, USB, …)

D’autres caractéristiques sont implicitement liées aux composants intégrés :

  • sa plage de température de fonctionnement (par exemple -40°C à 85°C)
  • sa consommation (par exemple 2microA au repos, 30mA en activité maximale)
  • son prix (de quelques centimes d’euros à plusieurs centaines)
  • la fiabilité de ses mémoires (par exemple 10000 cycles d’écriture pour de la mémoire Flash)

Utilisation

De par sa faible consommation et son volume réduit, le microcontrôleur est un élément clef dans l’industrie de l’informatique embarquée. Le support de différents bus de communication lui permet d’être connecté à presque tout ce qui peut contenir un courant électrique :

  • périphériques de sortie (écran, diode, moteur, haut-parleur, …)
  • interfaces d’entrée (clavier, souris, micro, écran tactile, boutons, …)
  • appareils de mesure (thermomètre, tachymètre, voltmètre, horloge, …)
  • interfaces de communication (GSM/GPRS/HSDPA, GPS, liaison radio, Bluetooth, WiFi, Ethernet, …)
  • extensions (mémoires, entrées/sorties, bus de communication, …)
  • d’autres microcontrôleurs

Il n’est donc pas étonnant de le retrouver partout, par exemple :

  • dans l’industrie pour piloter des machines
  • dans l’automatisation, dans des télécommandes
  • dans l’automobile pour diagnostiquer un véhicule en temps réel
  • dans le monde du spectacle pour piloter l’éclairage
  • dans l’aéronautique pour exploiter des données de vol

Rien que chez vous, vous disposez et utilisez des dizaines de microcontrôleurs sans le savoir :

  • dans une télécommande
  • dans un réveil
  • dans un lave-vaisselle
  • dans un interphone
  • dans un four
  • dans une cafetière
  • dans une voiture
  • dans un baladeur

Bien que l’interface avec un microcontrôleur parait technique, il est en réalité assez facile d’appréhender la programmation sur ces machines.

Le faible coût des modèles d’entrée de gamme ainsi que la possibilité de disposer de kit de développement à prix cassé chez certains constructeurs (TI et son Launchpad MSP430 à moins de 20€, Atmel avec ses ATTiny et ATMega présents dans les Arduino, leurs dérivés et leurs clones de 1€ à 100€, Microchip et ses PIC minimalistes et éprouvés) donnent une magnifique occasion pour se lancer dans ce monde !

Microcontrôleur – Chapitre 5 – Les bus de communication

Beaucoup d’applications nécessitent de pouvoir communiquer avec d’autres périphériques ou systèmes. Selon la gamme du microcontrôleur, on peut trouver un ou plusieurs bus de communication. Nous allons parler des principaux bus et de leurs protocoles respectifs.

Qu’est ce qu’un bus ?

Un bus est une topologie de réseau où tous les nœuds sont reliés à un seul lien, appelée le bus. Ce bus peut contenir plusieurs lignes, toutes communes à chaque nœud du réseau.

Ainsi, toute donnée émise sur un bus est reçue par tous les nœuds en même temps (tant que le bus est constitué d’un lien physiquement court).

Série ou parallèle ?

Une liaison série est une liaison où les données se suivent. On l’oppose à la liaison parallèle, ou chaque bit est envoyé sur une broche, ce qui permet un débit plus important mais augmente le risque de parasites à cause d’un nombre de lignes plus élevé.

Une analogie ? Une liaison série serait une conversation avec une personne, qui épèle chaque mot lettre par lettre, tandis qu’une liaison parallèle serait une conversation avec huit personnes épelant chacune une lettre en même temps (les lettres arrivent donc 8 par 8). La première conversation serait assez limpide, par contre la seconde pourrait poser problème si :

  • une personne parle plus fort que les autres (i.e. parasite leur signal)
  • une personne est en retard sur le reste du groupe (i.e. souffre d’une latence due à la ligne).

Les principaux bus

Il existe énormément de bus, et certains ont émergés suite à de véritables guerres de standards entre les constructeurs. La plupart des composants

I²C

I²C (ou I2C) est un bus série de bas niveau développé par Philips Semiconductor en 1982. I²C signifie Inter-Integrated Circuit. Puisqu’il s’agit d’une marque déposée, beaucoup de constructeurs parlent de TWI (Two-wire interface) lorsqu’ils se réfèrent à ce bus. Il est de courte portée (quelque mètres) et fonctionne généralement à 100kb/s (des versions plus récentes fonctionnent toutefois à plus de 3Mb/s).

On utilise ici deux lignes (en plus d’une masse commune) pour communiquer sur ce bus :

  1. une ligne d’horloge, appelée SCL (Serial Clock Line, parfois abrégée SCK ou CLK)
  2. une ligne de données, appelée SDL (Serial Data Line, qu’on écrit aussi SDA ou DATA)

Le protocole utilisé par I2C est dit :

  • maitre-esclaves, car seul un nœud maitre peut communiquer avec les esclaves du réseau (1 ou tous)
  • multi-maitres, car plusieurs maitres peuvent être présents sur le réseau
  • synchrone, car on utilise un mécanisme de requête/réponse
  • half-duplex, car on peut communiquer dans les deux sens, mais pas simultanément

On utilise un adressage sur 7 bits pour identifier les nœuds, ce qui permet (en théorie) jusqu’à 128 nœuds sur le réseau. Certaines adresses sont réservées pour le broadcast (communiquer vers tous les nœuds en même temps). En pratique, les constructeurs on tendance à fixer l’adresse de certains nœuds, ce qui peut causer des collisions.

Ce protocole de communication a de nombreuses applications ; écrans, mémoires, horloges temps-réel, …

SPI

Une liaison SPI (Serial Peripheral Interface) est un bus un peu particulier car si 3 lignes sont bien communes à chaque nœud du réseau (en plus de la masse), il faut ajouter une ligne entre chaque esclave et le maitre. Par exemple un réseau entre un maitre et trois esclaves aura besoin de 6 lignes (plus la masse).

Les lignes communes sont :

  1. une ligne d’horloge, appelée SCLK (Serial Clock, ou SCK, CLK)
  2. une ligne de données maitre vers esclave : MOSI (Master Output, Slave Input ; SIMO/MDO/SDI/DO/DOUT/SI/MTSR)
  3. une ligne de données esclave vers maitre : MISO (Master Input, Slave Output ; SOMI/SDO/MDI/DI/DIN/SO/MRST)

À chaque nœud esclave est ajoutée une ligne SS : Slave Select (choix de l’esclave, souvent abrégé CS ou SYNC). On ajoute généralement une barre au dessus du sigle pour préciser qu’il s’agit d’une entrée active à l’état bas ; en effet, l’esclave n’acceptera de répondre que si sa ligne SS est mise à la masse.

Cette particularité du bus SPI rend l’adressage inutile, il est cependant envisageable d’utiliser un registre à décalage pour piloter un grand nombre d’esclave avec un nombre limité de broches sur un microcontrôleur.

Le bus SPI est :

  • à maitre unique, il n’est pas possible d’avoir plusieurs maitres sur le réseau
  • synchrone
  • full-duplex, car maitre et esclave peuvent transmettre simultanément

Sa portée est de quelques mètres également, par contre son débit est bien plus élevé ; il est possible d’atteindre 100Mbit/s en SPI. Dans notre cas, des débits de 1 à 10Mbit/s seront suffisants.

RS-232

Le RS-232 est un bus de périphériques conçu en 1962. Contrairement aux liaisons SPI et I2C, il est possible de l’utiliser sur plusieurs dizaines de mètres, au détriment du débit (de 2400 à 115200b/s et même au delà dans certaines conditions).

Si vous avez disposé d’un ordinateur avant l’avènement de l’USB, vous avez forcément branché une souris ou un modem sur un port RS-232. On l’appelait à l’époque « port série » ou « port COM ». On l’appelle parfois UART voire USART, du nom d’un composant, souvent présent dans les microcontrôleurs, qui permet de transmettre et recevoir des données sur une liaison série.

Le bus fonctionne sur au moins deux lignes (plus la ligne de masse) :

  1. une ligne d’émission TxD ou TX
  2. une ligne de réception RxD ou RX

(D’autres lignes sont disponibles pour améliorer la fiabilité de la liaison, mais ne sont pas obligatoire)

Cette topologie ne permet de lier que deux périphériques entre eux en mode duplex, car les lignes d’émission et de réception sont croisées (chaque broche d’un périphérique est connectée à l’autre broche sur le périphérique distant).

De plus, l’absence d’horloge partagée peut provoquer des erreurs ; leur probabilité augmente avec le débit souhaité.

Une liaison RS-232 fonctionne :

  • de pair-à-pair ; il n’y a ni esclave ni maitre défini au niveau du protocole
  • de façon synchrone ou asynchrone ; c’est au logiciel de gérer comment se déroule la communication
  • en full-duplex ; les deux pairs peuvent communiquer en même temps.

Du fait de sa simplicité à mettre en œuvre tant au niveau matériel (trois fils suffisent), que logiciel, et de sa disponibilité quasi immédiate sur PC, c’est un bus de choix pour des petits projets.

De plus, de nombreux périphériques se pilotent également par liaison série : GPS, lien Bluetooth, modem, …

1-Wire

Mis au point par Dallas Semiconductor Corp, le bus 1-Wire, comme son nom l’indique, fonctionne avec une seule ligne (plus une masse).

Cette caractéristique lui procure une immense portée (jusqu’à plusieurs centaines de mètres), mais ne lui permet de fonctionner qu’avec un débit réduit (16,3kbit/s). Ce bus peut supporter plusieurs dizaines de noeuds.

1-Wire fonctionne :

  • d’un maitre vers plusieurs esclaves
  • de façon synchrone
  • en half-duplex

Les nœuds sont adressés sur 64 bits (ce qui donne plus de 18 milliards de milliards d’adresses possibles). Une commande d’énumération permet de faire l’appel pour ainsi détecter tous les nœuds d’un réseau très rapidement.

1-Wire est basé sur un protocole propriétaire ; les implémentations de nœuds maitres sont libres, par contre les nœuds esclaves sont prohibés ; ceci permet à la société de décider quels sont les périphériques utilisables sur son bus. Dans la théorie, rien n’empêche d’implémenter un nœud esclave avec un microcontrôleur.

Malgré cela, il s’agit d’un bus très simple à mettre en œuvre, car une seule broche suffit, et elle peut être gérée de façon logicielle sans grand impact sur la mémoire du programme.

Plusieurs types composants sont disponibles en tant qu’esclave 1-Wire :

  • des horloges temps-réel
  • des mémoires dont certaines peuvent être chiffrées
  • des thermomètres
  • des bascules
  • des convertisseurs

USB

Hérité du port série, l’Universal Serial Bus est apparu en 1996. Contrairement à la plupart des autres bus, où il est possible de choisir une tension au sein d’une plage, l’USB ne fonctionne qu’avec une tension de 5V.

Son rayon d’action est court (quelques mètres, rarement plus de 5) et ses évolutions lui on permis d’atteindre des débits de plusieurs gigabits par seconde.

Ces performances sont atteintes par l’USB 3, et sont totalement hors de portée des microcontrôleurs d’entrée de gamme. Néanmoins, il est possible de communiquer jusqu’à quelques mégabits par seconde avec un microcontrôleur approprié.

Un port USB standard est composé de quatre lignes :

  1. la masse GND
  2. la ligne D-
  3. la ligne D+
  4. et l’alimentation VCC, à 5V

On n’abordera pas ici le cas de l’USB 3, avec ses lignes supplémentaires.

L’USB permet des communications :

  • entre pairs
  • synchrones et asynchrones
  • en half-duplex

Sa mise en œuvre est plus complexe car il est nécessaire de déclarer plusieurs champs afin de pouvoir communiquer :

  • un identifiant fournisseur
  • un identifiant produit
  • un identifiant texte
  • un descripteur

L’implémentation d’une liaison USB nécessite un article plus approfondi.

Les autres

Bien sûr, il existe beaucoup d’autres type de liaisons, mais vous ne les retrouverez pas forcement au sein d’un microcontrôleur.

En voici quelques uns :

  • Ethernet : très connu en informatique, il est dédié au réseau, principalement pour les protocoles Internet (dont IP).
  • CAN : ce bus de terrain se retrouve notamment dans l’industrie et surtout dans l’automobile. Il équipe tous les véhicules automobiles depuis les années 1990, en tant que bus de pilotage et de diagnostic. L’accès au bus CAN permet de manipuler tous les composants d’un véhicule, les phares, l’injection, les serrures, les airbags,…
  • Bluetooth : liaison sans fil entre deux périphériques appairés, il peut être facile à mettre en œuvre au travers d’une liaison série. Présent dans tous les téléphones, ordinateurs portables et tablettes depuis le milieu des années 2000, il permet de connecter très facilement et sans-fil des projets avec un appareil faisant office d’interface.
  • ISM, Z-Wave, LIN, …

Limitations physiques

On a pu voir rapidement que les bus ont un champ d’action et un débit limité. Ces limitations sont généralement liées aux caractéristiques physiques des câbles ainsi qu’a leur blindage et leur agencement au sein de la ligne.

La limite électronique

La particularité d’un bus de communication est que l’ensemble d’une ligne (comprendre un câble) ne peut être qu’à un seul état électrique à un moment donné : VCC ou GND. Or, les électrons ne circulent pas instantanément dans les câbles ; par exemple on estime leur vitesse à environ 273 000 km/s dans le cuivre.

Ce qui veut dire que pour un câble de 273 000 km, un signal aura besoin d’une seconde pour être propagé de bout en bout. Si les données sont envoyées « par paquet », la latence aura peu d’impact. Mais dans le cadre de protocoles synchrones (SPI, I2C, …), la longueur du câble peut avoir une incidence sur le fonctionnement.

Bien entendu, on utilisera plus souvent des lignes beaucoup plus courtes, mais les limitations existent également en fonction des types de bus. Ainsi, un bus I2C ou SPI ne fonctionnera pas correctement au-delà de quelque mètres.

L’atténuation du signal

Lors de la circulation des électrons au sein du câble, de l’énergie est perdue sous forme de chaleur à cause de la résistance du câble ; on appelle cela l’effet Joule. S’il est négligeable en dessous d’un mètre il est important de le prendre en compte pour de plus grande distance.

L’induction et la permittivité jouent également un rôle dans l’atténuation.

On exprimera cette atténuation en décibel, et on peut la mesurer entre les tensions en entrée et en sortie du bus.

Les interférences internes

L’induction est un phénomène électromagnétique qui peut provoquer l’apparition d’un courant dans un conducteur à proximité d’un autre conducteur alimenté. Il est ainsi possible que des lignes interférent entre elles. Dans le cas de l’altération d’un signal, on parle de diaphonie. Pour éviter cela, on utilise des blindages et des paires torsadées.

Les interférences externes

Les faibles tensions utilisées en électronique sont d’autant plus sensibles lorsqu’elles sont utilisées dans des milieux assez hostiles, ou en mouvement (électrostatique).

Les hautes tensions ou les champs magnétiques à proximité peuvent fortement altérer le fonctionnement de tout dispositif électrique, dont les bus de communication.

Solutions techniques

Le blindage

Indispensable sur de longues distances, le blindage est présent principalement dans les câbles USB et dans certaines catégories de câbles Ethernet. Il s’agit le plus souvent d’un matériau métallique tressé.

Les paires torsadées

Comme son nom l’indique, une paire torsadée est constituée de deux lignes enroulées l’une autour de l’autre. Cette configuration permet de réduire de manière sensible les interférences entre les lignes.

la transmission différentielle

Au lieu de comparer la différence de potentielle entre une masse et une tension, on va comparer la différence de potentielle entre une tension et sa valeur opposée. Ce concept est très souvent utilisé notamment avec les paires torsadées : on considère en effet que les lignes sont si proches, qu’une interférence extérieure affecterait les deux lignes exactement de la même façon.

Ainsi, si au lieu de recevoir -5V et 5V, je reçois 2V et 12V, en faisant la différence des deux tensions, on obtient 10V à chaque fois.

La plaie des fuses mal réglés dans la communication

Il m’est arrivé un problème très bête, mais qui guette quiconque tente de travailler avec une interface de communication. Dans mon cas, il s’agissait d’un port série, que j’avais déjà réussi à faire fonctionner mille fois.

L’enfer du débogage

Cependant, ici, ça ne marchait pas. J’étais dans une nouvelle configuration par rapport à mon habitude. En effet, j’ai tendance à utiliser la même tension (5V) sur tout mon circuit, et vu que mes montages consomment peu, je n’ai aucun problème à utiliser une alimentation provenant d’un port USB, et qui plus est, à utiliser l’alimentation proposée par une clef USB de communication série TTL.

Mais dans le cas présent, j’avais dans l’idée de faire communiquer un montage, utilisant sa propre source d’énergie (tirée depuis une alimentation 12V, laquelle était abattue ensuite par un régulateur de tension à 5V), avec une clef USB identique au montage précédent. Pas moyen.

Je met tout d’abord en cause ma nouvelle installation (j’ai porté tout mes scripts et Makefile sous Linux, étant bien plus à l’aise avec ce système). Je reprend donc tout sur Windows 8. Ça ne fonctionne pas.

On va essayer plus simple

Alors, c’est mon projet qui doit être douteux. Je sors donc des cartons le premier projet que j’ai déployé avec une connexion série. Je le compile, et l’envoie sur le microcontrôleur. Boum, ça ne marche pas. Petit coup de stress.

Je doute maintenant de mon montage, et je commence à chercher un peu de détails sur le net. J’ouvre les spécifications série TTL et tout me semble correct. Je me résous donc à faire un montage plus simple, identique à mon premier essai concluant, et là, cela ne marche pas.

Le même montage, le même code, la même clef, sur la même machine.

J’abandonne ce soir là. Je rumine, je cherche sur Internet, je ne trouve rien relatif à ce problème. Je prend même un ATMega tout neuf pour tester le code ; même problème.

Mais bordel !

Dépité, Je démarre un terminal série un peu plus poussé afin de voir ce qui se passe en bas niveau (binaire). Les caractères sont indéchiffrables, mais quelque chose attire mon attention : Les codes hexadécimaux reçus ne sont que des 0x00 et 0x80. Et enfin je comprend !

Dans l’entête de mon code je précise la cadence de l’horloge, qui n’est pas celle par défaut. Or, j’utilisais dans mes tests des microcontrôleurs neufs ! Ceux-ci fonctionnaient à la fréquence d’usine, et lors de la mise en route, la configuration de la communication série s’établit avec celle que je donne en entête. Le microcontrôleur communique donc à une vitesse différente de celle attendue, et bien entendu, il n’y a aucun moyen de le déterminer.

Il y a deux solutions dans mon cas :

  • changer la cadence au niveau de mon code, pour utiliser la fréquence d’usine
  • reprogrammer les registres « fuses » du microcontrôleur afin d’utiliser la fréquence définit en entête (ce que j’ai fait).

Soulagé !

Et tout de suite, cela marche beaucoup mieux ! Ainsi, si vous vous sentez bloquer lors de l’utilisation d’une fonctionnalité dépendant d’une base de temps (communication, synchronisation, … tout en fait !), pensez à vérifier ces foutus registres !