Thème n°2 : Interfaces de
communication (1. UART/USART)
CELECT7 : Applications des microcontrôleurs
M. Zwingelstein
rev. 2020
Thème n°2 : Interfaces de communication (1. UART/USART) rev. 2020
Travail préparatoire
Lectures de la partie préparatoire :
Lire attentivement :
1. Datasheet de l’ATmega328p : [lien]
— paragraphe 19.1 (Features)
— paragraphe 19.2 (Overview)
— paragraphe 19.4 (Frame formats)
2. Abstraction arduino pour la liaison série :
— basée sur l’interface série du microcontrôleur (hard): [lien]
— entièrement implémentée en soft : [lien]
Parcourir :
3. Datasheet de l’UART sans fil HC-11 : [lien]
Questionnaire de la partie préparatoire :
1. Architecture ATmega 328p
— Que signifient les acronymes UART et USART?
— Quels sont les noms des registres qui permettent de configurer l’USART/UART du microcon-
trôleur ATmega 328p ?
— registre pour contrôler :
— registre pour voir l’état :
— registre pour choisir le débit :
— registre pour choisir le format de la trame :
— Que permet un circuit USART que ne permet pas un circuit UART ?
— En vous appuyant sur le paragraphe 19.6 et le tableau 19-12 de la datasheet, déterminer quel
doivent être les contenus des registres UBRR0H et UBRR0L afin de paramétrer la liaison
série à 57600 bit/s si la fréquence d’horloge du microcontrôleur est de 16 MHz.
2. Ecrire la structure de la trame série correspondant à la transmission de la valeur décimale 1 avec
une parité paire, et 1 bit de stop.
3. Abstraction arduino : en vous inspirant des exemples sur [Link], écrire un sketch arduino
qui reçoit une valeur entrée au clavier depuis le terminal série côté ordinateur, et qui affiche sur
le terminal le sigle OK suivi d’une tabulation et de la valeur saisie au clavier.
M. Zwingelstein 2
Thème n°2 : Interfaces de communication (1. UART/USART) rev. 2020
Organisation du thème
— Partie 1 :
— Observation et analyse des signaux physiques sur une liaison série. Mise en rapport avec les
fonctions arduino write() et print()
— Lab 1
— Partie 2 :
— Utilisation directe des registres de l’UART de l’AVR 328p, en lieu et place des fonctions arduino
pour gagner en taille de programme
— Lab 2
— Partie 3 :
— Mise en oeuvre du circuit HC11 basé sur la puce radio fréquence CC1101 ; paramétrage et
communication de données
— Lab 3
M. Zwingelstein 3
Thème n°2 : Interfaces de communication (1. UART/USART) rev. 2020
Cours 1: Liaison série UART
Notion de bus
Une interface (ou bus) de communication série permet de faire transiter des informations binaire les
unes derrière les autres, entre deux points.
Un microcontrôleur comporte généralement plusieurs types d’interface de communication série :
— UART/USART, I2C, SPI, USB, 1-wire. . .
— Celles-ci lui permettent de s’interfacer avec d’autres périphériques ou systèmes.
— L’UART est l’interface de communication série la plus simple et la plus répandue.
Caractéristiques principales de l’UART
UART : Universal Asynchronous Receiver Transmitter
— Asynchrone (pas de signal d’horloge)
— Liaison point à point bi-directionnelle, full-duplex
— 3 fils suffisent : TX, RX, GND
— Débits : 300, 600, 1200, 2400, 4800, 9600, 14400, 19200, 28800, 38400, 57600, 115200 bits/s
Format de trame
— Emetteur et récepteur doivent utiliser le même format de trame
— Calcul du bit de parité :
M. Zwingelstein 4
Thème n°2 : Interfaces de communication (1. UART/USART) rev. 2020
Abstraction arduino associée à l’UART
Relire si besoin la documentation fournie sur [Link] (voir travail préparatoire)
FIGURE 1 – Fonctions arduino associées à la liaison série
Pour rappel :
— la fonction write() permet d’écrire directement un octet sur le port série
— la fonction print() envoie l’un après l’autre les caractères ascii associés aux caractères en
argument.
M. Zwingelstein 5
Thème n°2 : Interfaces de communication (1. UART/USART) rev. 2020
Lab 1: Mise en oeuvre de la liaison série UART en utilisant l’abstraction
arduino
Objectif et matériel utilisé
— L’objectif de ce premier lab est de bien comprendre le lien entre les fonctions arduino et la forme
du signal électrique qui est réellement véhiculé sur la liaison série
— Matériel utilisé : oscilloscope, carte arduino uno
L’ensemble des tests de ce Lab 1. devront être reportés dans un tableau
Entrées du tableau :
— fonction arduino testée
— nombre d’octets envoyés
— dessin de la trame observée à l’oscilloscope
— texte explicatif sur la trame observée
Travail à effectuer :
1. Ecrire un sketch arduino qui envoie sur le port série, à intervalles de temps réguliers, l’octet
correspondant au chiffre 1 ([Link](1);). La liaison série devra être paramétrée comme
suit :
— débit : 57600 bits/s
— pas de bit de parité (mode par défaut)
— 1 bit de stop (mode par défaut)
Penser à mettre un delay à la fin du loop() afin que les envois successifs soient espacés
d’environ 1 seconde, ce qui permettra une interprétation plus facile du signal observé.
Observer le signal généré en branchant la sonde de l’oscilloscope sur la broche TX de l’arduino.
Dessiner le signal (trame série) et expliquer sa forme.
2. Reprendre le point 1., mais avec les configurations suivantes :
— 2 bits de stop, pas de bit de parité
— 1 bit de stop, parité paire
— 1 bit de stop, parité impaire
3. Reprendre le point 1., mais en envoyant les données suivantes au lieu de la valeur 1 (s’inspirer
du code page suivante)
— un byte de valeur 2, avec la fonction [Link]()
— un byte de valeur 'a', avec la fonction [Link]()
M. Zwingelstein 6
Thème n°2 : Interfaces de communication (1. UART/USART) rev. 2020
— un byte de valeur 2 avec la fonction [Link]()
— un byte de valeur 'a' avec la fonction [Link]() <– Ré : 2 octets, 10011100 (0x39 à
l’envers, qui est le code ascii de 9) suivi de 11101001 (0x37 à l’envers, qui est le code ascii de 7
–>)
— un byte de valeur 'a' avec la fonction [Link]() avec comme second argument (à
tester l’un après l’autre) :
— BIN
— DEC
— HEX
Pour tous ces test, vous observerez à l’oscilloscope le nombre d’octets transmis par chaque
commande. Ce nombre est à comparer avec la valeur retournée par la fonction [Link]
() ou [Link]().
Exemple de fonction loop() pour réaliser le premier test de la question 3 :
1 loop() {
2 byte valeur = 2;
3 int nbBytes = [Link](valeur);
4 [Link]('\t');
5 [Link](nbBytes);
6 delay(1000);
7 }
M. Zwingelstein 7
Thème n°2 : Interfaces de communication (1. UART/USART) rev. 2020
Cours 2: Mise en oeuvre de la liaison série dans l’ATmega 328p
Diagramme en bloc
FIGURE 2 – source : datasheet AVR328p
Registres
5 registres, répartis en trois catégories :
— Un registre des données émises et reçues : USART I/O Data Register (UDR0, 8 bits)
— Trois registres de contrôles et de status : USART Control and Status Register (3 registres de 8
bits, UCSR0A, UCSR0B, UCSR0C)
M. Zwingelstein 8
Thème n°2 : Interfaces de communication (1. UART/USART) rev. 2020
— Unregistre de contrôle du débit : USART Baud Rate Register (UBRR0H pour les 8 bits de poids
fort et UBRR0L pour les 8 bits de poids faible)
Mode d’emploi
Configuration du débit
— Agir sur les registres UBRR0H et UBRR0L (tableaux 19-9 à 19-12 de la datasheet)
Configuration de l’autorisation d’envoi/réception de données
— Agir sur les bits TXEN0/RXEN0 du registre UCSR0B (paragraphe 19.10.3 de la datasheet)
Transmission d’un caractère
— En écrivant simplement sa valeur dans le registre UDR0. Voir la datasheet sections 19.6 et 19.7,
où l’on apprend :
— qu’une valeur écrite dans le registre UDR0 sera envoyée dans le registre d’émission et donc
émise
— qu’une valeur reçue dans le registre de réception sera obtenue en lisant le contenu du registre
UDR0
M. Zwingelstein 9
Thème n°2 : Interfaces de communication (1. UART/USART) rev. 2020
Lab 2. Programmation directe des registres de l’UART
Programme préliminaire
(utilisant l’abstraction arduino)
1. Reprendre le programme seance1_a1.ino de la séance 1. Remplacer la ligne 24 par Serial.
println(inputs,BIN); puis compiler et téléverser.
2. Prendre un fil mal-mal, relier un côté à la masse, et l’autre à l’une des E/S arduino n°2 à n°9
(alternativement) et vérifier que vous obtenez l’affichage attendu.
3. Remplacer à présent la ligne 24 par [Link](inputs); puis observer à l’oscilloscope le
signal sur la liaison série, tout en continuant de relier une des E/S arduino n°2 à n°9 à la masse.
Justifier vos observations.
— noter la taille du programme compilé
— enregistrer le programme sous le nom seance2_lab2_1.ino
Réduction de la taille du programme préliminaire
On cherche à réduire la taille du programme précédent, en configurant directement les registres
associés à la l’UART au lieu de passer par la couche d’abstraction arduino.
Pour rappel, nous avons vu à la séance 1 comment réduire la taille du programme pour tout ce qui
concerne la gestion des E/S.
4. Enregistrer le programme précédent sous le nom seance2_lab2_2.ino
5. Reprendre du travail préparatoire la configuration des registres UBRR0H et UBRR0L pour avoir
un débit de 57600 bits/s, sachant que la fréquence de l’oscillateur est de 16 MHz
— UBBR0H = 0B. . . (compléter)
— UBBR0L = 0B. . . (compléter)
On précise que par défaut, ces deux registres sont à zéro.
6. Les registres UCSR0A et UCSR0C seront laissés à leurs valeurs par défaut.
Par contre, le registre UCSR0B contient le bit TXEN0 qui doit être mis à 1 pour configurer l’auto-
risation de transmission.
— Compléter la ligne de code utilisant un masquage OU afin de mettre à 1 le bit TXEN0, sans
modifier les autres bits du registre UCSR0B :
— UCSR0B |=. . . (compléter)
M. Zwingelstein 10
Thème n°2 : Interfaces de communication (1. UART/USART) rev. 2020
7. Dans le programme seance2_lab2_2.ino, commenter la ligne [Link](57600); et
la remplacer par les configurations des registres vues précédemment. Compiler, téléverser et
tester le code, pour vérifier qu’il fonctionne toujours correctement
8. Dans le programme seance2_lab2_2.ino, commenter la ligne [Link](inputs,
BIN); et la remplacer par une écriture directe de l’octet inputs dans le registre UDR0
9. Compiler, téléverser et tester le code, pour vérifier qu’il fonctionne toujours correctement. Noter
la taille du programme compilé et apprécier la réduction obtenue
10. Afin de diminuer encore la taille du programme, apporter les mêmes modifications qu’en séance
1 (Lab, partie 1). Vous nommerez le programme final obtenu seance2_lab2_3.ino
Compiler, téléverser et tester le programme. A quelle taille de programme aboutissez vous ?
M. Zwingelstein 11
Thème n°2 : Interfaces de communication (1. UART/USART) rev. 2020
Cours 3: Exemple d’utilisation d’un périphérique série
UART sans fil HC-11
Le circuit HC-11 est un périphérique de type UART sans fil fabriqué par la societé Chinoise Wavesen. Il
est composé d’un module radio fréquence et d’un micro-contrôleur.
Le rôle du micro-contrôleur est de convertir l’interface du composant radio fréquence en une interface
UART.
— Avantage : grande facilité de mise en oeuvre d’une liaison sans fil point à point
— Inconvénient : l’UART sans fil ne permet généralement pas d’exploiter toutes les possibilités du
circuit radio fréquence (ex : type de modulation, débits. . . )
FIGURE 3 – Circuit HC11
Le circuit HC-11 est basé sur les composants très répandus suivants
— Texas Instrument CC1101 (composant radio fréquence)
— Motorola MC68HC11 (microcontrôleur)
Il existe un autre modèle d’UART sans fil, le HC12, plus récent et basé sur les composants suivants :
— un composant radio fréquence Silicon Labs Si4463
— un microcontrôleur STMicroelectronics STM8S003F3
Les fonctionnements du HC-11 et du HC-12 sont très similaires.
M. Zwingelstein 12
Thème n°2 : Interfaces de communication (1. UART/USART) rev. 2020
Principe d’utilisation
FIGURE 4 – Principe d’utilisation d’une UART sans fil
Modes de configuration du HC-11
Le circuit HC-11 peut être configuré selon 4 modes correspondant à des distances de transmission, des
débits et des consommations différents :
FIGURE 5 – FU1: normal, FU2: basse consommation, FU3: faible latence, FU4: longue portée.
Composant radio fréquence TI CC1101
Le circuit CC1101 de Texas Instrument est un transceiver (contraction de transmitter-receiver) RF à bande
étroite qui opère dans la bande ISM des 433 MHz.
Caractéristiques principales :
— basse consommation (30 mA maxi en Tx, sous 3,3 V. 10 nA en mode sleep)
M. Zwingelstein 13
Thème n°2 : Interfaces de communication (1. UART/USART) rev. 2020
— sensibilité élevée (–116 dBm à 0.6 kBaud pour un PER - Packet Error Rate - de 1%)
— modulation numérique paramétrable (OOK, ASK, FSK, MSK)
— débit paramétrable, maxi 500 kBauds
— puissane maximale émise +12 dBm. Portée x100m en ligne directe
Ce composant n’implémente pas de fonctionnalité réseau (se limite à la couche 2 du modèle OSI).
FIGURE 6 – Diagramme en block simplifié du CC1101
M. Zwingelstein 14
Thème n°2 : Interfaces de communication (1. UART/USART) rev. 2020
FIGURE 7 – Possibilité de configuration du CC1101
FIGURE 8 – Format de trame transmise avec le CC1101
M. Zwingelstein 15
Thème n°2 : Interfaces de communication (1. UART/USART) rev. 2020
Lab 3. Mise en oeuvre du circuit de communication HC-11
Branchement
HC-11 Arduino uno
VCC 3.3 V ou 5 V
GND GND
RXD 3 (TX)
TXD 2 (RX)
SET GND
Le microcontrôleur ATmega 328p de la carte arduino uno ne contient qu’un seul UART, et nous l’utili-
sons déjà pour dialoguer entre l’arduino et le terminal série sur le PC (via le câble USB). Comment faire
?
Heureusement, il est toujours possible d’implémenter de manière logicielle un deuxième UART. Ceci
peut être fait facilement avec la bibliothèque arduino SoftwareSerial, qui sera paramétrée afin que
le TX se trouve sur la broche 3, et le RX sur la broche 2.
Configuration du HC11 : Mode _commande
Ce mode est utilisé pour configurer le module HC-11 (voir la datasheet du module [lien]). Il sera utilisé
comme suit :
— On communique à arduino une commande AT (ex : AT+V) depuis le terminal série du PC (en hard
: UART de l’ATmega 328p)
— Le microcontrôleur ATmega 328p lit cette commande et la retransmet au HC-11 via une deuxième
liaison série (en soft)
— Le tranceiver HC-11 répond à cette commande (via la liaison série soft HC-11/ATmega328p)
— Cette réponse est affichée sur le terminal série de l’IDE arduino (via la liaison série hard ATmega
328p/PC)
1. Compiler et téléverser le programme fourni seance2_lab3_1.ino dans l’ATmega 328p. La
deuxième liaison liaison série, entre l’ATmega 328p et le HC-11 est configurée pour avoir RX sur
la broche arduino n°2 et TX sur la broche arduino n°3
M. Zwingelstein 16
Thème n°2 : Interfaces de communication (1. UART/USART) rev. 2020
2. En utilisant le terminal série de l’IDE arduino, et en vous basant sur la datasheet du module
HC-11, réaliser les opérations suivantes :
— afficher la version du firmware de l’HC-11
— afficher les informations de mode, de débit de la liaision série, de canal radio, d’adresse du
module HC-11 et de puissance RF émise
— programmer le module HC-11 afin que la puissance émise soit de 1 mW
Pour chaque opération, noter la commande utilisée ainsi que le résultat affiché.
Mode transparent
Le mode transparent est utilisé pour communiquer sans fil entre deux modules HC-11.
Pour la suite de ce lab, travailler en groupe de deux binômes afin d’utiliser deux cartes arduino associées
chacune à un module HC-11.
Ceux-ci devront porter la même adresse et utiliser le même canal radio.
— Organisez-vous afin que deux canaux radio identiques ne soient pas utilisés deux fois dans la
salle, sous peine d’interférences !
— Utilisez la méthode du point n°1 afin de configurer l’adresse des modules et la bande radio
utilisée.
3. Pour communiquer en mode transparent, il suffit maintenant de déconnecter de la masse la
broche SET des modules HC-11 (on laissera cette broche flottante).
— reprendre le sketch seance2_lab3_1.ino et l’enregistrer sous le nom seance2_lab3_2.
ino
— modifier le sketch en remplaçant la fonction read() par readString() et write() par
println()
— compiler et téléverser le programme dans chacun des modules HC-11 puis tester la commu-
nication
— commenter vos résultats
Mode Wireless IO
4. Inspirez-vous de la documentation du HC 11 (sections V et VI) afin de réaliser la manipulation
suivante :
Un module HC-11 doit piloter à distance l’état d’une LED RVB connectée aux broches 3, 4 et 5
d’un autre module HC-11. Le pilotage doit se faire en changeant l’état des broches 3, 4 ou 5 du
premier module HC-11.
M. Zwingelstein 17
Thème n°2 : Interfaces de communication (1. UART/USART) rev. 2020
Expliquer votre démarche.
M. Zwingelstein 18