Chapitre 4

Continuons notre exploration du monde Arduino… Au chapitre 2 nous avons vu qu’une broche en mode digital pouvait être soit à l’état haut (1, HIGH, 5 v) soit à l’état bas (0, LOW, 0 v).

Quand on veut que l’état d’une broche reflète la position d’un switch, ce qui est évidemment très utile pour contrôler nos modèles, de nombreux montages différents sont possibles. Ce qui est important c’est de prendre soin que la broche soit bien dans un état stable, 0 ou 1, et pas quelque part « dans la nature ».

Dans le chapitre 2 nous avons vu un montage possible :

– quand on n’appuie pas sur le switch, la broche est ramenée à l’état bas par une résistance de 10 k ohms, resistance « ressort de rappel vers le bas » ou « pull-down »

– quand on appuie sur le switch, on passe la broche à l’état haut.

Nous allons voir un autre montage possible qui présente l’intérêt de pouvoir se simplifier grâce à une propriété spéciale de l’Arduino. Pour changer d’un switch, nous allons utiliser un bouton poussoir. (Attention, bien regarder comment c’est fichu un bouton poussoir en utilisant un ohmètre ou se rappeler qu’il faut mettre le côté plat des pattes parallèles au grand bord de la breadboard).

En haut du schéma une resistance « pull-up » de 10 k ohms. Quand le bouton poussoir est au repos, cette resistance permet de ramener la Pin 2 à l’état haut. C’est un « rappel au + ». Quand on appuie sur le bouton la Pin 2 est amenée à l’état bas (on a mis en bas une resistance de protection de 220 ohms qui n’intervient pas dans la mécanique).

 


//Chap 4 P1

int BP=2; // le bouton poussoir est relié à la Pin 2

int APPUI=0; // quand on appuie sur le bouton la Pin passe à l'état bas

void setup() {

  Serial.begin(19200); // on initialise la communication en fait USB

  pinMode(BP,INPUT); // la broche reliée au bouton poussoir est en mode INPUT
}

void loop() {

  if (digitalRead(BP) == APPUI) {

    Serial.println ("Appui !");

    delay (100) ; // ne pas relire tout de suite l'état : protection anti-rebond

  } else 

  Serial.println ("============");

  }

Même montage mais une petite amélioration : le bouton poussoir commande en plus l’allumage d’une led (de petite taille) qui est soudée à l’Arduino.


//Chap 4 P2

int BP=2; // le bouton poussoir est relié à la Pin 2

// c'est la led qui est soudée sur l'Arduino
// avec sa résistance intégrée
int ledPin=13; 

// quand on appuie sur le bouton la Pin passe à l'état bas
int APPUI=0; 

void setup() {
  // on initialise la communication en fait USB

  Serial.begin(19200);
  // la broche reliée au bouton poussoir est en mode INPUT

  pinMode(BP,INPUT); 

 // pour allumer la led reliée à la Pin 13,
 // il faut que la Pin soit en OUTPUT

  pinMode (ledPin, OUTPUT);

}

void loop() {

  if (digitalRead(BP) == APPUI) {

    Serial.println ("Appui !");

    // allumer la led
    digitalWrite(ledPin, HIGH) ; 

   // ne pas relire tout de suite l'état
   // protection anti-rebond
    delay (100) ; 

  } else 

  Serial.println ("============");
  // eteindre la led
  digitalWrite(ledPin, LOW) ;

  }

===

La vraie amélioration, la voici ! Pas besoin de sortir de votre boîte de composants une resistance « pull-up » car l’Arduino en possède une, intégrée, que l’on peut mettre en service à la demande. Pratique non ?

Du coup on peut retirer la resistance du haut de 10 k ohms qui figurait sur le montage précédent (on garde juste la petite resistance de protection de 220 ohms) :

Pour les curieux :

– on peut demander à l’Arduino de mettre en place une resistance de pull-up interne mais il n’y a pas de resistance interne de pull-down prévue

– pour demander à l’Arduino de mettre en service la resistance pull-up (de 50 k ohms) pour une broche donnée, on lance un digitalWrite HIGH sur la broche concernée. C’est un peu déroutant d’écrire sur une broche qui est en mode INPUT mais c’est comme ça que l’on doit faire.

nouveauté : le mode INPUT_PULLUP

On peut faire autrement maintenant : écrire simplement PinMode(BP,INPUT_PULLUP);

Le programme correspondant :


//Chap 4 P3

// le bouton poussoir est relié à la Pin 2

int BP=2; 

// c'est la led qui est soudée sur l'Arduino 

int ledPin=13; 

// quand on appuie sur le bouton la Pin passe à l'état bas

int APPUI=0; 

void setup() {

  // on initialise la communication en fait USB

  Serial.begin(19200); 

  // la broche reliée au bouton poussoir est en mode INPUT

  pinMode(BP,INPUT); 

 // on active la resistance interne à l'Arduino
 // qui va ramener au + la Pin BP
 // quand on cesse d'appuyer sur le bouton
 // une sorte de "ressort de rappel"
 // la resistance est dite pull-up car on tire vers le haut, 5v
 // du coup on retire du montage la resistance 10 k ohms
 // qui faisait le meme travail

  digitalWrite(BP,HIGH) ; 

  pinMode (ledPin, OUTPUT); 

}

void loop() {

  if (digitalRead(BP) == APPUI) {

    Serial.println ("Appui !");

    digitalWrite(ledPin, HIGH) ; // allumer la led

    delay (100) ; // ne pas relire tout de suite l'état
                  // protection anti-rebond

  } else 

  Serial.println ("============");

  digitalWrite(ledPin, LOW) ; // eteindre la led

  }

===

Un programme pour mettre en musique nos dernières connaissances. On va mettre en place un contrôle de vitesse de moteur :

– en appuyant sur le bouton de gauche, la vitesse diminue

– en appuyant sur le bouton de droite, elle augmente

On se rend compte que ça fonctionne en observant et écoutant le moteur mais on peut bien sûr utiliser le moniteur série qui affiche la vitesse courante et les différents appuis sur les boutons poussoirs.

(on reprend bien sûr des éléments de programmes tirés des chapitres précédents, il n’y a pas grand chose de neuf)


//Chap 4 P4  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 pinMoins = 8; // reliée au bouton poussoir pour ralentir

int pinPlus = 9; // reliée au bouton poussoir pour accélérer

int vmin = 120; // "vitesse" mini

int vmax = 255; // "vitesse" max

int vact= 120; // "vitesse" actuelle

int appui= 0; // quand un bouton poussoir est appuye il est dans l'état bas 0v

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

void setup() // executée une seule fois
{
    pinMode(4, OUTPUT); // controle rotation moteur

    pinMode(5, OUTPUT); // controle vitesse moteur

    pinMode(pinMoins, INPUT); // Pin en mode entrée 

    pinMode(pinPlus, INPUT); // Pin en mode entrée

    digitalWrite(pinMoins, HIGH); // Activation de la resistance interne pull-up (rappel au plus)

    digitalWrite(pinPlus, HIGH); // Activation de la resistance interne pull-up (rappel au plus)

    Serial.begin(19200);

    marche_avant(vmin);  

}

void loop() // executée en boucle
{

   Serial.print("Lecture de l'etat du bouton poussoir : ");
   Serial.println(vact);

    if (digitalRead(pinMoins) == appui) { // appui sur le bouton poussoir pour ralentir

    Serial.print("appui sur BP moins ! ");

        if (vact > vmin) {
          vact= vact -1 ;}
    }

  if (digitalRead(pinPlus) == appui) { // appui sur le bouton poussoir pour accélérer

    Serial.print("appui sur BP plus ! ");

        if (vact < vmax) {
          vact= vact +1 ;}
    }     

      marche_avant(vact); // on tourne 1/10 de seconde à cette vitesse

      delay (100);         

}

Une photo du montage :