Introduction aux microcontrôleurs

13 juillet 2021

Objectif de la lecture

À la fin de cet atelier, nous devrions être capable d’expliquer ce qu’est un microcontrôleur, d’utiliser le vocabulaire qui le défini, d’identifier ses domaines d’application, de reconnaitre ses apparences physiques, de déchiffrer un diagramme de définition de bloc qui le décrit, de nommer ses fonctionnalités techniques et d’identifier les outils matériels et logiciels nécessaires à sa programmation.

Finalement nous comprendrons, je l’espère, la place qu’occupe le projet Arduino dans cet espace plus que fascinant.

A.B. aka ve2cuy


Contenu

  1. Définition d’un microcontrôleur (MCU pour microcontroller unit)
  2. Exemples d’utilisation d’un MCU
  3. Sommaire des fonctionnalités d’un MCU
  4. Apparence physique de boitiers de MCU
  5. Quelques microcontrôleurs populaires
  6. Anatomie d’un microcontroleur (ATmega328P)
    1. Acronymes couramment utilisés avec les MCU
    2. Spécifications de l’ATmega328P
    3. Diagramme de définition de bloc de l’ATmega328P
    4. Identification des broches de l’ATmega328P
  7. Outils et langages de programmation des microcontrôleurs
    1. Langages: C, C++, assembleur, librairies, portabilité
    2. Les programmateurs matériels dédiés
    3. Les environnements de développement propriétaires
      • Microchip Studio for AVR 
      • MPLAB® X IDE (PIC)
      • STM32CubeIDE 
      • ESP-IDF
      • Arduino IDE
  8. Programme d’amorçage (BootLoader)
  9. Le projet Arduino.cc
    1. Historique
    2. Le matériel
    3. Les outils logiciels


1 – Définition d’un microcontrôleur

Que nous en soyons conscient ou pas, les microcontrôleurs (MCU) sont omniprésents dans notre vie de tous les jours.

Ce sont des microprocesseurs, généralement beaucoup moins puissants, rapides et énergivores que ceux présents dans nos ordinateurs personnels, spécialisés dans la communication avec le monde extérieur.

Ils peuvent intégrer, dans un même boitier (puce/circuit intégré/IC), les fonctionnalités suivantes:

Note: Ces termes et acronymes seront expliqués un peu plus loin.

Les microcontrôleurs sont aussi parfois appelés ‘System on a Chip’ ou SoC.



2 – Exemples d’utilisation

Nous retrouvons les microcontrôleurs dans une multitude d’appareils électroniques tel que,

Four micro-ondes
Thermostat intelligent
Manette de jeux
Clavier d’ordinateur
Souris d’ordinateur
Voiture
Plateforme de prototypage
Ligne de montage industrielle
Tableau 01

Ils sont aussi présents dans des objets comme les jouets, les appareils électroménagers, les téléphones cellulaires, les routeurs Wifi, les tablettes électroniques, …

Bref, ils sont omniprésents dans notre univers d’appareils électroniques ?.



3 – Sommaire des fonctionnalités d’un MCU

La fonction première d’un microcontrôleur est de proposer des méthodes d’acquisition et d’interaction avec le monde extérieur.

Comme par exemple,

Note: Ceci n’est qu’une petite partie des fonctionnalités des microcontrôleurs. Nous présenterons ultérieurement une liste plus exhaustive.



4 – Apparence physique des MCUs

Les microcontrôleurs sont habituellement disponibles sous la forme d’un unique circuit intégré (IC) adoptant un des boitiers suivants:

AcronymeDescriptionImage
DIPDual Inline Package
SOICSmall Outline Integrated Circuit
QFP/TQFP(Thin) Quad Flat Package
PGAPin Grid Array
BGABall Grid Aray
MLPMicro Leadframe Package
Tableau 02

Par exemple, le microcontrôleur présent sur une des plateformes de prototypage que nous utiliserons dans le cadre de ce cours est le ATmega328P de type DIP et il ressemble à ceci:

ATmega328P en boitier DIP

Référence



5 – Quelques microcontrôleurs populaires

Des nombreuses entreprises fabriquent des microcontroleurs proposants des fonctionnalités dans des formats de traitements de 8 à 32 bits, avec des vitesses de traitement multiples, un grand choix de formats de mémoire (RAM/FLASH, …), un nombre variables de lignes et de protocoles de communication avec le monde extérieure. (Note: Revoir la structure de ce paragraphe)

Au niveau des microcontroleurs grand public, s’adressant aux enthousiasmes de l’informatique et de l’électronique, nommons les entreprises et les microcontrôleurs suivants:

EntrepriseMicrocontrolleurs populairesNB bitsLogo
Atmel *
La série de MCU AVR
*Achetée par Microchip en 2015
ATtiny85
ATmega32U4
ATmega328P (Arduino Uno)
ATmega2560 (Arduino Mega)
8
8
8
8
Microchip
La série de MCU PIC
PIC16F877A
PIC18F4550
8
8
Espressif
La série de MCU ESP
ESP8266
ESP32
32
32
STMicroelectronics
La série de MCU STM32
STM32F103C8T632
Raspberry PiRP204032
Tableau 03

Note: Dans nos apprentissages pratiques (laboratoires), nous utiliserons principalement les puces ATmega328P, disponible sur l’Arduino Uno, et ATmega2560 disponible sur l’Arduino Mega.



6 – Anatomie d’un microcontroleur (ATmega328P)

Pour être en mesure de bien comprendre les différentes fonctions d’un microcontrôleur, commençons par apprivoiser le vocabulaire les définissants.

Nom*Description
MCUMicroController Unit
INPUTSignal d’entrée
OUTPUTSignal de sortie
IOInput/Output – Entrée/Sortie
GPIOGeneral Purpose Input/Output – Entrée/sortie à usage général
Représente une broche, d’un microcontôleur, qui peut adopter un nombre
varié de fonctionnalités.

Par exemple, pour une même broche; lecture digitale, écriture analogique,
interruption matérielle, PWM, …
Digital IOEntrée/Sortie digitale
Ne peut prendre que deux états, 0/1, On/Off, 0Volt/[3.3,5]Volts
Analog IOEntrée/Sortie analogique
Peut prendre une multitude d’états.
Par exemple, lire la valeur d’un gradateur (potentiomètre).
KiloMultiplicateur * 1000
Note, en informatique, parce que les CPU calculent en base 2,
1 Kilo Octets (Ko) vaut 1024 Octets. 210 = 1 024
MhzMégahertz – Millions de cycles (impulsions) par seconde
SDRAMMémoire vive statique
EEPROMElectrically-Erasable Programmable Read-Only Memory
Mémoire morte effaçable électriquement et programmable
I2CPrononcé eye-square-see (en anglais) pour ‘Inter-Integrated Circuit
Protocole de communication privilégié pour le contrôle des différents
capteurs et objets reliés au microcontrôleur.

Il ne requiert que deux connexions électriques, SDA et SCL
SDASerial Data Line – Ligne de données bidirectionnelle
Utilisé dans la cadre d’une connexion I2C pour l’échange d’information.
SCLSerial Clock Line – Ligne d’horloge de synchronisation bidirectionnelle
Utilisé dans la cadre d’une connexion I2C pour synchroniser les échanges
entre le microcontrôleur (master) et les périphériques (slaves).
CLKHorloge ( habituellement du CPU).
Détermine la cadence d’exécution des instructions du programme.
XTALCristal
Une composante, interne ou externe, qui vibre lorsque qu’on y applique
une tension électrique et qui permet d’alimenter l’horloge d’un CPU.
ADCAnalog to Digital Converter
Convertisseur Analogique à Numérique (CAN*)
DACDigital to Analog Converter
Convertisseur Numérique à Analogique (CNA)
PWMPulse With Modulation – Sortie à modulation de largeur d’impulsion

Permet de simuler la gradation d’un signal à partir d’une sortie digitale
en variant la durée des états ON et OFF.

Par exemple, modifier l’intensité d’une diode émettrice de lumière (DEL/LED)
Timer
Counter
Minuteur/Compteur (À compléter)
UART
USART
Universal Synchronous/Asynchronous Receiver Transmitter

Protocole de communication privilégié pour relier le microcontrôleur à un
ordinateur pour sa programmation via un BootLoader.

Peut aussi servir à la communication entre des microcontrôleurs ou
un microcontrôleur et des périphériques tel qu’un écran LCD.

C’est un protocole qui est supporté par tous les systèmes d’exploitation de PC.
Sous Windows, cette interface est identifiée par COMn (COM1, COM2, …),
sous MACOS et Linux par /dev/tty*
Boot
Loader
Petit programme de démarrage, installé dans la mémoire FLASH d’un microcontrôleur, habituellement dans le premier 2Ko, et qui permet sa programmation, via le UART,
sans avoir à utiliser des programmeurs matériels propriétaires couteux.
Les microcontroleurs des modules Arduino possèdent un Bootloader.
SPISerial Peripheral Interface

SPI est un protocole de communication en mode série synchronisé performant,
lorsque plusieurs capteurs sont connectés à un système.

Plusieurs capteurs utilisent ce mode de communication. Par exemple, carte SD,
module RFID, radio 2.4GHz, …

Par contre, un nombre plus élevé de signaux doivent-être utilisés;
SCK, CS, MOSI et MISO.
ISP
ICSP
In-System Programming, In-Circuit Serial programming

ICSP est une fonctionnalité, via un connecteur électronique qui expose
les signaux SPI, qui permet aux microcontrôleurs d’être (re)programmés
alors qu’ils sont déjà en place dans le système électronique ou la plateforme
de prototypage qu’ils doivent piloter. 

Ceci évite d’avoir besoin de programmer le microcontrôleur en dehors
du circuit à l’aide d’un programmateur dédié.

Dans le cas du Arduino, cette interface permet de programmer le BootLoader.
USBUniversal Serial Bus
CANController Area Network

Protocol de communication utilisé principalement dans l’industrie automobile.
INTInterruption logicielle ou matérielle

Permet de réagir (associer des instructions) de façon asynchrone à un événement.

Par exemple, à la fin d’un minuteur ou au changement d’état d’une des GPIO.
Tableau 04 – À compléter …

*INT – À ne pas confondre avec le type ‘int’ en C.

Le tableau précédent présente une grande quantité d’informations.

Le but ici n’est pas de mémoriser toutes ces données mais d’y être exposé une première fois.

Au courant du cours, plusieurs de ces éléments seront revus.


6.1 – Spécifications du ATmega328P

Fort de nos nouveaux acronymes, examinons maintenant les spécifications techniques du microcontrôleur ATmega328P.

NomValeurDescription
1) Type de mémoire programmeFlash
2) Taille de la mémoire programme32 Kilo octets32768 octets
3) Vitesse du CPU20 Mhz (1)*1 instruction par cycle
20 MIPS (théorique)
4) SRAM (mémoire vive)2048 OctetsUtilisée pour les données, variables, …
5) EEPROM1024 OctetsMémoire non volatile pour les données
6) Communication externes1-UART
2-SPI
1-I2C
7) Capture
Comparaison
PWM
1
1
6
À compléter
8) Convertisseur A/D6
9) Minuteur/compteur2 x 8-bit
1 x 16-bit
8 bits -> 0..255
16 bits -> 0..65535
10) Nombre de comparateurs1Inclus au point 7
11) Température de fonctionnement-40 to 85 °C
12) Plage d’alimentation (volts)1.8 à 5.5
13) Nombre de broches32Sur le boitier DIP
14) GPIO23 *(2)Entrée/sortie à usage général
PB0..PB7, PC0..PC6, PD0..PD7
Tableau 05

*(1) – La vitesse de l’horloge de l’Arduino Uno est de 16Mhz. Donc, le CPU du ATmega328P va exécuter environ 16 MIPS.

*(2) – L’Arduino Uno n’expose pas toutes les GPIO de l’ATmega328P. Les signaux disponibles sous Arduino Uno seront présentés plus tard.



6.2 – Diagramme de définition de bloc de l’ATmega328P

Extrait de la documentation de Microchip


6.3 – Identification des broches de l’ATmega328P



7 – Programmation d’un microcontrôleur

Les fabricants de MCU propose des solutions propriétaires pour la programmation des MCU, c-a-d, des méthodes et outils pour développer, compiler, épurer, télécharger et tester les applications dans les MCU.

Ces solutions sont habituellement composées des éléments suivants:

7.1 – Plateformes de prototypage

Une plateforme de prototypage est une plaquette électronique qui reçoit un MCU donné et qui permet d’expérimenter avec ce dernier. Par exemple, voici une des plateformes de prototypage de la cie Microchip pour leurs MCU 8 bits:

Curiosity Development Board

Référence


7.2 – Programmateurs et débogueur en circuit de MCU

Un programmateur de MCU est habituellement un module électronique qui relie la plateforme de prototypage du MCU, via le connecteur ICSP, à un ordinateur personnel par l’entremise d’un port USB. Il sera piloté soit à partir du IDE, d’une application distincte fenêtrée ou à partir de la ligne de commande du système d’exploitation hôte.

En bref, il est utilisé pour transférer une application (micro-code) vers la mémoire programme du MCU.

Il sert aussi à déboguer l’application en temps réel ou en pas à pas.

Voici une liste de programmateurs/débogueurs populaires:

FabricantProgrammateurImage
MicrochipPICkit 3
Pour la programmation des séries PIC (16F, 18F, …)
[ Environ 40$ ]
MicrochipPICkit 4

Pour la programmation des séries
PIC (16F, …), AVR (ATmega328P, ATmega1280, …)
[ Environ 125$ ]
AtmelAtmel AVRISP STK500

Pour la programmation de la série AVR (ATmega328P, …)
[ Environ 40$ ]
STMicro
electronics
ST LINK V2
Pour la programmation de la série STM32
[ Environ 10$ ]
Générique
Chinois
XGecu TL866II Programmer PLUS 
Pour la programmation d’un vaste ensemble de MCU,
FLASH, EEPROM, …
[ Environ 75$ ]
Tableau 06

? Voici un exemple d’une programmation ‘en circuit‘ d’un PIC 16F, en utilisant le programmateur PICkit 3, sur sur une plaquette de prototypage:


7.3 – Les environnements de développement (IDE/IPE) propriétaires

Plusieurs concepteurs de MCU proposent des compilateurs, environnements de développement, librairies de code, des outils matériels et logiciels pour le développement de systèmes (embarqués) à partir de leurs MCU.

Les IDE sont habituellement disponibles gratuitement. Par contre, certaines fonctions avancées, comme par exemple, un compilateur qui optimise le code, peuvent comporter un coût d’achat.

À ces coûts, il faudra ajouter l’acquisition d’un programmateur de MCU compatible et d’une plateforme de prototypage.

Note: Ces outils produisent des systèmes qui ne sont pas ou peu transportables d’un MCU d’un fabricant vers un autre.

Par contre, ils permettent de développer des systèmes hautement optimisés.

Il faudra aussi tenir compte des investissements en temps et en ressources humaines pour maitriser une solution donnée.

Voici un aperçu de quelques IDEs disponibles:

SolutionCapture d’écran de l’IDE
Microchip Studio for AVR *
* (Anciennement Atmel Studio)
Version Windows seulement

Pour MCU de type AVR (Atmega)

Disponible ici
MPLAB® X IDE
Version Windows, MacOS et Linux

Pour MCU de type PIC

Disponible ici
STM32CubeIDE 
Version Windows, MacOS et Linux

Pour MCU de type STM32

Disponible ici
ESP-IDF
Version Windows, MacOS et Linux
Pour MCU de type ESP (ESP32, ESP8266)
NOTE: S’utilise à partir de la ligne de
commandes.
Disponible ici
Arduino IDE

Environnement de développement
pour une multitude de MCUs et de
plateformes de prototypage.

Version Windows, MacOS et Linux
Disponible ici
Tableau 07

7.4 – Langages utilisés pour la programmation des MCUs

Les langages les plus utilisés pour le développement d’applications pour les MCU sont:

Avec certain MCUs, il est aussi possible de les programmer en MicroPython (ESP), en PBasic (BASIC Stamp) ou en Spin (Propeller de Parallax).

Dans le cadre de ce cours, nous utiliserons le langage C(++).



8 – Programme d’amorçage (BootLoader)

Une façon d’expliquer le rôle du ‘bootloader’ d’un MCU est de poser la question suivante, pourquoi ne puis-je pas programmer mon MCU directement à partir de mon PC?

Et bien, la réponse simple à cette question est que les ordinateurs personnels ne proposent pas, par défaut, les protocoles et signaux (SPI, MOSI, MISO, …) nécessaires à leur programmation.

Qu’elles sont les ports de branchement disponibles de facto sur un PC? Le port USB et UART via RS232 (COMn) sur les modèles plus anciens.

Nous pourrions alors utiliser le port USB pour programmer les MCU, mais la plupart des MCU ne proposent pas cette interface car couteux à implémenter et nécessite une horloge de 48Mhz, elle aussi plus coûteuse à incorporer.

Les MCU proposent presque tous une interface USART. Ce type d’interface, qui permet de transmette des octets en trames de bits, est aussi disponible sur les PC depuis la première parution de l’IBM PC en 1981 et, une interface logicielle est disponible sur tous les systèmes d’exploitation modernes. Sous windows, on y réfère par les pilotes de communication COM1, COM2, …

De retour au bootloader

Le bootloader est un petit programme qui est enregistré, par exemple pour le ATmega328P, dans le premier 2ko de mémoire programme du MCU.

À priori, il ne fait rien d’autre que de passer la main au programme de l’utilisateur lors du démarrage ou de la réinitialisation du MCU.

L’astuce ici est d’ici placer une petite application, maximum de 2ko, qui analyse, au démarrage, si une séquence ‘magique’ d’instructions est reçue sur le port du UART, indiquant que nous désirons réécrire le programme de l’utilisateur.

Les plateformes de prototypage, comme les cartes Arduino, utilisent cette approche pour la programmation des MCUs. L’avantage est qu’il est possible d’expérimenter avec un MCU sans l’achat de programmateurs matériels.

Il y a un léger désavantage, lors du démarrage, le code du bootloader attend quelques instants pour la réception, ou pas, de la séquence de programmation de la mémoire programme, ce délai sera passé au démarrage du programme principale.

Note: Il faut absolument un programmateur matériel, ou un autre MCU, pour inscrire du code dans la zone mémoire réservée au BootLoader.

Voilà, nous voilà maintenant renseigné sur le rôle du BootLoader ?!



9 – Le projet Arduino.cc

Qu’est-ce qu’Arduino?

L’Arduino utilisé dans ce cours

Voici un extrait de l’article de wikipédia:

Arduino est la marque d’une plateforme de prototypage open-source qui permet aux utilisateurs de créer des objets électroniques interactifs à partir de cartes électroniques matériellement libres sur lesquelles se trouve un microcontrôleur (d’architecture Atmel AVR comme l’Atmega328p, et d’architecture ARM comme le Cortex-M3 pour l’Arduino Due).

Les schémas de ces cartes électroniques sont publiés en licence libre. Cependant, certaines composantes, comme le microcontrôleur par exemple, ne sont pas sous licence libre.

Le microcontrôleur est préprogrammé avec un bootloader de façon qu’un programmateur dédié ne soit pas nécessaire.

Le logiciel de programmation des modules Arduino, dont l’interface, appelée Arduino IDE, est une application Javalibre et multi-plateforme dérivée de Processing servant d’éditeur de code et de compilateur, et qui peut transférer le firmware et le programme au travers de la liaison série (RS-232Bluetooth ou USB selon le module). Il est également possible de se passer de l’interface Arduino, et de compiler et téléverser les programmes via l’interface en ligne de commande7.

Le langage de programmation utilisé est le C++

Exemples de projets réalisés avec des modules Arduino


Voici la palette de couleurs utilisée pour la conception de cette page:


Document rédigé par Alain Boudreault, aka ve2cuy – Révision (c) 2021.07.15.03