summaryrefslogtreecommitdiff
path: root/chapters/input.rst
diff options
context:
space:
mode:
Diffstat (limited to 'chapters/input.rst')
-rw-r--r--chapters/input.rst357
1 files changed, 357 insertions, 0 deletions
diff --git a/chapters/input.rst b/chapters/input.rst
new file mode 100644
index 0000000..f298c7a
--- /dev/null
+++ b/chapters/input.rst
@@ -0,0 +1,357 @@
+.. -*- mode: rst -*-
+.. -*- coding: utf-8 -*-
+
+Maintenant que nous avons vu comment contrôler les sorties de la carte Arduino,
+il est temps de se poser la question d'utiliser les entrées de la carte : c'est
+par ce moyen que nous allons pouvoir donner un peu de réaction à notre robot, à
+travers des capteurs qui nous fournirons des informations sur le monde
+extérieur.
+
+Utiliser Arduino comme ohmmètre
+===============================
+
+Lecture de la tension
+---------------------
+
+Il existe six ports sur la carte Arduino permettant de lire des valeurs
+analogiques (`A0` — `A5`).
+
+Par exemple, la tension peut être lue le port `A0` sur avec l'instruction
+:index:`analogRead` `analogRead(A0)` [#]_. Celle-ci est lue sur dix bits (soit
+une valeur comprise entre `0` et `1023`), en fonction de la tension
+d'alimentation de la carte Arduino (normalement 5 |V|).
+
+.. [#] https://www.arduino.cc/en/Reference/AnalogRead
+
+.. raw:: latex
+
+ \begin{center}
+ \begin{tikzpicture}[scale=2.5]
+
+ \foreach \x in {0,0.5,...,5} {
+ \pgfmathtruncatemacro\result{\x * 1023 / 5}
+ \draw (\x,-4pt) -- (\x,4pt)
+ node [below,yshift=-20] {\pgfmathprintnumber{\result}}
+ node [above] {$\x$ V};
+ }
+
+ \draw (0,0) -- (5.0,0);
+
+ \end{tikzpicture}
+ \end{center}
+
+.. note::
+
+ Lors de l'écriture sur un port analogique, la précision est réalisée sur huit
+ bits (soit une valeur comprise entre `0` et `255`). Attention donc en
+ redirigeant l'entrée d'un port vers une sortie !
+
+On peut donc utiliser la carte comme un voltmètre simple, pour mesurer une
+tension entre 0 |V| et la tension d'alimentation (5 |V|). La formule suivante
+permet de calculer la tension en fonction de la valeur retournée par la
+fonction `AnalogRead` :
+
+.. math::
+
+ V = \frac{5 \times \mathtt{AnalogRead()}}{1023}
+
+Utiliser l'Arduino comme ohmmètre
+---------------------------------
+
+Notre premier montage pour illustrer la lecture d'une valeur consiste à
+utiliser l'Arduino pour connaître la valeur d'une résistance. Nous allons
+utiliser un *pont diviseur* (voir le schéma) avec une résistance connue, et une
+autre dont on souhaitera déterminer la valeur : en lisant la tension
+:math:`V_A`, il sera possible de déterminer la valeur de la résistance
+inconnue.
+
+.. figure:: content/pont_diviseur.pdf
+ :width: 50%
+ :align: center
+
+ Le pont diviseur
+
+
+ La plus simple représentation du diviseur de tension consiste à placer deux
+ résistances électriques en série. Ce type d'association de résistances étant
+ omniprésent dans les montages électriques, le pont diviseur en devient une des
+ notions fondamentales en électronique.
+
+
+ Il est possible de calculer facilement la valeur de :math:`V_A` dans le
+ montage, à la condition de connaitre les valeurs des résistances et la valeur
+ de la tension Vcc. La première formule à utiliser est celle de la loi d'Ohm qui
+ permet de citer cette équation :
+
+ .. math::
+
+ I = \frac{V_\text{cc}}{R_1+R_2}
+
+ En utilisant la loi d'Ohm une seconde fois, il est possible de déterminer
+ l'équation suivante:
+
+ .. math::
+
+ V_a = R_2 \times I
+
+ Dans la formule ci-dessous, il suffit de remplacer le courant :math:`I` par
+ sa valeur équivalente (la première équation) pour déterminer facilement
+ l'équation de :math:`V_A`:
+
+ .. math::
+
+ V_a = R_2 \times (\frac{V_\text{cc}}{R_1+R_2})
+
+ **Exemple**
+
+ Prenons les valeurs suivantes :
+
+ - :math:`V_\text{cc}`: 9V
+ - :math:`R_1`: 1k :math:`\Omega`
+ - :math:`R_2`: 3k :math:`\Omega`
+
+ .. math::
+
+ V_a &= R_2 \times \frac{V_\text{cc}}{R_1 + R_2} \\
+ &= 3000 \times \frac{9}{1000+3000} \\
+ & = \frac{27000}{4000} \\
+ &= 6.75V
+
+ La différence de potentiel :math:`V_A` sera égal à 6.75 |V| en utilisant les valeurs
+ précédentes.
+
+Dans notre cas, nous connaissons la tension ainsi que la valeur de la
+résistance :math:`R_2`. Donc en reprenant la formule du calcul de :math:`V_A`
+nous obtenons :
+
+.. math::
+
+ %V_a &= R_2 \times \frac{V_\text{cc}}{R_1 + R_2} \\
+ %(R_1 + R_2) \times V_a &= R_2 \times V_\text{cc} \\
+ %R_1 \times V_a + R_2 \times V_a &= R_2 \times V_\text{cc} \\
+ %R_1 \times V_a &= R_2 \times V_\text{cc} - R_2 \times V_a \\
+ %R_1 &= \frac{R_2 \times V_\text{cc}}{V_a} - \frac{R_2 \times V_a}{V_a} \\
+ %R_1 &= \frac{R_2 \times V_\text{cc}}{V_a} - R_2 \\
+ %R_1 &= R_2 \times \left(\frac{V_\text{cc}}{V_a} - 1\right) \\
+ R_1 &= R_2 \times \left(\frac{1023}{\mathtt{AnalogRead()}} - 1\right)
+
+.. .. note::
+..
+..
+.. La dernière ligne du calcul peut se retrouver ainsi : on sait que la tension
+.. lue par fonction `analogRead()` est échelonée de `0` à `1023` par rapport à
+.. la tension d'alimentation, ce que l'on peut représenter dans la ligne
+.. suivante :
+..
+.. .. math::
+..
+.. V_A &= \frac{V_\text{cc} \times \mathtt{AnalogRead()}}{1023} && \text{donc} \\
+.. \frac{V_\text{cc}}{V_A} &= \frac{V_\text{cc}}{\frac{V_\text{cc} \times \mathtt{AnalogRead()}}{1023}} \\
+.. \frac{V_\text{cc}}{V_A} &= V_\text{cc} \times {\frac{1023}{V_\text{cc} \times \mathtt{AnalogRead()}}} \\
+.. \frac{V_\text{cc}}{V_A} &= \frac{1023}{\mathtt{AnalogRead()}}
+
+Contrôle théorique
+~~~~~~~~~~~~~~~~~~
+
+Ce programme en python permet de prédire les différentes valeurs qui seront
+lues par la carte Arduino. Il reproduit (dans une certaine mesure) les erreurs
+d'arrondis qui seront susceptible d'arriver sur la carte lors du calcul des
+valeurs :
+
+.. sidebar:: Programme
+
+ Ce programme va calculer la tension :math:`V_A`, la valeur lue par la fonction
+ `analogRead`, la valeur de la résistance calculée, et l'intensité qui
+ traverse les composants.
+
+.. include:: ../content/ohm.py
+ :code: python
+
+.. raw:: latex
+
+ \pagebreak
+
+
+Il permet de construire le tableau de valeurs suivant (avec :math:`R_2` = 1000
+:math:`\Omega`, et :math:`V_\text{cc}` = 5 |V|) :
+
+.. sidebar:: Tension théorique
+
+ Ce tableau est construit à partir de la différence de potentielle théorique
+ au niveau de la résistance :math:`R_2`. Les valeurs réelles seront toujours
+ légèrement différentes lors du montage.
+
+=================== ================= ============= ===================
+Résistance Tension théorique Valeur lue Résistance calculée
+=================== ================= ============= ===================
+10 :math:`\Omega` 4,95 |V| 1012 10
+220 :math:`\Omega` 4,1 |V| 838 220
+1k :math:`\Omega` 2.5 |V| 511 1 001
+10k :math:`\Omega` 0,45 |V| 93 10 000
+220k :math:`\Omega` 0,02 |V| 4 254 750
+=================== ================= ============= ===================
+
+Au delà de 220k :math:`\Omega`, la tension qui traverse :math:`R_2` devient si
+faible que la valeur lue par la fonction `analogRead` tombe à `0`, ce qui
+empêche toute mesure. En prenant une valeur plus importante pour la résistance
+:math:`R_2`, la plage d'erreur sera plus faible pour des valeurs plus
+importante de :math:`R_1`
+
+Montage
+-------
+
+Le montage reste simple à mettre en place, il ne nécessite que deux résistances
+(dont celle dont on souhaite calculer la valeur).
+
+.. figure:: content/arduino_ohmetre.pdf
+ :width: 70%
+
+ Arduino comme ohmmètre
+
+ La résistance :math:`R_1` sera calculée en fonction de la valeur de
+ :math:`R_2`.
+
+ La résistance :math:`R_2` peut être choisie avec une valeur de
+ 1000 :math:`\Omega` par défaut, et changée en fonction du besoin.
+
+Le programme reprend la formule que nous avons calculé ci-dessus, et affiche le
+résultat sur la console.
+
+.. code-block:: arduino
+
+ // La résistance r2 doit être connue et
+ // renseignée dans le programme
+ int r2 = ...;
+
+ void setup() {
+ Serial.begin(9600);
+ }
+
+ void loop() {
+
+ int r1 = r2 * ((1023 / (float)analogRead(A0)) - 1);
+
+ Serial.print("R1: ");
+ Serial.println(r1);
+
+ delay(1000);// wait for a second
+ }
+
+.. [#] https://www.arduino.cc/en/Serial/Print
+
+.. note::
+
+ Nous découvrons à l'occasion de ce programme la librairie `Serial` [#]_ qui
+ permet d'envoyer des données à l'ordinateur via le port |usb|. Il s'agit d'un
+ moyen pratique pour transmettre une valeur lue sur la carte.
+
+ Nous pourrions enrichir ce schéma avec une sortie sur un écran |lcd| plutôt
+ que d'envoyer l'information vers l'ordinateur : nous aurons ainsi un ohmmètre
+ autonome !
+
+
+Capteur de proximité infrarouge
+===============================
+
+Dans un projet de robot mobile, il est nécessaire de tester la présence
+d'objets à proximité pour éviter que celui-ci ne percute les obstacles.
+
+.. sidebar:: Capteur infrarouge
+
+ .. image:: content/Sharp_GP2Y0A21YK.jpg
+ :align: center
+ :width: 100%
+
+Nous retrouvons deux types de senseurs sur les robots : des senseurs
+optiques, ou par ultrasons. Le senseur Sharp relève de la première catégorie.
+Il permet de détecter la présence d'un objet entre 10 et 80 cm, à partir du
+retour de lumière infrarouge.
+
+Montage général
+---------------
+
+Le schéma suivant indique comment placer les différents câbles du connecteur
+:smallcaps:`JST`.
+
+.. sidebar:: Condensateur
+
+ Le condensateur présent sur le schéma permet ici de lisser les variations de
+ la tension. On l'appelle *Condensateur de découplage* [#]_.
+
+.. [#] https://fr.wikipedia.org/wiki/Condensateur_de_d%C3%A9couplage
+
+.. figure:: content/capteur_infra.pdf
+ :width: 100%
+
+ Arduino, `GP2Y0A21YK`
+
+ :Cable Rouge: +5 |V|
+ :Cable Noir: GND/Masse
+ :Cable Jaune ou Blanc: Entrée Analogique `A0`
+
+Tension de sortie
+~~~~~~~~~~~~~~~~~
+
+.. sidebar:: Tension d'entrée
+
+ Même si le composant supporte une tension allant jusque 7 |V|, il fonctionne de
+ manière optimale avec des valeurs allant de 4,5 à 5,5 |V|.
+
+La tension de sortie, sur le fil jaune, nous indique la distance de l'objet.
+Celle-ci varie entre 0,5 |V| et 3 |V| selon la distance de l'obstacle [#]_.
+
+.. [#] http://www.sharp-world.com/products/device/lineup/data/pdf/datasheet/gp2y0a21yk_e.pdf
+
+.. image:: content/gp2y0a21yk_e.pdf
+ :width: 100%
+
+.. Mesure de la tension en fonction de la distance
+
+Exemple
+~~~~~~~
+
+Ce programme lit l'entrée sur la broche `A0` et allume une |led| si un objet
+est détecté à proximité (±20 |cm|) :
+
+.. code-block:: arduino
+
+
+ int ledPin = 9; // LED connected to digital pin 9
+
+ void setup() {}
+
+ void loop() {
+ int sensorValue = analogRead(A0);
+ if (sensorValue < 220)
+ sensorValue = 0;
+
+ analogWrite(ledPin, sensorValue >> 2);
+ delay(200); // delay 200 milliseconds
+ }
+
+.. Déclencher le capteur sur demande
+.. ---------------------------------
+..
+.. Plutôt que d'activer le capteur en continu, nous allons modifier le programme
+.. pour n'activer la détection d'objets seulement en cas de mouvements du robot
+.. (il n'est pas nécessaire de chercher à tester les obstacles si le robot ne se
+.. déplace pas). Cela permettra d'augmenter l'autonomie du robot (en contre-partie
+.. d'un port digital utilisé). La consommation du composant étant de 30 |mA|, nous
+.. pouvons connecter directement la broche à l'Arduino, il sera capable de fournir
+.. le courant nécessaire.
+..
+.. Le capteur nécessite un délai minimal avant de fournir une valeur fiable.
+..
+.. Créer une tension seuil
+.. -----------------------
+..
+.. Nous n'avons pas un besoin réel d'évaluer la distance de l'objet, simplement de
+.. pouvoir arrêter le robot s'il s'approche trop près d'un objet. Si l'on connaît
+.. la distance d'arrêt souhaitée (et donc la tension) avant de construire le
+.. robot, nous pouvons paramétrer le seuil de déclenchement de l'alarme, et
+.. utiliser une broche digitale au lieu d'une broche analogique.
+
+
+.. -*- mode: rst -*-
+.. -*- coding: utf-8 -*-
+