Nom:                                                                Prénom:


Activité pratique Barrière automatique : 

Réguler l'accès à un parking grâce à une barrière automatique


Problématique :


Une société de gardiennage souhaite équipé son garage souterrain d'une barrière automatique. Cela permettrait une meilleure fluidité de passage des véhicules et une meilleur traçabilité des entrées /sorties.








Le rendu se fait sur copie avec


Encarts présentation

+

numéro de questions (même si non traité)



1 - Organisation fonctionnelle de la chaîne d'information



L'automobiliste, lorsqu'il arrive dans le parking souterrain, récupère un ticket de parking. La barrière s'ouvre. En fonction du temps passé dans le parking, il s'acquitte du règlement et regagne sa voiture. Il badge à nouveau pour sortir.

Nous allons travailler sur la maquette qui simule le fonctionnement du système dans un sens. La partie gestion de carte d’accès ne fait pas partie de l'étude. On simulera celle-ci par l'appui sur un bouton situé sur la maquette.


Algorithmes (2h)


Etape 1 : Test des boutons et fin de course


On souhaite ouvrir la barrière avec un appui simple sur le bouton poussoir.


Question 1 : Compléter la condition A et l’action B de l’algorithme suivant.






Question 2 : Compléter le code arduino suivant (Zone A et Zone B).


int pinLed = 3;      // numéro de patte ou se trouve la led

int pinBouton = 2;   // numéro de patte où se trouve le bouton

int etatBouton = 0;  //variable globale permettant de stocker l'état du bouton


void setup() {

  pinMode(pinLed, OUTPUT);

  pinMode(pinBouton, INPUT);

  Serial.begin(9600);  

}


void loop() {


  //lecture de l'état du bouton

  etatBouton = digitalRead(pinBouton);

   

  if (etatBouton == HIGH)

  {

    Serial.println("Zone A : A COMPLETER");

    digitalWrite(pinLed, HIGH);

  }

  else

  {

    Serial.println("Zone B : A COMPLETER");

    digitalWrite(pinLed, LOW);

  }

  delay(20);

}


Le code source se trouve dans le fichier « 1_testDesBoutons.ino » que vous pouvez ouvrir directement avec Arduino IDE.


Tester le code directement sur la maquette en téléversant celui-ci. Que se passe-t-il ? 


Attention à bien choisir le bon port COM et le bon microcontrôleur dans la liste (Arduino Uno).



Le port COM peut être différent, il faut trouver celui de votre ordinateur.



Etape 2 : Test des moteurs


Nous allons tester le mode manuel des moteurs en ajoutant 2 nouveaux boutons pour le mode manuel. Il faudra faire attention à ne pas forcer les moteurs sur les fins de course.

     Ajouter et câbler deux boutons que vous identifierez.


     Pour ajouter le support avec la carte seed moto v1.3, il faut faire une manipulation sous l’IDE Arduino. Récupérer le fichier zip présent dans le répertoire, puis copier le directement dans le répertoire « library » ou « librairies » de l’IDE Arduino. Si vous ne savez pas où cela se trouve, vous pouvez regarder dans Fichier > préférences et vous aurez le chemin.



Une fois le fichier copié,  il faudra le déclarer au niveau des bibliothèques Arduino, pour cela, il suffit de faire : 



Et vous pointez sur le fichier fraîchement copié.


Vous voilà prêt à utiliser le moteur de la barrière.


Question 3 : Compléter l’algorigramme suivant pour la gestion de barrière :


  


Question 4 : Compléter le code Arduino suivant (zone A et B) pour la gestion du moteur sans gestion de fin de course.

Ajouter les 2 boutons au shield seed de l’arduino. Déclarer ces deux boutons dans le code ci-dessus et faites les branchements.


#include "Grove_I2C_Motor_Driver.h"


// adresse par défaut de l'I2C

#define I2C_ADDRESS 0x0f


int pinLed = 3;      // numéro de patte ou se trouve la led

int pinBouton = 2;   // numéro de patte où se trouve le bouton

int pinBoutonDescente = 6; //bouton pour descendre la barrière

int pinBoutonMontee = 7;   //bouton pour monter la barrière


int etatBouton = 0;  //variable globale permettant de stocker l'état du bouton

int etatBoutonDescente = 0;  //variable globale permettant de stocker l'état du bouton

int etatBoutonMontee = 0;  //variable globale permettant de stocker l'état du bouton



void setup() {

  pinMode(pinLed, OUTPUT);

  pinMode(pinBouton, INPUT);

  // initiation de la carte SEED avec l'adresse par défaut 0x0f

  Motor.begin(I2C_ADDRESS);

    

  Serial.begin(9600);  

}


void loop() {


  //lecture de l'état du bouton

  etatBouton = digitalRead(pinBouton);

  etatBoutonDescente = digitalRead(pinBoutonDescente);

  etatBoutonMontee = digitalRead(pinBoutonMontee);


  if(etatBoutonDescente == HIGH) {

     Serial.println("Zone A : A COMPLETER");

     Motor.speed(MOTOR1,-70);

     delay(100);

  }else{

    Motor.stop(MOTOR1);

  }


  if(etatBoutonMontee == HIGH) {

      Serial.println("Zone B : A COMPLETER");

      Motor.speed(MOTOR1,40);

      delay(100);

  }else {

      Motor.stop(MOTOR1);

  }

  

  if (etatBouton == HIGH)

  {

    Serial.println("Appui");

    digitalWrite(pinLed, HIGH);

  }

  else

  {

    Serial.println("Pas d'appui");

    digitalWrite(pinLed, LOW);

  }

  delay(20);

}


Le code source se trouve dans le fichier « 2_testDesMoteurs.ino » que vous pouvez ouvrir directement avec Arduino IDE.


Question 5 : Pourquoi faut-il impérativement utiliser des lignes de codes avec l’instruction : Motor.stop(MOTOR1); ?


Question 6 : Téléversez et tester ce code, est-ce que le fonctionnement est correct ? Utiliser le moniteur série pour tracer les différents états ? 

Relever quelques indications et recopier les sur votre copie (prenez 2-3 exemples).


Question 7 : Pourquoi la descente est-elle plus lente que la montée ? Comment corriger cela ? Indiquer votre démarche.


Question 8 : Est-ce que la gestion du bouton du paragraphe précédent est toujours fonctionnelle ?





Etape 3 : Test des moteurs avec les fins de course


Question 9 : Etablir un tableau qui liste les entrées/sorties du système barrière :



Entrée

Sortie

Bouton barrière

Exemple : 2

Exemple : 5

Led barrière



Fin de course haut



Compléter ici.....en ajoutant des lignes...




utilisez le code de la question 11 pour compléter le tableau


Question 10 : Expliquer le cheminement de l’algorigramme en parcourant l’ensemble des cas possibles. Utiliser un algorigramme pour vous aider.

Question 11 : Tester le code suivant, à quoi sert le boutonTP connecté sur la broche 7 ?


#include "Grove_I2C_Motor_Driver.h"


#define I2C_ADDRESS 0x0f        // adresse par défaut de l'I2C

const int boutonOuverture = 2;  // bouton demande ouverture

const int capteurPinFerme = 5;  // capteur haut

const int capteurPinOuvert = 4; // capteur bas

const int ledPin = 3;           // led

const int boutonTP = 7;         // bouton magique pour le TP


// variables will change:

int etatBoutonOuverture = 0;            // variable qui contient l'état du bouton d'ouverture

int etatCapteurOuvert = 0;      // variable qui contient l'état du capteurBas

int etatCapteurFerme = 0;       // variable qui contient l'état du capteurHaut

int etatBoutonTP = 0;           // variable qui contient l'état du bouton TP


void setup() {


    Serial.begin(9600);

    Serial.println("Début du programme");

    // put your setup code here, to run once:

    Motor.begin(I2C_ADDRESS);


    // initialize the LED pin as an output:

    pinMode(ledPin, OUTPUT);

    // initialize the pushbutton pin as an input:

    pinMode(capteurPinOuvert, INPUT);

    pinMode(capteurPinFerme, INPUT);

    pinMode(capteurPinFerme, INPUT);


    Serial.print("init");

    Serial.println(digitalRead(capteurPinFerme));

    etatBoutonOuverture = digitalRead(capteurPinFerme);

    //on ferme la barrière

    while(etatBoutonOuverture == HIGH){

       etatBoutonOuverture = digitalRead(capteurPinFerme);

       //Serial.println("On ferme");

       Motor.speed(MOTOR1,50);

    }

    Serial.println("Fin du capteur bas");

    // Stop one motor

    Motor.stop(MOTOR1);

    delay(500);      

    Serial.println("Fin du setup");

}


void gestionFermeture(){

      //gestion de la fermeture de la barrière

      digitalWrite(ledPin, HIGH);

      Serial.println("Avant On ferme");

      while(etatCapteurFerme == HIGH){

          etatCapteurFerme = digitalRead(capteurPinFerme);

          delay(100);

          Serial.println("On ferme");

          Serial.println(String(digitalRead(boutonOuverture)) + String(" ") + String(digitalRead(capteurPinOuvert)) + String(" ") + String(digitalRead(capteurPinFerme)));

          Motor.speed(MOTOR1,-60);

        }

      Motor.stop(MOTOR1);

      delay(10);

      digitalWrite(ledPin, LOW);

  }



void gestionOuverture(){

      //gestion de l'ouverture de la barrière

  }

 


          

void loop() {


    // on lit la demande d'ouverture de la barrière

    etatBoutonOuverture = digitalRead(boutonOuverture);

    etatCapteurOuvert = digitalRead(capteurPinOuvert);

    etatCapteurFerme = digitalRead(capteurPinFerme);

    etatBoutonTP = digitalRead(boutonTP);

    //trace pour comprendre les états des capteurs en temps réel    

    Serial.println(String(digitalRead(boutonOuverture)) + String(" ") + String(digitalRead(capteurPinOuvert)) + String(" ") + String(digitalRead(capteurPinFerme)));


    if ((etatBoutonOuverture == HIGH && etatCapteurOuvert == LOW)) {

          // on ferme/ouvre la barriere

          gestionFermeture();

    }

    else if ((etatBoutonOuverture == HIGH && etatCapteurFerme == LOW)){

        // on ferme/ouvre la barriere

          gestionOuverture();

    }

    else if(etatBoutonTP == HIGH){

      Motor.speed(MOTOR1,60);

    }

    else{

       Motor.stop(MOTOR1);

       //Serial.println("Ne rien faire");

       delay(10);

      }

    delay(10);

}


Le code source se trouve dans le fichier « 3_testComplet.ino » que vous pouvez ouvrir directement avec Arduino IDE.

Question 12 : Le programme permet de baisser la barrière mais pas de la remonter. En vous inspirant de la descente, écrivez la gestion de l’ouverture de la barrière. 

Question 13 : Mettre en œuvre la gestion de la descente de la barrière. Quel est votre protocole de test ?

Aide : Vous pouvez vous aider du boutonTP pour bien comprendre ce qui se passe à la montée.


Pour aller plus loin :


Etape 4 : Ajout d’un feu de signalisation

Lorsqu’il n’y a pas de demande de passage, le feu de signalisation est au rouge. Lorsque la barrière est ouverte, le feu passe au vert. Un appui sur le bouton refera passer le feu au rouge.

Question 14 : Câbler si besoin et modifier le programme précédent pour ajouter cette gestion de feu.

Créé avec HelpNDoc Personal Edition: Améliorez votre documentation d'aide avec un outil de création d'aide