Tuto pas-à-pas C++ : utiliser un détecteur de mouvements infrarouge PIR sur la Gamebuino Meta

Voici un tutoriel étape par étape qui vous permettra de réaliser un programme simple afin d’utiliser un capteur infrarouge pir avec votre console.

Le tuto est destiné à être réalisé avec le matériel fourni dans le pack d’accessoires Gamebuino. Toutefois vous pouvez bien entendu utiliser un autre capteur tant que celui-ci est compatible Arduino.

Pour ce tutoriel, il vous faut :

  • une console Gamebuino META
  • Un capteur pir compatible Arduino
  • un ordinateur avec l’environnement de développement l’IDE Aduino installé

Si ce n’est pas encore fait, reportez vous à la fiche
Premiers pas (C++ 1/5) : Installation rapide du logiciel - Gamebuino pour installer l’IDE Arduino.

Etape 1 : Bien commencer

Cette étape est identique sur la plupart des tutos car elle constitue la base indispensable de n’ilmporte quel programme pour Gamebuino.

Pour commencer, ouvrez l’éditeur Arduino préconfiguré pour la Gamebuino

-Vous devriez avoir ceci sur votre écran :

void setup() {
  // put your setup code here, to run once:
}

void loop() {
  // put your main code here, to run repeatedly:
}

Pour l’instant, le code est un peu vide, mais on va le compléter.

  • En premier lieu on a besoin d’ajouter au tout début du fichier la ligne suivante :
#include <Gamebuino-Meta.h>

C’est ce qu’on appelle une “librairie”, elle va nous permettre d’utiliser tout un tas de fonctions sans avoir à les programmer à la main. Cette librairie contient toutes les fonctions de la Gamebuino et est très utile pour la suite.
On va ajouter deux fonctions pour que notre programme puisse fonctionner :

  • Dans la fonction setup() on ajoute un appel à la fonction gb.begin() comme suit :
void setup() {
  // put your setup code here, to run once:
  gb.begin();
}

La fonction gb.begin() permet d’initialiser la console : sans cela rien ne fonctionnera !

  • Ensuite, on ajoute la fonction waitForUpdate() dans la fonction loop :
void loop() {
  // put your main code here, to run repeatedly:
  gb.waitForUpdate();
}

La fonction waitForUpdate() permet de rafraichir le contenu de l’écran (c’est à dire dessiner dessus), gère la lecture des sons, les appuis sur les touches, bref tout ce qui donne vie à votre Gamebuino.

On a à présent une structure de programme fonctionnelle, même si elle ne fait encore rien de concret.

Les branchements

En parallèle de notre code il faut brancher le capteur à la console, si possible avec le backpack.
On branche l’ alimentation (VCC) sur un pin 3V3, la masse (GND) sur une masse. Le pin central est branché sur un port digital, ici le port 10.

Etape 2 : utiliser le capteur

  • On commence par définir le pin utilisé par notre capteur avec un define et on définit ce pin comme une entrée dans notre fonction setup() :
#define inputPin 10

void setup() {
  // put your setup code here, to run once:
  gb.begin();

  pinMode(inputPin, INPUT);
}

Le fonctionnement du capteur pir est extrêmement simple, à intervalle régulier il effectue une mesure et renvoie une valeur de 0 ou 1.

  • On déclare une variable int globale oldState que l’on initialise à l’état LOW dans notre setup() :
#define inputPin 10
int32_t i32_oldState;

void setup() {
  // put your setup code here, to run once:
  gb.begin();

  pinMode(inputPin, INPUT);
  i32_oldState = LOW;
}

Ainsi on établit une valeur de base qui nous servira de référence pour effectuer des comparaisons.

La suite va se passer entièrement dans notre fonction loop()

  • On y ajoute une variable int newState qu’on initialise avec la valeur lue par le capteur grâce à la fonction digitalRead() :
void loop(){
  // put your main code here, to run repeatedly:
  gb.waitForUpdate();
  
  int32_t i32_newState = digitalRead(inputPin);

Ensuite on va simplement effectuer une comparaison avec notre globale oldState pour déterminer si le capteur détecte quelque chose ou non.

  • Cette comparaison se fait en deux temps :
void loop(){
  // put your main code here, to run repeatedly:
  gb.waitForUpdate();
  
  int32_t i32_newState = digitalRead(inputPin);

// Si on a une lecture HIGH et un état précédent LOW alors on détecte quelque chose
  if (i32_newState == HIGH){
    if (i32_oldState == LOW){
      gb.display.clear();
      gb.display.printf(" Motion detected !");
      gb.sound.playOK();
      i32_oldState = i32_newState;
    }
  }
// Si on a lecture LOW et un état précédent HIGH alors on ne détecte rien
  if (i32_newState == LOW){
    if (i32_oldState == HIGH){
        gb.display.clear();
      gb.display.printf(" No motion detected");
      gb.sound.playCancel();
      i32_oldState = i32_newState;
    }  
  }
}

Ici les commentaires sont explicites. On compare l’état NEW avec l’état OLD et on agit en fonction. On en profite pour jouer deux sons distincts avec les fonctions playOK() et playCancel(). Au passage on affiche des messages simples indiquant l’état avec la fonction printf(). Le plus important étant de ne pas oublier de remplacer la valeur OLD par la valeur NEW à chaque fin de boucle pour établir la continuité.

Et voilà, ce tutoriel est terminé, il est relativement simple comparé à ceux des autres capteurs. A vous de jouer, modifiez votre programme et faites vos propres expériences.

1 Like