Table of Contents

Limite de l'approche synchone

Retour à la séance 6

Dans le jalon précédent, nous avions défini la boucle comme suit :

void loop()
{
    if(mButton.isPressed()) // J'ai appelé la fonction qui retourne l'état ''isPressed''.
    {
        Serial.print("Button is pressed\n"); 
        // Switch on or off the internal LED
        ...
    }
    delay(500);
}

Nous voyons que nous lisons environ toute les demi-secondes l'état du bouton.

Question n°1

Faire la liste des problèmes qui peuvent apparaître avec cette approche. Posez vous les questions suivantes :

  1. Que mesurons nous véritablement ?
  2. Pouvons nous ne pas détecter un appui sur le bouton ?
  3. Que se passe-t-il s'il y a plusieurs pressions succesives sur le bouton ?

Question n°2

Proposer une modification du code pour essayer de répondre à certaines de ces questions. On pourra envisager de réduire par exemple le délai à une valeur plus faible comme delay(50).

Est-ce que cela résout véritablement le problème ?

Question n°3

En fait nous aimerions que ce soit le système qui détecte automatiquement le changement d'état du port (passage de 0 à 1 ou passage de 1 à 0).

Il est possible d'utiliser la notion d'interruption sur les cartes ARDUINO et ce de manière assez simple. Mais qu'est ce qu'une interruption.

Une interruption est un événnement qui se produit, qui est détecté et qui est suffisament important pour pouvoir arrêté le programme qui s'exécute pour exécuter immédiatement un code prioritaire.

Typiquement quand un message arrive à l'ordinateur, votre programme s'arrête pour que le message Ethernet soit enregistré. Plus précisément :

  1. La carte Ethernet recoit un message, elle émet un signal d'interruption pour indiquer qu'un message est disponible.
  2. Le processeur recoit le message d'interruption, il interrompt l'exécution du programme en cours.
  3. Le système d'exploitation est alerté de la réception du message (par exemple par la carte Ethernet),
  4. Le système d'exploitation stocke le message Ethernet dans la pile des messages pour qu'il ne soit pas perdu et indique ensuite au processeur qu'il peut reprendre l'exécution du programme en cours.

Nous voyons donc que le mécanisme des interruptions permet de répondre immédiatement à la survenance d'un événement extérieur.

En fait c'est exactement ce que l'on aimerait faire dans le cas de notre bouton, c'est que nous soyons prévenu chaque fois que le bouton est pressé ou relâché.

La carte ARDUINO propose un mécanisme de surveillance de port qui déclenche des interruptions si jamais le signal au niveau du port est modifié. Ce mécanisme est relativement simple à mettre en oeuvre.

    attachInterrupt(digitalPinToInterrupt(pin), ISR, mode)

où :

Ainsi le code suivant :

    void onFalling() { Serial.print("Port 8: Falling\n"); }
 
    void setup()
    {
        attachInterrupt(digitalPinToInterrupt(8), onFalling, FALLING);
    }

enverra sur la console le message Port 8: Falling chaque fois que la tension passera de 3.3V à 0V sur le port 8 de l'ARDUINO.

Proposer une modification du code pour pouvoir détecter automatiquement que le bouton a été pressé en utilisant les interruptions.

Navigation

Précédent: Jalon 2: Allumer/Eteindre la diode interne à partir de ''Button''

Suivant: Jalon 4: Ajouter à la classe Button la réactivité