Étiquettes : , ,
0
(0)

Dans ce projet, nous allons réaliser un barrière automatique à l’aide d’un capteur infrarouge et d’un servomoteur qui seront gérés par Arduino.

Objectif

A l’aide d’un programme Arduino, nous allons faire en sorte que la barrière automatique se lève au passage d’un objet et se baisse lorsque le passage est dégagé.

Matériel

  • Ordinateur
  • Arduino Nano
  • Nano Expansion Shield
  • Capteur infrarouge GP2Y0A21
  • Câble USB A Mâle/ USB Mini B mâle

Installation du logiciel Arduino

Si ce n’est pas fait, veillez à installer le logiciel Arduino sur votre ordinateur en suivant ce tutoriel. Lorsque le logiciel est installé, vous pouvez vérifier que la carte Arduino est bien reconnue par l’ordinateur.

Téléverser un code dans l’Arduino

Nous allons à présent vérifier que nous pouvons téléverser un code dans l’Arduino Nano.

Pour cela, ouvrez un nouveau fichier Arduino.

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

}

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

}

Dans le menu « Outils », veuillez sélectionner le type de carte, le processeur et le port correspondant à votre carte.

Dans ce projet, nous utilisons une carte Nano compatible Arduino utilisant le driver CH340 et qui utilise l’ancien Bootloader.

Nous sélectionnons donc « Arduino Nano », processeur: « Old Bootloader » et le port utilisé. Ici, « COM10 »

Vous pouvez ensuite cliquer sur la flèche (->) en haut à gauche ou dans le menu « Croquis>Téléverser » pour charger le code sur la carte. Si le logiciel affiche « Téléversement terminé », c’est que tout fonctionne correctement.

Schéma

Dans ce projet nous allons brancher le capteur infrarouge sur la broche Analogique A0 et le servomoteur sur la broche 3. Comme nous utilisons un shield d’expansion, le branchage se fait facilement. Vérifier bien le sens des broches pour ne pas endommager le matériel (SVG, S-signal, V- tension 5V, G- masse)

Code pour tester le capteur

Afin de déterminer la distance de l’objet au capteur à laquelle la barrière se lève, nous allons tester le fonctionnement du capteur infrarouge. Chargez le code suivant, puis passez la main devant le capteur afin de définir les valeurs seuils de déclenchement. Modifiez les valeurs DETECT_VAL et CLEAR_VAL pour obtenir le comportement désiré.

//Parameters
#define DETECT_VAL 300
#define CLEAR_VAL 200

//Constants
const int gp2y0a21Pin  = A0;

//Variables
int gp2y0a21Val  = 0;
bool object=false,oldStatus=true;
String comment ="";

void setup() {
  //Init Serial USB
  Serial.begin(9600);
  Serial.println(F("Initialize System"));
  //Init ditance ir
  pinMode(gp2y0a21Pin, INPUT);
}

void loop() {
  readSensor();
  delay(500);
}

void readSensor() { /* function testGP2Y0A21 */
  ////Read distance sensor
  gp2y0a21Val = analogRead(gp2y0a21Pin);

  if (gp2y0a21Val > DETECT_VAL) {
    object=true;
    comment="Obstacle detected";
  } 
  if(gp2y0a21Val < CLEAR_VAL){
    object=false;
    comment="No obstacle";
  }

  if(oldStatus!=object){
    Serial.print(F("Valeur du capteur : "));Serial.print(gp2y0a21Val);
    Serial.print(F(" -> "));Serial.println(comment);
  }
  oldStatus=object;
}

Code pour tester le servomoteur

Afin de connaître les positions haute et basse de la barrière, nous allons tester le servomoteur. Nous allons envoyer deux commandes au servomoteur l’une représentant la position « levé » et l’autre la position « baissé ». Modifiez les valeurs HAUT et BAS en fonction de la position réelle observée.

//Librairie
#include <Servo.h>

//Déclaration des constantes
#define UPDATE_TIME 15
#define HAUT 180
#define BAS 90

//Déclaration des paramètres
int servoPin = 3;
//Déclaration des variables
Servo myServo;  // création d'un objet Servo

int pos=BAS;    // variable contenant la position du servomoteur

void setup() {
  Serial.begin(9600);
  myServo.attach(servoPin); 
}

void loop() {
  for (pos = BAS; pos <= HAUT; pos += 1) { 
    myServo.write(pos);              
    delay(UPDATE_TIME);                       
  }
  Serial.print(F("Servo position HAUT : "));Serial.println(HAUT);
  delay(500);
  for (pos = HAUT; pos >= BAS; pos -= 1) { 
    myServo.write(pos);             
    delay(UPDATE_TIME);                      
  }
  Serial.print(F("Servo position BAS : "));Serial.println(BAS);
  delay(500);
}

Code de la barrière automatique

Nous allons combiner les deux codes et apporter quelques modifications afin d’obtenir le comportement désiré. Nous allons créer deux fonctions fenceDown() et fenceUp(). L’une pour baisser la barrière et l’autre pour la lever. Lorsque la variable « objet » (obstacle détecté) est à true (1-Vrai) nous allons appeler la fonction fenceUp() et lorsqu’elle passe à false(0-Faux) nous allons appeler fenceDown() afin de baisser la barrière.

//Librairie
#include <Servo.h>

//Parameters
#define DETECT_VAL 300
#define CLEAR_VAL 200
#define UPDATE_TIME 15
#define HAUT 180
#define BAS 90

//Constants
const int gp2y0a21Pin  = A0;
const int servoPin = 3;

//Variables
int gp2y0a21Val  = 0;
bool object=false,oldStatus=true;
String comment ="";
int pos=BAS;    // variable contenant la position du servomoteur

Servo myServo;  // création d'un objet Servo

void setup() {
  //Init Serial USB
  Serial.begin(9600);
  Serial.println(F("Initialize System"));
  pinMode(gp2y0a21Pin, INPUT);
  myServo.attach(servoPin); 

}

void loop() {
  readSensor();
}

void readSensor() { /* function testGP2Y0A21 */
  ////Read distance sensor
  gp2y0a21Val = analogRead(gp2y0a21Pin);
  if (gp2y0a21Val > DETECT_VAL) {
    object=true;
    comment="Obstacle detected";
  } 
  if(gp2y0a21Val < CLEAR_VAL){
    object=false;
    comment="No obstacle";
  }

  if(oldStatus!=object){
    Serial.print(F("Valeur du capteur : "));Serial.print(gp2y0a21Val);
    Serial.print(F(" -> "));Serial.println(comment);
    if(object==true){
      fenceUp();
    }else{
      fenceDown();
    }
  }
  oldStatus=object;
}

void fenceUp(){
    for (pos = pos; pos <= HAUT; pos += 1) { 
    myServo.write(pos);              
    delay(UPDATE_TIME);                       
  }
  Serial.print(F("Servo position HAUT : "));Serial.println(HAUT);
}

void fenceDown(){
  for (pos = pos; pos >= BAS; pos -= 1) { 
    myServo.write(pos);             
    delay(UPDATE_TIME);                      
  }
  Serial.print(F("Servo position BAS : "));Serial.println(BAS);
}

Prochaines étapes

  • Ajouter une sécurité afin que la barrière se relève lorsqu’un objet est présent, même si elle n’a pas finit de se baisser
  • Ajouter un feu de circulation à la barrière
  • Ajouter un lecteur de carte RFID afin de n’ouvrir la barrière qu’avec le bon badge

Sources

How useful was this post?

Click on a star to rate it!

Average rating 0 / 5. Vote count: 0

No votes so far! Be the first to rate this post.

As you found this post useful...

Follow us on social media!

We are sorry that this post was not useful for you!

Let us improve this post!

Tell us how we can improve this post?