PUERTA AUTOMÁTICA
Vamos a crear el prototipo de una puerta automática que detecta a una persona en la entrada de un lugar, se divide el problema en 4 etapas donde necesitamos el bus principal donde se conectan los componentes, el sensor ultrasónico, el actuador piezo que nos da el sonido y por ultimo la pantalla LCD que reporta la distancia del sensor ultrasónico
Se necesita el arduino 1, la protoboard, el sensor ultrasonico, piezo, actuador , display o LCD y cables.
PRIMERA PARTE
Puerta automática - sensor ultrasónico
Se conectan cables para la polaridad positiva y negativa de la protoboard a la arduino 1, se conecta el sensor ultrasónico en la protoboard de tal manera que este direccionado donde no hayan cables que obstaculicen, este sensor tiene 4 contactos GND, Echo, Trig y Ucc. Se definen los pines 13 y 12 para enviar y recibir las ondas ultrasonicas el envio es el triger pin 13 y echo 12 para recibir.
Programación
int trig = 13;
int echo = 12;
float disCalculada;
void setup()
{
pinMode (trig, OUTPUT);
pinMode (echo, INPUT);
Serial.begin (9600);
}
void loop()
{
disCalculada = calcularDistancia();
Serial.println("---------------");
Serial.print("cm :");
Serial.println (disCalculada);
delay(200);
}
int calcularDistancia()
{
long distancia;
long duracion;
digitalWrite (trig, LOW);
delayMicroseconds (4);
digitalWrite (trig, HIGH);
delayMicroseconds (10);
digitalWrite (trig, LOW);
duracion = pulseIn (echo, HIGH);
duracion = duracion/2;
distancia = duracion/29;
return distancia;
}
SEGUNDA PARTE
Puerta automática-piezo
Para su construcción uno de los terminales va al bus en su parte negativa y la parte positiva va direccionada al pin 2 de la tarjeta arduino.
Programa
Se continua el mismo código y se le agrega otras lineas para que sea capaz de tomar decisiones con base en la distancia.
#include <Servo.h>
Servo servo1;
int puertoservo = 3;
int trig = 13;
int echo = 12;
int piezo = 2; variable del pin piezo
int grados;
int tmp = 0;
int pulsominimo = 650;
int pulsomaximo = 2550;
float disCalculada;
void setup()
{
servo1.attach (puertoservo,pulsominimo, pulsomaximo);
pinMode (trig, OUTPUT);
pinMode (echo, INPUT);
pinMode (piezo, OUTPUT); //se pone el piezo en modo de salida
Serial.begin (9600);
}
void loop()
{
disCalculada = calcularDistancia();
grados=servo1.read();
Serial.print("Grados : ");
Serial.println (grados);
delay(200);
Serial.println("---------------");
Serial.print("cm :");
Serial.println (disCalculada);
delay(200);
if (disCalculada < 100) //se agrega lógica computacional con la condicional IF que comparara si la distancia es menor a 100 y con base en eso activara el tono del piezo
{
tmp=100;
tone (piezo, 600,100);
}
else // sino cumple no se ejecuta la acción
{
tmp=0;
}
delay (10);
servo1.write (tmp);
}
int calcularDistancia()
{
long distancia;
long duracion;
digitalWrite (trig, LOW);
delayMicroseconds (4);
digitalWrite (trig, HIGH);
delayMicroseconds (10);
digitalWrite (trig, LOW);
duracion = pulseIn (echo, HIGH);
duracion = duracion/2;
distancia = duracion/29;
return distancia;
}
TERCERA PARTE
Puerta automática, servomotor
Este nos ayudara a abrir la puerta automática, empleando un servomotor conectado a los polos negativo y positivo de la protoboard. Y las instrucciones seran enviadas por un cable concetado al pin 3.
Programa
Continuamos con el mismo y le incluimos lo siguiente
Servo servo1;
int puertoservo = 3; // puerto del servo
int trig = 13;
int echo = 12;
int piezo = 2;
int grados; // guarda los grados del angulo del giro del servo
int tmp = 0; // variable temporal que se usa en la condicional
int pulsominimo = 650; // variable para el angulo menor del servo
int pulsomaximo = 2550; // variable para el angulo mayor del servo
float disCalculada;
void setup()
{
servo1.attach (puertoservo,pulsominimo, pulsomaximo); // se indica el pin y el angulo menor y mayor a usar
pinMode (trig, OUTPUT);
pinMode (echo, INPUT);
pinMode (piezo, OUTPUT);
Serial.begin (9600);
}
void loop()
{
disCalculada = calcularDistancia();
grados=servo1.read();guarda en la variable el valor del gir del servo en grados
Serial.print("Grados : ");
Serial.println (grados);
delay(200);
Serial.println("---------------");
Serial.print("cm :");
Serial.println (disCalculada);
delay(200);
if (disCalculada < 100)
{
tmp=100;
tone (piezo, 600,100);
}
else
{
tmp=0;
}
delay (10);
servo1.write (tmp);
}
int calcularDistancia()
{
long distancia;
long duracion;
digitalWrite (trig, LOW);
delayMicroseconds (4);
digitalWrite (trig, HIGH);
delayMicroseconds (10);
digitalWrite (trig, LOW);
duracion = pulseIn (echo, HIGH);
duracion = duracion/2;
distancia = duracion/29;
return distancia;
}
CUARTA PARTE
Puerta automática LCD
Para mostrar valores por medio de la pantalla LCD, es importante tener en cuenta para hacer el circuito que la pantalla tiene dos partes una es para la alimentación eléctrica, esta se conecta al bus de la protoboard y la segunda parte es la comunicación y se necesita 6 conexiones a terminales desde el pin 4 hasta el pin 9 en la tarjeta de arduino 1 y en la pantalla LCD del pin 5 al 10.
Programa
Se continua con lo ya existente y se agrega lo siguiente:
#include <LiquidCrystal.h> // s agrega libreria
#include <Servo.h>
Servo servo1;
LiquidCrystal lcd(8,9,4,5,6,7); // se indican pin de conexion
int v=-1;
int puertoservo =3;
int trig = 13;
int echo = 12;
int piezo = 2;
int pulsominimo=650;
int pulsomaximo=2550;
int tmp=0;
int grados;
float disCalculada;
void setup()
{
lcd.setCursor(4,1); se define la posición de la fila
lcd.print("PRONIE");
lcd.noBlink(); // indica que no paradee
delay(2000);
servo1.attach (puertoservo,pulsominimo, pulsomaximo);
pinMode (trig, OUTPUT);
pinMode (echo, INPUT);
pinMode (piezo, OUTPUT);
pinMode (pinVerde, OUTPUT);
Serial.begin (9600);
}
void loop()
{
disCalculada = calcularDistancia ();
grados=servo1.read();
Serial.print("Grados :");
Serial.println (grados);
delay(200);
Serial.println("--------");
Serial.print("cm :");
Serial.println (disCalculada);
delay(200);
if (disCalculada < 100)
{
tmp=90+10;
}
else
{
tmp=0-10;
}
delay (10);
servo1.write (tmp);
lcd.setCursor(1,1); // posicion de la linea
lcd.print("Distancia "); // palabra que va aparecer
lcd.println(disCalculada); // imprime resultado del calculo de la variable que es la distancia (pasa al siguiente renglon)}
int calcularDistancia()
{
long distancia;
long duracion;
digitalWrite (trig, LOW);
delayMicroseconds (4);
digitalWrite (trig, HIGH);
delayMicroseconds (10);
digitalWrite (trig, LOW);
duracion = pulseIn (echo, HIGH);
duracion = duracion/2;
distancia = duracion/29;
return distancia;
}
VIDEO DE LA PRACTICA DIRIGIDA 2
RETO 2
El reto es el siguiente: Modificar la melodía del ejemplo por otra conocida y encender un led cada vez que se abren las puertas.
Programa
Se utilizo el mismo programa y se le agrego lo siguente para cumplir con el reto
#include <LiquidCrystal.h>
#include <Servo.h>
Servo servo1;
LiquidCrystal lcd(8,9,4,5,6,7);
int pinVerde = 10; Indica pin de conexion del led
int v=-1;
int puertoservo =3;
int trig = 13;
int echo = 12;
int piezo = 2;
int pulsominimo=650;
int pulsomaximo=2550;
int tmp=0;
int grados;
float disCalculada;
void setup()
{
lcd.setCursor(4,1);
lcd.print("PRONIE");
lcd.noBlink();
delay(2000);
servo1.attach (puertoservo,pulsominimo, pulsomaximo);
pinMode (trig, OUTPUT);
pinMode (echo, INPUT);
pinMode (piezo, OUTPUT);
pinMode (pinVerde, OUTPUT); //se define como salida
Serial.begin (9600);
}
void loop()
{
disCalculada = calcularDistancia ();
grados=servo1.read();
Serial.print("Grados :");
Serial.println (grados);
delay(200);
Serial.println("--------");
Serial.print("cm :");
Serial.println (disCalculada);
delay(200);
if (disCalculada < 100)
{
tmp=90+10;
delay (500);
tone (piezo, 330,200); //melodía que se activara
delay (100);
tone (piezo, 450,150);
delay (100);
tone (piezo, 400,200);
delay (50);
tone (piezo, 150, 200);
delay (50);
digitalWrite (pinVerde, HIGH); //led encencido al abrir la puerta
}
else
{
tmp=0-10;
digitalWrite (pinVerde, LOW); // led se apaga cuando se cierra
}
delay (10);
servo1.write (tmp);
lcd.setCursor(1,1);
lcd.print("Distancia ");
lcd.println(disCalculada);
}
int calcularDistancia()
{
long distancia;
long duracion;
digitalWrite (trig, LOW);
delayMicroseconds (4);
digitalWrite (trig, HIGH);
delayMicroseconds (10);
digitalWrite (trig, LOW);
duracion = pulseIn (echo, HIGH);
duracion = duracion/2;
distancia = duracion/29;
return distancia;
}
VIDEO DEL RETO 2






No hay comentarios:
Publicar un comentario