À 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
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.
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 |
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 ?.
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.
Les microcontrôleurs sont habituellement disponibles sous la forme d’un unique circuit intégré (IC) adoptant un des boitiers suivants:
Acronyme | Description | Image |
---|---|---|
DIP | Dual Inline Package | |
SOIC | Small Outline Integrated Circuit | |
QFP/TQFP | (Thin) Quad Flat Package | |
PGA | Pin Grid Array | |
BGA | Ball Grid Aray | |
MLP | Micro Leadframe Package |
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:
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:
Entreprise | Microcontrolleurs populaires | NB bits | Logo |
---|---|---|---|
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 | STM32F103C8T6 | 32 | |
Raspberry Pi | RP2040 | 32 |
Note: Dans nos apprentissages pratiques (laboratoires), nous utiliserons principalement les puces ATmega328P, disponible sur l’Arduino Uno, et ATmega2560 disponible sur l’Arduino Mega.
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 |
---|---|
MCU | MicroController Unit |
INPUT | Signal d’entrée |
OUTPUT | Signal de sortie |
IO | Input/Output – Entrée/Sortie |
GPIO | General 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 IO | Entrée/Sortie digitale Ne peut prendre que deux états, 0/1, On/Off, 0Volt/[3.3,5]Volts |
Analog IO | Entrée/Sortie analogique Peut prendre une multitude d’états. Par exemple, lire la valeur d’un gradateur (potentiomètre). |
Kilo | Multiplicateur * 1000 Note, en informatique, parce que les CPU calculent en base 2, 1 Kilo Octets (Ko) vaut 1024 Octets. 210 = 1 024 |
Mhz | Mégahertz – Millions de cycles (impulsions) par seconde |
SDRAM | Mémoire vive statique |
EEPROM | Electrically-Erasable Programmable Read-Only Memory Mémoire morte effaçable électriquement et programmable |
I2C | Prononcé 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 |
SDA | Serial Data Line – Ligne de données bidirectionnelle Utilisé dans la cadre d’une connexion I2C pour l’échange d’information. |
SCL | Serial 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). |
CLK | Horloge ( habituellement du CPU). Détermine la cadence d’exécution des instructions du programme. |
XTAL | Cristal 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. |
ADC | Analog to Digital Converter Convertisseur Analogique à Numérique (CAN*) |
DAC | Digital to Analog Converter Convertisseur Numérique à Analogique (CNA) |
PWM | Pulse 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. |
SPI | Serial 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. |
USB | Universal Serial Bus |
CAN | Controller Area Network Protocol de communication utilisé principalement dans l’industrie automobile. |
INT | Interruption 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. |
*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.
Fort de nos nouveaux acronymes, examinons maintenant les spécifications techniques du microcontrôleur ATmega328P.
Nom | Valeur | Description |
---|---|---|
1) Type de mémoire programme | Flash | |
2) Taille de la mémoire programme | 32 Kilo octets | 32768 octets |
3) Vitesse du CPU | 20 Mhz (1)* | 1 instruction par cycle 20 MIPS (théorique) |
4) SRAM (mémoire vive) | 2048 Octets | Utilisée pour les données, variables, … |
5) EEPROM | 1024 Octets | Mémoire non volatile pour les données |
6) Communication externes | 1-UART 2-SPI 1-I2C | |
7) Capture Comparaison PWM | 1 1 6 | À compléter |
8) Convertisseur A/D | 6 | |
9) Minuteur/compteur | 2 x 8-bit 1 x 16-bit | 8 bits -> 0..255 16 bits -> 0..65535 |
10) Nombre de comparateurs | 1 | Inclus au point 7 |
11) Température de fonctionnement | -40 to 85 °C | |
12) Plage d’alimentation (volts) | 1.8 à 5.5 | |
13) Nombre de broches | 32 | Sur le boitier DIP |
14) GPIO | 23 *(2) | Entrée/sortie à usage général PB0..PB7, PC0..PC6, PD0..PD7 |
*(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.
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:
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:
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:
Fabricant | Programmateur | Image |
---|---|---|
Microchip | PICkit 3 Pour la programmation des séries PIC (16F, 18F, …) [ Environ 40$ ] | |
Microchip | PICkit 4 Pour la programmation des séries PIC (16F, …), AVR (ATmega328P, ATmega1280, …) [ Environ 125$ ] | |
Atmel | Atmel 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$ ] |
? Voici un exemple d’une programmation ‘en circuit‘ d’un PIC 16F, en utilisant le programmateur PICkit 3, sur sur une plaquette de prototypage:
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:
Solution | Capture 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 |
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(++).
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 ?!
Qu’est-ce qu’Arduino?
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 Java, libre 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-232, Bluetooth 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