summaryrefslogtreecommitdiff
path: root/chapters/output.rst
diff options
context:
space:
mode:
Diffstat (limited to 'chapters/output.rst')
-rw-r--r--chapters/output.rst702
1 files changed, 702 insertions, 0 deletions
diff --git a/chapters/output.rst b/chapters/output.rst
new file mode 100644
index 0000000..097cef2
--- /dev/null
+++ b/chapters/output.rst
@@ -0,0 +1,702 @@
+.. -*- mode: rst -*-
+.. -*- coding: utf-8 -*-
+
+Premier programme
+=================
+
+Faire clignoter une |led| est l'une des premières étapes avec Arduino. C'est
+aussi une introduction pour comprendre le fonctionnement de la carte.
+
+Ce premier programme ne nécessite pas de branchement : une |led| est présente
+sur la carte et devrait s'allumer automatiquement en lançant le programme.
+
+Décomposition du programme
+--------------------------
+
+L'initialisation
+~~~~~~~~~~~~~~~~
+
+L'initialisation s'exécute seulement au démarrage du programme sur la carte
+(et sera de nouveau exécutée si l'on appuie sur le bouton `reset`).
+
+.. code-block:: arduino
+ :number-lines: 9
+
+ // the setup routine runs once when you press reset:
+ void setup() {
+ // initialize the digital pin as an output.
+ pinMode(13, OUTPUT);
+ }
+
+Une seule instruction est lancée dans cet extrait : :index:`pinMode`
+`pinMode` [#]_. Celle-ci permet d'indiquer au microcontrolleur si la broche
+doit être configurée pour envoyer du courant, ou en recevoir. Puisque nous
+souhaitons ici allumer une |led|, nous lui passons le paramètre `OUTPUT` en
+argument.
+
+.. [#] https://www.arduino.cc/en/Reference/pinMode
+
+L'exécution
+~~~~~~~~~~~
+
+Voici le cœur du programme, ces instructions seront exécutées en boucles,
+indéfiniment, tant que la carte sera sous tension.
+
+.. code-block:: arduino
+ :number-lines: 15
+
+ // the loop routine runs over and over again forever:
+ void loop() {
+ // turn the LED on (HIGH is the voltage level)
+ digitalWrite(13, HIGH);
+ delay(1000); // wait for a second
+ digitalWrite(13, LOW);
+ // turn the LED off by making the voltage LOW
+ delay(1000); // wait for a second
+ }
+
+Ce bloc est composé de quatre instructions, qui appellent deux fonctions
+différentes. :index:`digitalWrite` `digitalWrite` [#]_ permet d'envoyer ou de
+couper le courant sur une broche donnée. Pour allumer la |led|, nous commençons
+donc en donnant `HIGH` en paramètre.
+
+.. [#] https://www.arduino.cc/en/Reference/digitalWrite
+
+Vient ensuite une instruction permettant de faire une pause dans le programme :
+:index:`delay` `delay` [#]_. Cette fonction prend en paramètre la durée de la
+pause (en millisecondes, `1000` vaut donc une seconde).
+
+.. [#] https://www.arduino.cc/en/Reference/delay
+
+Afin de faire clignoter la |led|, il est nécessaire de l'éteindre ensuite.
+C'est pourquoi nous retrouvons l'instruction `digitalWrite`, mais cette fois
+avec la valeur `LOW`, suivi d'une nouvelle pause d'une seconde.
+
+.. sidebar:: digital
+
+ digital signifie *numérique*. Le terme indique une valeur que l'on peut
+ exprimer en nombre entier (1, 2, 3…).
+
+Le programme complet
+--------------------
+
+.. sidebar:: Chargement
+
+ Ce programme est disponible dans l'environnement Arduino dans les exemples :
+ Basic / Blink
+
+.. code-block:: arduino
+
+ /*
+ Blink
+ Turns on an LED on for one second, then off for one
+ second, repeatedly.
+
+ This example code is in the public domain.
+ */
+
+ // the setup routine runs once when you press reset:
+ void setup() {
+ // initialize the digital pin as an output.
+ pinMode(13, OUTPUT);
+ }
+
+ // the loop routine runs over and over again forever:
+ void loop() {
+ // turn the LED on (HIGH is the voltage level)
+ digitalWrite(13, HIGH);
+ delay(1000); // wait for a second
+ digitalWrite(13, LOW);
+ // turn the LED off by making the voltage LOW
+ delay(1000); // wait for a second
+ }
+
+Utiliser une led externe
+========================
+
+.. sidebar:: Une led
+
+ .. image:: content/5mm_Red_LED.jpg
+ :align: center
+ :width: 100%
+
+Suite à ce premier exemple, nous allons maintenant faire évoluer notre
+programme pour l'adapter à une |led| que nous allons brancher à la carte.
+Puisque nous intégrons un composant externe, nous allons devoir veiller à ce
+que celui-ci soit compatible avec l'alimentation de la carte Arduino : certains
+composants nécessitent une tension plus importante (par exemple un moteur),
+d'autre des tensions plus faibles (au risque de faire griller le composant).
+
+Le tableau suivant indique la valeur minimale et maximale supportée par
+différents types de |led|, ainsi que l'intensité du courant pour la tension
+minimale et maximale.
+
+======= =========== ============== ================
+Taille Couleur Tension (`V`) Intensité (`mA`)
+======= =========== ============== ================
+3mm rouge `1.8`-`2.5` `5`-`18`
+3mm vert `2.1`-`2.6` `5`-`17.5`
+3mm jaune `1.8`-`2.0` `5`-`17.5`
+5mm rouge `1.9`-`2.3` `5`-`18`
+5mm vert `1.9`-`2.5` `4`-`14`
+5mm jaune `1.9`-`2.5` `5`-`15`
+======= =========== ============== ================
+
+.. sidebar:: Polarisation
+
+ la |led| ne laisse passer le courant que dans un seul sens. C'est pourquoi
+ les deux broches ne sont pas de la même longueur. La patte la plus courte
+ doit être branchée sur le pôle `-`.
+
+.. admonition:: Attention
+ :class: warning
+
+ La tension de sortie de la carte est de 5 |V|. Or, en lisant le tableau, on
+ voit bien que les |led|\ s ne supporteront pas cette tension à leur borne, il
+ est donc nécessaire de mettre en place un système pour réduire la tension
+ dans les limites de ce qui est acceptable par la |led|.
+
+Dans notre situation, la tension délivrée par la carte Arduino et le courant
+qui traversera la |led| sont stables — la |led| ne modifie pas son comportement
+pendant son fonctionnement. Nous pouvons utiliser le schéma le plus simple pour
+réduire la tension : *la résistance chutrice*.
+
+.. figure:: content/cligo_led.pdf
+ :width: 100%
+
+ Arduino, LED et une résistance
+
+Calcul de la résistance
+-----------------------
+
+La résistance à placer se calcule de la manière suivante :
+
+.. math::
+
+ R = \frac{(U-Ul)}{I}
+
+.. sidebar:: Valeurs
+
+ :R: Résistance
+ :U: Tension de l'alimentation
+ :Ul: Tension de la |led|
+ :I: Intensité de la |led|
+
+Dans notre exemple, en prenant l'intensité maximale supportée par la |LED| nous
+obtenons le calcul suivant :
+
+.. math::
+
+ R &= \frac{(5-2.5)}{0.018} \\
+ &= 139\ \Omega
+
+.. sidebar:: Déjà des calculs ?
+
+ Ce petit calcul peut sembler théorique, toutefois nous en aurons besoin par
+ la suite, quand il sera nécessaire d'alimenter des composants avec des
+ tensions différentes que l'alimentation. (Nous aborderons cela plus loin avec
+ les notions de *Pont diviseur*, ainsi que les *régulateurs de tension*).
+
+La résistance choisie doit donc avoir une valeur supérieure. En consultant la
+série E12 [#]_, on peut choisir la valeur la plus proche (par exemple 220
+:math:`\Omega`).
+
+.. [#] Série de douze valeurs utilisées dans les composants électroniques :
+ https://fr.wikipedia.org/wiki/CEI_60063
+
+Vérification de l'intensité
+---------------------------
+
+On sait que : :math:`I = \frac{U}{R}` soit ici :
+
+.. math::
+
+ I &= \frac{U-Ul}{R} \\
+ &= \frac{5-2.5}{220} \\
+ &= 11.36\ mA
+
+Ce qui est suffisant pour alimenter notre composant.
+
+
+Mise à jour du programme
+------------------------
+
+Nous pouvons maintenant mettre à jour notre programme. Il s'agit toujours du
+même code que celui présenté plus haut avec toutefois une légère différence :
+au lieu d'envoyer du courant sur la broche `13`, nous l'envoyons désormais sur
+la broche `9`. Il est donc nécessaire de faire quelques modifications au lignes
+`12`, `18` et `20`.
+
+Faire varier la luminosité
+==========================
+
+Il existe 6 ports sur la carte Arduino permettant de faire varier la tension de
+sortie : `3`, `5`, `6`, `9`, `10` et `11`. Les autres port permettent seulement
+d'envoyer la tension `HIGH` ou `LOW`, c'est-à-dire 5 |V| ou 0 |V|.
+
+Il est possible d'utiliser la fonction :index:`analogWrite` `analogWrite` [#]_
+sur chacun de ses ports, en envoyant une valeur comprise entre `0` et `255`.
+
+.. [#] https://www.arduino.cc/en/Reference/AnalogWrite
+
+.. raw:: latex
+
+
+ \begin{center}
+ \begin{tikzpicture}[scale=2.6]
+
+ \foreach \x in {0,0.5,...,5} {
+ \pgfmathtruncatemacro\result{\x * 255 / 5}
+ \draw (\x,-4pt) -- (\x,4pt)
+ node [below,yshift=-20] {\pgfmathprintnumber{\result}}
+ node [above] {$\x$V};
+ }
+
+ \draw (0,0) -- (5,0);
+
+ \end{tikzpicture}
+ \end{center}
+
+.. sidebar:: `PWM`
+
+ La variation de la tension est réalisée via la *modulation de largeur
+ d'impulsions* [#]_ qui permet de faire varier la tension en faisant varier de
+ manière très brève la durée pendnant laquelle le courant est émis.
+
+.. [#] https://fr.wikipedia.org/wiki/Modulation_de_largeur_d'impulsion
+
+.. note::
+
+ Les valeurs présentées ici sont des tensions *moyennes*. En envoyant la
+ valeur `127`, la tension sur la broche sera de 5 |V|, mais pendant une durée
+ très courte :
+
+ .. raw:: latex
+
+ \begin{tikzpicture}
+ \draw[help lines] (0,0) grid (7,1);
+ \draw[thick] (0,0) node[anchor=base east] {0V} -- ++(0,0)
+ \foreach \x in {1,...,7}{
+ -- +(0,1) -- +(0.5,1) -- +(0.5,0) -- ++(1,0)
+ } -- +(0,.5);
+ \draw[thick,anchor=north east] (0,1) node {5V};
+ \end{tikzpicture}
+
+ Avec la valeur `192` la tension reste à 5 |V| pendant une durée plus longue :
+
+ .. raw:: latex
+
+ \begin{tikzpicture}
+ \draw[help lines] (0,0) grid (7,1);
+ \draw[thick] (0,0) node[anchor=south east] {0V} -- ++(0,0)
+ \foreach \x in {1,...,7}{
+ -- +(0,1) -- +(0.75,1) -- +(0.75,0) -- ++(1,0)
+ } -- +(0,.5);
+ \draw[thick,anchor=north east] (0,1) node {5V};
+ \end{tikzpicture}
+
+ Dans tous les cas, la tension à la sortie de la borne sera de 5 |V|. Il est
+ toutefois possible de transformer ce signal en une vraie tension linéaire, à
+ l'aide d'un condensateur supplémentaire [#]_.
+
+.. [#] https://provideyourown.com/2011/analogwrite-convert-pwm-to-voltage/
+
+.. admonition:: Mesure de la tension
+ :class: exercice
+
+ Avec un multimètre, mesurer la tension en sortie de la borne en fonction de
+ diverses valeurs.
+
+Programme
+---------
+
+.. sidebar:: Ressource limitée !
+
+ Cette capacité à contrôler la tension de sortie est très intéressante (par
+ exemple pour demander à un moteur de tourner plus ou moins vite), mais est
+ limitée à 6 bornes seulement. Il vaut mieux les réserver quand nous avons
+ besoin d'une sortie analogique.
+
+.. code-block:: arduino
+
+ // Fade
+
+ // This example shows how to fade an LED on pin 9
+ // using the analogWrite() function.
+
+ // This example code is in the public domain.
+
+ int led = 9; // the pin that the LED is attached to
+ int brightness = 0; // how bright the LED is
+ int fadeAmount = 5; // how many points to fade the LED by
+
+ // the setup routine runs once when you press reset:
+ void setup() {
+ // declare pin 9 to be an output:
+ pinMode(led, OUTPUT);
+ }
+
+ // the loop routine runs over and over again forever:
+ void loop() {
+ // set the brightness of pin 9:
+ analogWrite(led, brightness);
+
+ // change the brightness for next time through the loop:
+ brightness = brightness + fadeAmount;
+
+ // reverse the direction of the fading
+ // at the ends of the fade:
+ if (brightness == 0 || brightness == 255) {
+ fadeAmount = -fadeAmount ;
+ }
+ // wait for 30 milliseconds to see the dimming effect
+ delay(30);
+ }
+
+
+Générer du son
+==============
+
+.. sidebar:: Un piezzo buzzer
+
+ .. image:: content/piezzo_buzzer.jpg
+ :align: center
+ :width: 100%
+
+Avec un piezzo buzzer il est possible d'ajouter une sortie sonore au programme.
+Ceux que l'on trouve dans le commerce supportent une tension allant de 3 à
+24 |V|, ce qui permet de brancher le buzzer directement en sortie de la carte.
+
+Le composant permet de produire du son en fonction de la fréquence du signal de
+sortie.
+
+Il est possible d'utiliser la fonction `digitalWrite` sur une borne pour
+produire un beep, mais il est plus intéressant de pouvoir contrôler la
+fréquence de sortie. Nous utiliserons pour cela la fonction :index:`tone`
+`tone` [#]_. (Cette instruction peut être utilisée sur une sortie numérique, il
+n'est donc pas nécessaire de réserver une sortie analogique pour le buzzer.)
+
+.. [#] https://www.arduino.cc/en/Reference/Tone
+
+.. sidebar:: Qualité du son
+
+ La fonction `tone` ne sait produire qu'un signal carré, ce qui signifie que
+ le son n'aura jamais les harmoniques d'un fichier :smallcaps:`mp3` ou
+ :smallcaps:`wav`.
+
+.. note::
+
+ La fonction `tone` n'est pas disponible sur toutes les cartes Arduino. Si
+ vous utilisez une carte *Gemma* ou *Due* (ou un autre microcontrolleur), la
+ fonction ne sera pas disponible.
+
+ Dans ce cas, il est possible d'écrire soit même la fonction en utilisant
+ les instructions `delayMicroseconds` et `digitalWrite`. Dans ce cas la
+ fréquence des sons ne sera pas garantie, mais le but n'est pas de faire de la
+ carte Arduino un outil `hi-fi` :
+
+ .. code-block:: arduino
+
+ void tone(int targetPin, long frequency, long length) {
+ // calculate the delay value between transitions
+ // 1 second's worth of microseconds, divided by the
+ // frequency, then split in half since there are two
+ // phases to each cycle
+ long delayValue = 1000000/frequency/2;
+ // calculate the number of cycles for proper timing
+ // multiply frequency, which is really cycles per
+ // second, by the number of seconds to get the
+ // total number of cycles to produce
+ long numCycles = frequency * length/ 1000;
+ for (long i=0; i < numCycles; i++) {
+ // write the buzzer pin high to push out the diaphram
+ digitalWrite(targetPin,HIGH);
+ // wait for the calculated delay value
+ delayMicroseconds(delayValue);
+ // write the buzzer pin low to pull back the diaphram
+ digitalWrite(targetPin,LOW);
+ // wait again or the calculated delay value
+ delayMicroseconds(delayValue);
+ }
+ }
+
+Par exemple, en connectant le buzzer sur la broche `8`, l'instruction suivante
+permettra de jouer un *la* pendant une seconde :
+
+.. code-block:: arduino
+
+ tone(8, 440, 1000);
+
+En faisant varier la fréquence ainsi que la durée de chaque note, nous pourrons
+ainsi jouer des mélodies (simples). Il est par contre nécessaire de connaître
+la fréquence de la note que l'on souhaite jouer. (La table peut être obtenue
+facilement sur internet [#]_).
+
+.. [#] https://fr.wikipedia.org/wiki/Note_de_musique
+
+.. sidebar:: Codification des notes
+
+ En anglais, chaque note est codée par une lettre de A à G : C pour Do, D pour
+ Ré, F pour Mi, etc.
+
+Plutôt que d'écrire directement les fréquence dans le programme, il est plus
+simple de coder les notes, et laisser l'application jouer les notes
+correspondantes ; la notation anglaise est souvent utilisée. En associant
+chaque fréquence à une valeur dans le programme, il devient plus facile
+d'écrire la mélodie qui peut être codée en écrivant directement les notes de
+musiques !
+
+.. admonition:: Exercice
+ :class: exercice
+
+ Écrire une petite mélodie !
+
+Contrôler un moteur
+===================
+
+Avec ces instructions, il est temps de passer aux choses sérieuses. En
+contrôlant les sorties à l'aide de l'instruction `digitalWrite`, nous allons
+pouvoir donner du mouvement au robot en lui donant des roues. Mettre en route
+un moteur n'est pas difficile, mais nécessite de prendre certaines précautions
+avant de connecter notre moteur.
+
+.. admonition:: Attention
+ :class: warning
+
+ Ne jamais brancher un moteur directement à la carte Arduino. D'une part parce
+ que la tension nécessaire pour activer le moteur risque d'être trop
+ importante pour la carte (dans le meilleur des cas, le moteur ne tournera
+ pas, dans le pire des cas la carte grillera), mais aussi parce qu'un moteur
+ fonctionne de la même manière qu'une dynamo : il produit du courant quand il
+ tourne. Ce courant risque de remonter dans la carte et générer un
+ court-circuit.
+
+Pour cette raison, nous utiliserons un contrôleur externe, destiné à nous
+éviter de nombreuses complications : le L293D [#]_. Cette puce va nous permettre :
+
+.. [#] http://www.ti.com/lit/ds/symlink/l293d.pdf [#]_
+
+.. [#] Prenez le temps de lire les spécification des composants. Elles sont en
+ anglais, mais donnent toutes les informations nécessaire pour utiliser
+ le composant au mieux : les caractéristiques générale, mais également
+ les cas d'utilisation, les valeurs maximales supportées, les conseils
+ de branchement etc.
+
+.. sidebar:: Une puce L293D
+
+ .. image:: content/L293D_Motor_Driver.jpg
+ :align: center
+ :width: 100%
+
+- de protéger la carte Arduino en empêchant les surtensions : il intègre des
+ diodes de protections et des contrôleurs thermiques pour protéger le circuit.
+- de limiter le cablage et les composants à utiliser : le composant supporte
+ des tensions de fonctionnement allant de 4,5 à 36 |V|, et permettra donc de
+ délivrer des tensions beaucoup plus puissantes que ce que peut fournir la
+ carte Arduino.
+
+.. note::
+
+ Il est parfaitement possible de contrôler un moteur directement à partir de
+ la carte Arduino sans utiler ce type de composant, mais nous compliquons
+ alors le schéma de cablage inutilement. La documentation technique du
+ composant nous montre comment réaliser le cablage équivalent avec des diodes
+ et des transitors (un double pont en H).
+
+En fait, la puce ne permet pas simplement de contrôler un moteur, mais quatre
+! (ou alors deux moteurs pouvant tourner dans les deux sens). Cela correspond à
+notre robot qui aura deux roues motrices : une seule puce et quelques fils
+pourront permettre de faire rouler notre robot et lui faire réaliser quelques
+manœuvres.
+
+.. figure:: content/l293d.pdf
+ :width: 50%
+
+ L293D
+
+ :EN: Puissance du moteur : permet de contrôler la vitesse de rotation du
+ moteur en fonction de la tension appliquée à la borne. Cette borne
+ peut être reliée à une borne analogique de la carte Arduino.
+ :A: Activation du moteur : permet d'activer le moteur connecté. Ces
+ bornes sont à relier aux sorties digitales de la carte.
+ :Y: Sortie à relier aux bornes des moteurs.
+ :VCC2: Alimentation des moteurs : cette borne est à relier à
+ l'alimentation générale (36 |V| max.)
+ :VCC1: Alimentation du composant (5 |V|) : cette borne est à relier à
+ l'alimentation stabilisée de la carte Arduino.
+ :ground: Ces bornes sont à relier à la masse
+
+Montage général
+---------------
+
+Il y a trois types de bornes sur le composant : celles destinées à être
+connectées au moteur (`Y`), celles destinées à la carte Arduino (`EN` et `A`),
+et celles qui qui servent à l'alimentation (`VCC`). Comme il est possible de
+contrôler plusieurs moteurs, les bornes sont numérotées en fonction du moteur
+contrôlé.
+
+Dans le cas d'un moteur devant tourner dans les deux sens, les bornes `Y`
+doivent être connectées aux deux pattes du moteur : en envoyant du courant sur
+l'une des deux bornes `A`, il devient possible de faire tourner le moteur dans
+un sens ou un autre (le tableau présente l'exemple d'un moteur connecté aux
+bornes `1` et `2`, un deuxième moteur pourra être contrôlé de la même manière
+en le branchant sur les bornes `3` et `4`) :
+
+.. sidebar:: frein électromagnétique
+
+ Le moteur génère de l'électricité en tournant (comme une dynamo). En
+ alimentant le moteur avec l'électricité qu'il produit lui-même, on peut ainsi
+ freiner le moteur avec sa propre énergie !
+
+=========== =========== =============================================
+Tension 1A Tension 2A Résultat
+=========== =========== =============================================
+`LOW` `LOW` Arrêt du moteur (frein électromagnétique)
+`LOW` `HIGH` Faire tourner le moteur dans un sens
+`HIGH` `LOW` Faire tourner le moteur en sens inverse
+`HIGH` `HIGH` Arrêt du moteur (frein électromagnétique)
+=========== =========== =============================================
+
+Voir le schéma de branchement avec deux moteurs contrôlés depuis la carte
+Arduino.
+
+.. figure:: content/arduino_l293d.pdf
+ :width: 100%
+
+ L293D, Arduino et deux moteurs
+
+ Les cables reliant le L293D à la masse, et l'alimentation des moteurs ne sont
+ pas représentés.
+
+ :Cable bleu: Marche avant
+ :Cable vert: Marche arrière
+ :Cable orange: Puissance du moteur
+
+.. raw:: latex
+
+ \pagebreak
+
+Programme
+---------
+
+.. sidebar:: Valeurs
+
+ Les valeurs ne sont pas choisies par hasard : elles correspondent aux
+ paramètres des fonctions `digitalWrite` et `analogWrite` !
+
+Ce programme n'est pas disponible dans l'environnement Arduino, cette fois nous
+allons devoir l'écrire nous même. Afin de simplifier l'écriture, nous allons
+définir une fonction `runMotor` qui prendra trois paramètres :
+
+:motor: Le numéro du moteur à activer, le 1er moteur déclaré aura la numéro `0`
+:direction: La direction du moteur, elle peut prendre deux valeurs `HIGH` ou
+ `LOW`
+:speed: La vitesse de rotation, cette valeur peut aller de `0` à `255`
+
+.. code-block:: arduino
+
+ void runMotor(int motor, int direction, int speed) {
+ // …
+ }
+
+
+.. admonition:: Contrôle du moteur
+ :class: exercice
+
+ Avec la fonction `runMotor`, nous pouvons donner du mouvement au robot. En
+ donnant des paramètres de sens et de vitesse différents à la roue gauche et
+ droite le robot se déplacera différement. Donnez les paramètres de la
+ fonction `runMotor` pour réaliser les actions suivantes :
+
+ - Marche avant
+ - Marche arrière
+ - Faire tourner le robot sur lui-même
+ - Faire un virage serré
+ - Faire un virage large
+ - Arrêt complet
+
+.. ========================= ========================= ==========================
+.. Moteur 1 Moteur 2 Effet
+.. ========================= ========================= ==========================
+.. `runMotor(0, HIGH, 255)` `runMotor(1, HIGH, 255)` Marche avant
+.. `runMotor(0, LOW, 255)` `runMotor(1, HIGH, 255)` Tourner sur lui-même
+.. `runMotor(0, HIGH, 255)` `runMotor(1, LOW, 255)` Tourner sur lui-même (sens
+.. inverse)
+.. `runMotor(0, LOW, 255)` `runMotor(1, LOW, 255)` Marche arrière
+.. `runMotor(0, LOW, 0)` `runMotor(1, HIGH, 255)` Virage serré
+.. `runMotor(0, HIGH, 127)` `runMotor(1, HIGH, 255)` Virage large
+.. `runMotor(0, LOW, 0)` `runMotor(1, LOW, 0)` Arrêt complet
+.. ========================= ========================= ==========================
+
+Connecter un écran Nokia 5110
+=============================
+
+.. sidebar:: L'écran LCD
+
+ .. image:: content/s-l500.jpg
+ :align: center
+ :width: 100%
+
+L'écran Nokia 5110 est un composant de base et peu honéreux (environ 2€)
+permettant un affichage depuis la carte Arduino. Il permet un affichage sur une
+grille de 84x48 pixels, soit 4 lignes de textes.
+
+.. admonition:: Tension de fonctionnement
+ :class: warning
+
+ Le composant fonctionne sous 3,3 |V|, il n'est donc pas recommandé de le
+ brancher directement sur la carte Arduino (même si certains le font [#]_).
+ Dans le doute, commencez avec un correcteur de courant.
+
+.. [#] https://circuitdigest.com/microcontroller-projects/nokia5110-graphical-lcd-arduino-interfacing
+
+Level shifter 74HC4050N
+-----------------------
+
+Ce composant est *unidirectionnel* et *High to Low* : en alimentant le
+composant en 3.3 |V|, nous avons la possibilité de générer une sortie à 3.3 |V|
+à partir de la carte Arduino : le composant possède 6 entrées et 6 sorties : à
+chaque fois que la tension sur une borne d'entrée est supérieure à la tension
+d'alimentation, la sortie correspondante sera activée.
+
+.. admonition:: Broches non connectées
+ :class: note
+
+ Deux bornes ne sont pas connectées sur le composants : les bornes `13` et
+ `16`. Attention au moment du cablage !
+
+.. sidebar:: Cablage
+
+ Le cablage sur le composant `74HC4050N` importe peu, tant que chaque entrée
+ est bien associée à la sortie correspondantes.
+
+.. figure:: content/nokia_5110.pdf
+ :width: 100%
+
+ Arduino, Nokia 5110, 74HC4050N
+
+ :Cable Rouge: +3.3 |V|
+ :Cable Noir: Masse
+ :Cable Vert: Broche 7 - 3 (SCE)
+ :Cable Bleu: Broche 6 - 4 (RST)
+ :Cable Orange: Broche 5 - 5 (D/C)
+ :Cable Maron: Broches 11 - 6 (DN(MOSI))
+ :Cable Cyan: Broche 13 - 7 (SeriaL CLock)
+ :Cable Mauve: Broche 9 - 8 (LED)
+
+
+Le programme [#]_
+
+.. image:: content/nokia_5110_montage.jpg
+ :width: 100%
+
+
+.. [#] https://learn.sparkfun.com/tutorials/graphic-lcd-hookup-guide
+
+
+.. default-role:: literal
+.. role:: smallcaps
+.. role:: index
+.. |lcd| replace:: :smallcaps:`lcd`
+.. |usb| replace:: :smallcaps:`usb`
+