Pour aller plus loin

Nous allons appliquer le savoir nouvellement acquis, en réalisant un exemple d'application concrète.

Seulement voilà, un seul moteur qui bat la mesure, c'est vite barbant. Que diriez-vous d'une machine qui servirait votre boisson favorite, sans broncher ? Que diriez-vous de faire votre premier pas en robotique sans avoir l'air d'y toucher ?

...VOICI VENIR LE BOISSONMATIC' !

Vous qui rêvez d'une invention géniale et susceptible de révolutionner l'univers, j'ai ce qu'il vous faut !

Le BoissonMatic' est une réalisation totalement absurde et c'est bien ce qui la rend indispensable. Elle nous servira ici d'illustration de principe pour un montage fort utile : le Pan Tilt, ou Monture azimutale dans notre bonne vieille langue de Molière.

Le principe est simple et consiste à monter un servo sur l'autre, perpendiculairement. Pendant que le premier moteur tourne à l'horizontale (panoramique), le second tourne à la vertical (azimut).

Avec des servomoteurs basiques, les déplacements de chacun des axes seront limités à 180°. Ceci étant, vous pouvez facilement trouver un servo tournant à 360° dans n'importe quelle boutique de modèle réduit, ou encore modifier un servo pour une rotation continue.

Code

1
// BoissonMatic' 2014
2
// john@labfab.fr sous licence WTFPL v2.0 
3
4
5
#include <Servo.h> 
6
 
7
Servo servoBas;  //  création d'un premier objet servo, pour le Pan
8
Servo servoHaut;  //  création du second, pour le tilt
9
 
10
int pos = 0;    // variable pour stocker une position
11
12
int  const MINPAN = 0; // valeur mini du Pan, en degré.
13
int const MAXPAN = MINPAN + 90;  // Un quart de tour panoramique
14
int  const MINTILT = 180;  // valeur mini du Tilt (en cas de servo monté "à l'envers" ! :] )
15
int const MAXTILT = MINTILT - 90;  // avec un max au quart de tour.
16
17
void setup() 
18
{ 
19
  servoBas.attach(9);  //   attache le servo du bas à la broche 9
20
  servoHaut.attach(10);  // celui du haut à la broche 10
21
  
22
  // Mise en place de la machine en position de départ
23
  servoBas.write(MINPAN);  
24
  servoHaut.write(MINTILT);
25
  
26
  delay(1000); // admettant qu'il faille une seconde pour faire demi-tour
27
               // à un servo bien nourri.
28
} 
29
 
30
 
31
void loop() 
32
{ 
33
  // on fait faire un quart de tour au servo panoramique
34
  servoBas.write(MAXPAN);
35
  
36
  // La boucle "for" permet d'adoucir le déplacement du moteur
37
  for(pos = 180; pos>=70; pos-=1) // On dépasse le quart de tour, 
38
                                  // pour que le versement du liquide soit plus rapide 
39
  {                                
40
    servoHaut.write(pos); 
41
    // le servo tourne de la valeur de l'angle indiquée par la variable 'pos' 
42
    delay(20);                      
43
    // on laisse un peu de temp au servo pour arriver à la position demandée
44
  } 
45
  delay(3000);  // encore du temps pour qu'assez de liquide coule du récipient.
46
  
47
  for(pos = 70; pos<=180; pos+=1)     // la même dans l'autre sens 
48
  {                                
49
    servoHaut.write(pos);
50
    delay(25);
51
  } 
52
53
  servoBas.write(MINPAN );  // retour en position initiale
54
  delay(400);
55
56
  servoHaut.detach(); // on détache les moteurs un par un. 
57
  servoBas.detach();  
58
  // la séquence n'aura lieu donc physiquement lieu qu'une seule fois, 
59
  // même si la boucle principale loop() continue à tourner.
60
  
61
  servoHaut.attached(); 
62
  // devrait retourner quelque chose
63
  // comme "false" sur votre moniteur serie.
64
}

Vous l'aurez compris, la boucle for est fort utile. C'est même la base du fonctionnement d'Arduino, vous ne pouvez pas looper ça. :)

L'instruction for est utilisée pour répéter l'exécution d'un bloc d'instructions regroupées entre des accolades. Un compteur incrémental est habituellement utilisé pour incrémenter et finir la boucle. L'instruction for est très utile pour toutes les opérations répétitives et est souvent utilisées en association avec des tableaux de variables pour agir sur un ensemble de données ou broches.

Il y a 3 parties dans l'entête d'une boucle for :

1
for (initialization; condition; incrementation) {
2
//instruction(s)à exécuter;
3
} 

L'initialisation a lieu en premier et une seule fois. À chaque exécution de la boucle, la condition est testée; si elle est VRAIE, le bloc d'instructions et l'incrémentation sont exécutés. Puis la condition est testée de nouveau. Lorsque la condition devient FAUSSE, la boucle stoppe.

Ce qui se trouve entre les {} s'appelle un bloc d'instruction. Les variables y ont un comportement spécifique que nous aborderons une autre fois si vous le voulez bien !

Vous allez devoir apprendre à la boucler, car vous utiliserez cette structure de contrôle pour de nombreux propos.

Imaginez par exemple une multitude de servomoteurs que vous voudriez "détacher". En plaçant vos objets dans un tableau, vous appliquerez un bon principe de fainéantise. Il ne vous restera plus qu'à parcourir ce tableau d'un for, et d'appliquer pour chaque tour de boucle secondaire, la méthode detach sur l'objet.

Si vous vous êtes amusé(e)s dans cette modeste découverte d'une bibliothèque standard particulièrement adaptée aux servos, adoptez le bon réflexe et sachez que pour chacun de vos projets, il en existe certainement une qui fera votre affaire.

Vous n'aurez ainsi pas à résoudre des problèmes déjà réglés, ni à re-coder ce qui l'a déjà été mille fois. Vous pourrez ainsi vous concentrer sur votre problématique et pas sur le code qui gère "la tuyauterie" sous-jacente. N'hésitez pas à parcourir les bibliothèques existantes, le soir au coin du feu. Vous apprendrez beaucoup, et gagnerez au final un temps précieux.