Chapitre 2

Jusqu’à présent nous avons utilisé les contacts (pins) de l’Arduino en sortie. On peut aussi les utiliser en entrée.

Les montages de ce chapitre utilisent une pièce appellée « solderless breadboard » (une planche à pain sans soudure !) bref un bout de plastique intelligemment perforé et muni de contacts internes pour obtenir de bons contacts entre les pièces. Ce matériel est livré avec les kits Arduino.

Le câble rouge est relié au +5v de l’Arduino, arrive sur la breadbord et toute la ligne horizontale comprenant le câble rouge est aussi à +5v

Le câble vert est relié à la terre (GND) soit 0v, arrive sur la breadbord et tout la ligne horizontale comprenant le câble vert est aussi à 0v

Important : les 5 points d’un petit segment vertical de la breadboard sont tous reliés entre eux.

Le câble orange part de la pin 2 ; il est connecté à la résistance (220 ohms, sert de protection en cas de court-circuit, ce sera mieux expliqué plus tard).

L’autre extrémité de la résistance est connectée au câble jaune (et oui car ils sont sur le même petit segment vertical).

Le petit bout de programme correspondant :


/*
 * Test switch Chap 2 P1
 */

int switchPin = 2;  // le switch est connecte à la Pin digitale 2

void setup()                    
{
  Serial.begin(19200);           
  pinMode(switchPin, INPUT); // la pin 2 est en mode entrée 
}


void loop()                     
{
  int resultat;
  Serial.print("Lecture de l'etat du switch: ");
  // l'état du switch (0 ou 1) est rangé 
  // dans la variable resultat
  resultat=digitalRead(switchPin); 
 
 // Afficher dans le moniteur serie le contenu de resultat 
 // donc l'état du switch
  
  Serial.println(resultat);       
  delay(1000);
}

Ce premier montage va nous ramener au temps des standardistes !

En effet le câble jaune va pouvoir être branché dans deux positions :

– soit sur la même ligne horizontale que le câble vert
0v, état bas, indiqué par la valeur 0

– soit sur la même ligne horizontale que le câble rouge
5v, état haut, indiqué par la valeur 1

On peut contrôler grâce au moniteur série que l’état de la PIn 2 change bien :

A quoi ça sert ?

Nous allons voir très bientôt qu’on va essayer de remplacer le câble jaune par un vrai switch, détecter dans quelle position il se trouve et décider par exemple la mise en marche ou l’arrêt d’un moteur.

Bon tout cela est chouette mais pas ce n’est pas très pratique de jouer les standardistes d’antan pour mettre la Pin 2 dans l’état haut ou l’état bas.

On voudrait bien remplacer ce dispositif par un simple switch avec deux positions :

– au repos on serait à l’état bas : 0

– switch enfoncé, on serait à l’état haut : 1

Quand on appuie sur l’interrupteur, on constate dans le moniteur qu’on passe bien à l’état 1 (la pin 2 est bien reliée au 5v).

Euh… mais au repos, quand on n’appuie pas sur l’interrupteur, ça se complique. En fait on est dans la même configuration que ci-dessous :

Dans ce cas, dans quel état est la pin 2 haut ou bas ? Euh… ça dépend… c’est parfois haut, parfois bas, on ne sait pas, ça change sans que l’on ne touche à rien. Bon ce n’est donc pas au point.

Il faudrait que, lorsque le switch est au repos, on force le passage à l’état bas. Ce qui nous manque c’est une espèce de « ressort de rappel électronique ». On va fabriquer ça en ajoutant une resistance (10 kohms) qui permettra de faire circuler un peu de courant et mettre la Pin2 à l’état bas. Quand le switch est enfoncé le courant va très majoritairement du côté du 5v et met bien la pin 2 à l’état haut, la résistance est presque ignorée.

On va représenter ça sur un petit schéma pour que cela soit plus clair (la resistance de protection de 220 ohms ne joue pas de rôle dans la « mécanique » de ce circuit, je ne l’ai pas mise sur le schéma) :

A l’état ouvert du switch on est à l’état 0 (grâce au « ressort de rappel », la resistance de 10 kohms ; elle ne laisse pas passer grand chose mais le petit courant qui la traverse suffit à faire passer la pin 2 à l’état bas). Cette resistance est dite « pull-down », elle tire vers le bas. On peut aussi imaginer un montage avec resistance « pull-up » (qui tire vers le haut), nous verrons cela dans un autre chapitre.

A l’état fermé le courant préfère circuler entre la Pin 2 vers la borne 5v (il y a juste le switch à traverser qui a une resistance très faible) car, l’autre chemin offert par la resistance de 10 k ohm ne laisse pas passer grand chose…

Il reste à mettre ceci en oeuvre dans un petit montage de démonstration.

Un petit programme fabriqué en combinant des parties des programmes précédents, suivi de la vidéo correspondante.


    //Chap 2 P2  programme sur DFRDuino Romeo V1.1

    int E1 = 5; // Pin 5 controle de la vitesse du moteur M1

    int M1 = 4; // Pin 4 controle du sens de rotation du moteur M1

    int switchPin = 2; // le switch est connecte à la Pin digitale 2



    void marche_avant(int a)
    {
      analogWrite (E1,a);
      digitalWrite(M1,HIGH);
    } 

    void marche_arriere(int a)
    {
      analogWrite (E1,a);
      digitalWrite(M1,LOW);
    } 

    void arret(int d)
    {
       digitalWrite (E1,0);
        delay(d);
        
    }

    void attente(int d)
    {
      delay(d);
    }

    void setup() // executée une seule fois
    {
        pinMode(4, OUTPUT);
        pinMode(5, OUTPUT);
        
        pinMode(switchPin, INPUT); // Important : la pin 2 est en mode entrée
        
        Serial.begin(19200);
        
        marche_avant(200);  
       
    }


    void loop() // executée en boucle
    {
      
      int etat_switch;
      
      etat_switch=digitalRead(switchPin); // l'état du switch (0 ou 1)
     
      Serial.print("Lecture de l'etat du switch: ");
     
      Serial.println(etat_switch); // Afficher dans le moniteur serie l'état du switch 0 ou 1
      
      delay(10); // temporisation ça ne sert à rien de boucler trop vite
        
            
        
        if (etat_switch == 1) { // si le switch pass à l'état 1 c'est qu'il est enfoncé
          
          arret(3000);
          
          marche_arriere(120);      // marche arrière à petite vitesse
          
          delay(8000);
          
          marche_avant (200);       // marche avant rapide
          
                   
        }
          
    }

Une petitevideo qui montre le mouvement obtenu.