summaryrefslogtreecommitdiff
path: root/chapters/input.rst
blob: f298c7aa9cceee8b959b5c9ac47eaf8fb7478f54 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
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 -*-