fbpixel
Creación de una barrera automática

Creación de una barrera automática

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

Fuentes

Uso de un interruptor basculante con Arduino

Uso de un interruptor basculante con Arduino

Un interruptor de inclinación sirve para detectar la orientación o inclinación de un sistema. Suele utilizarse para indicar si un sistema (como un vehículo agrícola) está fuera de su rango de inclinación operativo, o para detectar la orientación de una pantalla y cambiar así su disposición. No da tanta información como un acelerómetro, pero es más robusto y no requiere un programa especial para procesarlo.

Material

  • Ordenador
  • Arduino UNO
  • Cable USB A macho
  • Interruptor de inclinación

Cómo funciona

El interruptor basculante (interruptor de inclinación o inclinación de bola o sensor de mercurio) consta de una bola (o una masa de mercurio) y un contactor. Cuando cambia la orientación con respecto al horizonte, la bola, sometida a la gravedad, se desplaza y entra en contacto con dos polos. Esto cortocircuita los polos y cierra el interruptor.

Esquema

El interruptor basculante se conecta, como un pulsador, preferiblemente a un pin digital del microcontrolador porque devuelve un estado alto o bajo, cerrado o abierto.

  • Conectando la masa y un pin digital (aquí pin 2)
  • Utilizar una resistencia de pull-up externa (si el microcontrolador o el pin utilizado no tienen un pull-up interno).

Código

El sensor de inclinación funciona como un interruptor. Por tanto, el código de funcionamiento del sensor se parecerá mucho al de un pulsador. Es bueno tener en cuenta que, por lo general, una bola hace el contacto y cierra el interruptor. Sucede que esta bola rebota cuando cambia el estado. Para no tener en cuenta estos rebotes parásitos, utilizamos una lógica anti-rebote.

//Parameters
const int tiltPin = 2;

//Variables
bool tiltStatus = false;
bool oldTiltStatus = false;
unsigned long lastDebounceTime = 0;
unsigned long debounceDelay = 50;

void setup() {
  //Init Serial USB
  Serial.begin(9600);
  Serial.println(F("Initialize System"));
  //Init digital input
  pinMode(tiltPin, INPUT);
}

void loop() {
  debounceTilt();
}

void debounceTilt( ) { /* function debounceTilt */
  ////debounce TiltSwitch
  int reading = digitalRead(tiltPin);
  if (reading != oldTiltStatus) {
    lastDebounceTime = millis();
  }
  if ((millis() - lastDebounceTime) > debounceDelay) {
    if (reading != tiltStatus) {
      tiltStatus = reading;
      Serial.print(F("Sensor state : ")); Serial.println(tiltStatus);
    }
  }
  oldTiltStatus = reading;
}

Resultados

Al inclinar el sensor de bola, debería ver su cambio de estado en el monitor serie. Haciendo varias pruebas, deberías ser capaz de ajustar el parámetro debounceDelay para asegurar que la lectura del estado es fiable.

Aplicaciones

  • Detección de la orientación de un objeto

Fuentes

Uso de un sensor de nivel de agua con Arduino

Uso de un sensor de nivel de agua con Arduino

El sensor de nivel de agua está diseñado para detectar el agua, puede ser ampliamente utilizado para detectar la precipitación, el nivel de agua en una cavidad, o incluso la fuga de líquido. El sensor se compone principalmente de tres partes: un conector electrónico, una resistencia de 1 MΩ y varias líneas de cable desnudo.

Material

  • Ordenador
  • Arduino UNO
  • Cable USB A Macho/B Macho
  • Sensor de nivel de agua

Cómo funciona

El sensor de nivel de agua funciona mediante una serie de trazos de cobre conectados a tierra intercalados con trazos de detección. Estas trazas funcionan como una resistencia variable. La presencia de agua en el sensor provoca un cortocircuito entre estas trazas, lo que permite detectar su presencia. Convierte el nivel de agua en una salida analógica que puede ser procesada directamente por un microcontrolador. El valor de la señal depende del nivel de inmersión del sensor.

Esquema

El sensor de nivel de agua tiene 3 pines:

  • GND la tierra conectada a la tierra del Arduino
  • Vcc la alimentación conectada a los 5V del Arduino (funciona con una alimentación entre 2 y 5V)
  • La salida analógica S, conectada a un pin analógico del Arduino

Código

El sensor de nivel de agua es analógico. Por lo tanto, es posible leer el valor del sensor desde una entrada analógica del Arduino utilizando la función analogRead().

void setup()
{
  Serial.begin(9600);
}

void loop() {
  Serial.print("Water level Sensor Value:");
  Serial.println(analogRead(A0))
  delay(100);
}

Resultados

Al sumergir el sensor en un vaso de agua, podrá ver el cambio del valor del sensor en el monitor de serie. Una vez implementado el código, puede calibrar su sensor con el agua que desea detectar. Esto le dará los valores de umbral para si el sensor está al aire libre, parcial o totalmente sumergido.

Aplicaciones

  • Crear un sistema de riego automático mediante un sensor de nivel y una bomba de agua
  • Desarrollar un sistema de alerta de inundaciones

Fuentes

Uso de un sensor de llama con Arduino

Uso de un sensor de llama con Arduino

El módulo sensor de llama KY-026 permite la detección de llamas mediante un receptor de infrarrojos que captará las emisiones de luz de las fuentes de calor.

Este tutorial es aplicable a todas las placas compatibles con Arduino.

Material

  • Ordenador
  • Arduino UNO
  • Cable USB A Macho/B Macho
  • Sensor de llama KY-026

Cómo funciona

Cualquier fuente de calor (por encima de 0Kelvin) emite luz infrarroja. El módulo de detección de llamas KY-026 para Arduino mide la intensidad de la luz infrarroja emitida por el fuego en un rango de longitud de onda de 760 a 1100 nm. El módulo tiene salidas digitales y analógicas y un potenciómetro para ajustar la sensibilidad. Se utiliza habitualmente en los sistemas de detección de incendios.

Esquema

Conectaremos la salida analógica al pin A0 del Arduino y la salida digital al pin 2. El sensor puede ser alimentado por la salida de 5V del Arduino.

Código

En el código de gestión del sensor de llama, leeremos la salida digital del sensor y encenderemos el LED de la placa si su estado es ALTO. También leeremos el valor analógico y lo mostraremos en el monitor de serie.

const int ledPin = 13;
const int digitalPin = 2;
const int analogPin = A0;

int digitalVal;
int analogVal; 

void setup(){
  Serial.begin(9600);
  
  pinMode(ledPin, OUTPUT);
  pinMode(digitalPin, INPUT);
  
  Serial.println(F("Flame Sensor Initialized"));
}

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

void readFlameSensor(){
    // Read the digital interface
  digitalVal = digitalRead(digitalPin);
  if (digitalVal == HIGH){
    digitalWrite(ledPin, HIGH);
    Serial.println(F("    -> Flame detected"));
  }else{
    digitalWrite(ledPin, LOW); 
  }

  // Read the analog interface
  analogVal = analogRead(analogPin);
  Serial.print(F("Sensor Value"));Serial.println(analogVal);
}

Resultados

Si se acerca la llama de un mechero al sensor, se debería ver el estado del sensor y el cambio de medición en el monitor de serie.

Aplicaciones

  • Combina este sensor con una sirena para crear una alarma de incendio

Fuentes

Retrouvez nos tutoriels et d’autres exemples dans notre générateur automatique de code
La Programmerie

Uso de un sensor de efecto Hall con Arduino

Uso de un sensor de efecto Hall con Arduino

El sensor magnético lineal de efecto Hall KY-024 reacciona en presencia de un campo magnético. Está equipado con un potenciómetro para ajustar la sensibilidad del sensor y proporciona dos salidas analógicas y digitales.

Material

  • Ordenador
  • Arduino UNO
  • Cable USB A Macho/B Macho
  • Módulo de sensor Hall KY-024

Principio de funcionamiento

El módulo KY-024 consta de un sensor lineal de efecto Hall SS49E y un comparador diferencial doble LM393, un potenciómetro BOCHEN 3296). El comparador acoplado al potenciómetro permite comparar el valor del sensor con un valor umbral para utilizar el sensor como un sensor de todo o nada. Hay dos leds en el módulo. El led1 indica que el sensor recibe tensión y el led2 indica que se detecta un campo magnético.

Esquema

El sensor Hall tiene una salida analógica y otra digital. La salida analógica devuelve una imagen de la medición y la salida digital devuelve un estado alto o bajo en función del umbral dado por el potenciómetro. Puede utilizar uno u otro dependiendo de su aplicación. El módulo puede ser alimentado por la salida de 5V del microcontrolador.

Código

Para probar el sensor, leeremos la salida digital y mostraremos la salida analógica. Para ello utilizamos las funciones analogRead y digitalRead.

//initiation des pins
int ledPin = 13; //pin pour la LED
int digitalPin = 2; //pin pour le capteur
int analogPin = A0; //pin pour le capteur
int digitalVal;
int analogVal;


void setup()
{
  Serial.begin(9600); // vitesse de transmission
  pinMode(ledPin, OUTPUT); //la pin est en sortie
  pinMode(digitalPin, INPUT); //la pin est en entrée
}

void loop()
{
  digitalVal = digitalRead(digitalPin);
  if (digitalVal == HIGH) //condition "si" : la valeur numérique est au niveau haut
  {
    digitalWrite(ledPin, HIGH); //alors la led s'allume
  }
  else
  {
    digitalWrite(ledPin, LOW); // sinon la led s'éteint ou reste éteinte
  }
  analogVal = analogRead(analogPin);
  Serial.println(analogVal); //afficher la valeur analogique
  delay(100); //délai 100ms
}

Para pasar el valor analógico a un valor físico, puede utilizar la función map()

//transforme la valeur de 0 à 1023 vers 0 à 5V
int volt=map(analogVal, 0, 1023, 0, 5);

//transforme la valeur lue en Gauss
int gss = map(volt, 1, 4, -1000, 1000);

Resultado

Si acercas y alejas un imán del sensor, deberías ver cómo se enciende y apaga el LED y cómo cambia el valor del sensor.

Aplicaciones

  • Construye un medidor de Gauss para hacer mediciones de campos magnéticos.

Fuentes