Etiquetas: , ,

En este proyecto, vamos a crear una barrera automática utilizando un sensor de infrarrojos y un servomotor controlado por Arduino.

Objetivo

Utilizando un programa Arduino, vamos a hacer que la barrera automática suba cuando pase un objeto y baje cuando el paso esté libre.

Hardware

  • Ordenador
  • Arduino Nano
  • Escudo de expansión Nano
  • Sensor de infrarrojos GP2Y0A21
  • Cable USB A macho

Instalación del software Arduino

Si aún no lo has hecho, asegúrate de instalar el software Arduino en tu ordenador siguiendo este tutorial. Una vez instalado el software, puedes comprobar que la placa Arduino es reconocida por el ordenador.

Carga de código en el Arduino

Ahora vamos a comprobar que podemos subir código al Arduino Nano.

Para ello, abra un nuevo archivo Arduino.

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

}

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

}

En el menú «Herramientas», seleccione el tipo de tarjeta, procesador y puerto correspondiente a su tarjeta.

En este proyecto, estamos utilizando una placa Nano compatible con Arduino que ejecuta el controlador CH340 y utiliza el antiguo Bootloader.

Así que seleccionamos «Arduino Nano», procesador: «Old Bootloader» y el puerto utilizado. Aquí, «COM10».

arduino-empty-board-configuration-1 Creación de una barrera automática

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.

Diagrama

En este proyecto, vamos a conectar el sensor de infrarrojos al pin analógico A0 y el servomotor al pin 3. Como estamos utilizando un shield de expansión, las conexiones son fáciles de hacer. Asegúrate de comprobar la dirección de los pines para evitar dañar el hardware (SVG, señal S, V- tensión 5V, G- masa).

arduino-nano-exp-irsensor-servo Creación de una barrera automática

Código para probar el sensor

Para determinar la distancia del objeto al sensor a la que se levanta la barrera, vamos a probar el funcionamiento del sensor de infrarrojos. Cargue el siguiente código y, a continuación, mueva la mano delante del sensor para definir los valores del umbral de activación. Modifica los valores DETECT_VAL y CLEAR_VAL para obtener el comportamiento deseado.

//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;
}

Código para probar el actuador

Para averiguar las posiciones de subida y bajada de la barrera, vamos a probar el actuador. Enviaremos dos comandos al actuador, uno representando la posición «arriba» y otro la posición «abajo». Modifica los valores ARRIBA y ABAJO en función de la posición real observada.

//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);
}

Código automático de barrera

Vamos a combinar los dos códigos y hacer algunos cambios para conseguir el comportamiento deseado. Vamos a crear dos funciones, fenceDown() y fenceUp(). Una para bajar la barrera y otra para subirla. Cuando la variable ‘object’ (obstáculo detectado) sea verdadera (1-Verdadero) llamaremos a la función fenceUp() y cuando sea falsa (0-Falso) llamaremos a fenceDown() para bajar la barrera.

//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);
}

Próximos pasos

  • Añade un dispositivo de seguridad para que la barrera se levante cuando haya un objeto, aunque no haya terminado de bajar.
  • Añadir un semáforo a la barrera
  • Añada un lector de tarjetas RFID para abrir la barrera sólo con la tarjeta de identificación correcta

Fuentes