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».
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).
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