Puerta Automática
Dispositivos utilizados:
- Sensor Ultrasonico
- Piezo
- Servomotor
- Pantalla LCD
Descripción del Prototipo:
La práctica dirigida consiste en simular una puerta automática, que cuando el sensor ultrasonico detecta un objeto a una distancia determinada en este caso menor a 10cm active un sonido a través del piezo, el servo motor actúa simulando que abre una puerta y este al no detectar ningún objeto a la distancia programada, este simule que cierra la puerta, el piezo apaga el sonido y la pantalla LCD muestra los valores detectados según la distancia del objeto. stancia que ha capturado el sensor ultrasonico.
Vídeo demostrativo:
Código de la Práctica dirigida 2
#include <LiquidCrystal.h>
LiquidCrystal lcd(8,9,4,5,6,7); //Define los pines en la tarjeta de arduino que controlan la LCD.
#include <Servo.h>
Servo servo1; //Se declara una variable para usar el servomotor. Constructor de la sentencia servo.
int puertoservo1 = 3; //se define la variable que envia datos al servo.
int trig = 13; //declaración de variable que indica que el pin 13 envia una onda ultrasonica.
int echo = 12; //declara que la variable echo recibe las ondas que rebotan en el objeto.
int piezo =2; //variable del pin piezo.
int grados; //variable para guardar los grados de ángulo del servo.
int tmp=0; //variable tipo temporal para usar en la condicional.
int pulsominimo=650; //variable que define el ángulo menor del servo.
int pulsomaximo=2550; //variable que define el ángulo mayor del servo.
float disCalculada; //es una variable flotante que guarda el valor de la distancia.
void setup() {
lcd.setCursor (4,1); //Define la posición de la linea en la pantalla. ubicandose en la posición 4 de la fila uno en la pantalla.
lcd.print ("PRONIE"); //muestra la palabra PRONIE en la posición anterior en la pantalla LCD.
lcd.noBlink(); //indica al LCD que no parpadee.
delay(2000); //espera 2 segundos.
//-----------
servo1.attach (puertoservo1, pulsominimo, pulsomaximo); //indica al servomotor por cual pin se va a comunicar y cual es su ángulo > o < .
//-----------
pinMode (trig, OUTPUT); //Pin 13 como un elemento de salida.
pinMode (echo, INPUT); //Pin 12 que actua como un elemento de entrada.
pinMode (piezo, OUTPUT); //El pin 2 donde está conectado el piezo se establece en modo de salida.
//-----------
Serial.begin (9600); // Activa el monitor serial en 9600 para ver los valores.
}
void loop() {
disCalculada = calcularDistancia (); //Se asigna a la variable flotante disCalculada el valor obtenido por la función calcularDistancia.
grados=servo1.read(); //guarda la lectura del ángulo que reporta el servomotor.
Serial.print ("Grados: "); //Muestra la palabra grados.
Serial.println (grados); //Muestra el valor del ángulo.
delay (200); //espera dos milisegundos.
Serial.println ("------"); //Divide la lectura de la información.
Serial.print ("cm :"); //Muestra las palabras que estan entre comillas y dentro del parentesis en la misma línea.
Serial.println (disCalculada); //Muestra el valor de la variable
delay (200); //espera dos milisegundos.
if (disCalculada<10) // condiciona la variable disCalculada donde si esta es menor a 10 activa el sonido
{
tmp=100; //guarda en la variable temporal el número del ángulo de 100 grados, (es decir se le asigna un valor de 100)
tone (piezo, 600, 100); //activa un tono del piezo al cumplirse la condición del "si"
}
else //sino
{ // no se ejecuta ninguna instrucción sino cumple la condición.
tmp=0; //si la función no se cumple se cambia el valor de la variable temporal a cero.
}
delay (10); //espera 10 milisegundos.
servo1.write(tmp); //se indica al servomotor que gire la cantidad de grados que tiene la variable temporal guardada.
//programación de la pantalla.
lcd.setCursor(1,1);//Posiciona el cursor en la primera fila y en la primera columna, posición1.
lcd.print("Distancia");//Muestra la palabra distancia.
lcd.println (disCalculada);//muestra el valor de la variable en la pantalla.
}
int calcularDistancia () //Función que calcula la distancia y devuelve un valor. (cuando se declara funciones no terminan con ";").
{
long distancia; //declara la variable distancia.
long duracion; //declara la variable duración.
digitalWrite (trig, LOW); //establece un valor del pin en apagado.
delayMicroseconds (4); //espera 4 microsegundos.
digitalWrite (trig, HIGH);// establece un valor del pin en encendido.
delayMicroseconds (10); //espera 10 microsegundos
digitalWrite (trig, LOW);// establece un valor del pin apagado.
duracion=pulseIn (echo, HIGH);//recibe el valor del pulso que recibe.
duracion = duracion/2; // y este lo divide
distancia = duracion/29; //
return distancia; // devuelve el valor obtendio de calcular la distancia
}
---------------------------------------------------------------------------------
Solución del Reto2
Código utilizado en el reto2
#include <LiquidCrystal.h>
LiquidCrystal lcd(8,9,4,5,6,7); //Define los pines en la tarjeta de arduino que controlan la LCD.
#include <Servo.h>
Servo servo1; //Se declara una variable para usar el servomotor. Constructor de la sentencia servo.
int puertoservo1 = 3; //se define la variable que envia datos al servo.
int trig = 13; //declaración de variable que indica que el pin 13 envia una onda ultrasonica.
int echo = 12; //declara que la variable echo recibe las ondas que rebotan en el objeto.
int piezo =2; //variable del pin piezo.
int grados; //variable para guardar los grados de ángulo del servo.
int pulsominimo=650; //variable que define el ángulo menor del servo.
int pulsomaximo=2550; //variable que define el ángulo mayor del servo.
float disCalculada; //es una variable flotante que guarda el valor de la distancia.
void setup() {
lcd.setCursor (4,1); //Define la posición de la linea en la pantalla. ubicandose en la posición 4 de la fila uno en la pantalla.
lcd.print ("PRONIE"); //muestra la palabra PRONIE en la posición anterior en la pantalla LCD.
lcd.noBlink(); //indica al LCD que no parpadee.
delay(2000); //espera 2 segundos.
//-----------
servo1.attach (puertoservo1, pulsominimo, pulsomaximo); //indica al servomotor por cual pin se va a comunicar y cual es su ángulo > o < .
//-----------
pinMode (trig, OUTPUT); //Pin 13 como un elemento de salida.
pinMode (echo, INPUT); //Pin 12 que actua como un elemento de entrada.
pinMode (piezo, OUTPUT); //El pin 2 donde está conectado el piezo se establece en modo de salida.
//-----------
Serial.begin (9600); // Activa el monitor serial en 9600 para ver los valores.
}
void loop() {
disCalculada = calcularDistancia (); //Se asigna a la variable flotante disCalculada el valor obtenido por la función calcularDistancia.
grados=servo1.read(); //guarda la lectura del ángulo que reporta el servomotor.
Serial.print ("Grados: "); //Muestra la palabra grados.
Serial.println (grados); //Muestra el valor del ángulo.
delay (200); //espera dos milisegundos.
Serial.println ("------"); //Divide la lectura de la información.
Serial.print ("cm :"); //Muestra las palabras que estan entre comillas y dentro del parentesis en la misma línea.
Serial.println (disCalculada); //Muestra el valor de la variable
delay (200); //espera dos milisegundos.
if (disCalculada<10) // condiciona la variable disCalculada donde si esta es menor a 10 activa el sonido
{
servo1.write(100); //guarda en la variable temporal el número del ángulo de 100 grados, (es decir se le asigna un valor de 100)
melodia (); //llama a la función melodía.
}
else //sino
{ // no se ejecuta ninguna instrucción sino cumple la condición.
servo1.write(0); //si la función no se cumple se cambia el valor a cero.
}
delay (10); //espera 10 milisegundos.
//se indica al servomotor que gire la cantidad de grados que tiene la variable temporal guardada.
//programación de la pantalla.
lcd.setCursor(1,1);//Posiciona el cursor en la primera fila y en la primera columna, posición1.
lcd.print("Distancia");//Muestra la palabra distancia.
lcd.println (disCalculada);//muestra el valor de la variable en la pantalla.
}
int calcularDistancia () //Función que calcula la distancia y devuelve un valor. (cuando se declara funciones no terminan con ";").
{
long distancia; //declara la variable distancia.
long duracion; //declara la variable duración.
digitalWrite (trig, LOW); //establece un valor del pin en apagado.
delayMicroseconds (4); //espera 4 microsegundos.
digitalWrite (trig, HIGH);// establece un valor del pin en encendido.
delayMicroseconds (10); //espera 10 microsegundos
digitalWrite (trig, LOW);// establece un valor del pin apagado.
duracion=pulseIn (echo, HIGH);//recibe el valor del pulso que recibe.
duracion = duracion/2; // y este lo divide
distancia = duracion/29; //
return distancia; // devuelve el valor obtendio de calcular la distancia
}
void melodia() //"Melodía piratas del caribe".
{
tone(piezo,293.66,200);
tone(piezo,440,100);
delay(100);
tone(piezo,523.25,100);
delay(100);
tone(piezo,587.33,100);
delay(200);
tone(piezo,587.33,100);
delay(200);
tone(piezo,587.33,100);
delay(100);
tone(piezo,659.25,100);
delay(100);
tone(piezo,698.45,100);
delay(200);
tone(piezo,698.45,100);
delay(200);
tone(piezo,698.45,100);
delay(100);
tone(piezo,783.99,100);
delay(100);
tone(piezo,659.25,100);
delay(200);
tone(piezo,659.25,100);
delay(200);
tone(piezo,587.33,100);
delay(100);
tone(piezo,523.25,100);
delay(100);
tone(piezo,523.25,100);
delay(100);
tone(piezo,587.33,100);
delay(300);
tone(piezo,440,100);
delay(100);
tone(piezo,523.25,100);
delay(100);
tone(piezo,587.33,100);
delay(200);
tone(piezo,587.33,100);
delay(200);
tone(piezo,587.33,100);
delay(100);
tone(piezo,659.25,100);
delay(100);
tone(piezo,698.45,100);
delay(200);
tone(piezo,698.45,100);
delay(200);
tone(piezo,698.45,100);
delay(100);
tone(piezo,783.99,100);
delay(100);
tone(piezo,659.25,100);
delay(200);
tone(piezo,659.25,100);
delay(200);
tone(piezo,587.33,100);
delay(100);
tone(piezo,523.25,100);
delay(100);
tone(piezo,587.33,100);
delay(400);
tone(piezo,440,100);
delay(100);
tone(piezo,523.25,100);
delay(100);
tone(piezo,587.33,100);
delay(200);
tone(piezo,587.33,100);
delay(200);
tone(piezo,587.33,100);
delay(100);
tone(piezo,698.45,100);
delay(100);
tone(piezo,783.99,100);
delay(200);
tone(piezo,783.99,100);
delay(200);
tone(piezo,783.99,100);
delay(100);
tone(piezo,880,100);
delay(100);
tone(piezo,932.33,100);
delay(200);
tone(piezo,932.33,100);
delay(200);
tone(piezo,880,100);
delay(100);
tone(piezo,783.99,100);
delay(100);
tone(piezo,880,100);
delay(100);
tone(piezo,587.33,100);
delay(300);
tone(piezo,587.33,100);
delay(100);
tone(piezo,659.25,100);
delay(100);
tone(piezo,698.45,100);
delay(200);
tone(piezo,698.45,100);
delay(200);
tone(piezo,783.99,100);
delay(200);
tone(piezo,880,100);
delay(100);
tone(piezo,587.33,100);
delay(300);
tone(piezo,587.33,100);
delay(100);
tone(piezo,698.45,100);
delay(100);
tone(piezo,659.25,100);
delay(200);
tone(piezo,659.25,100);
delay(200);
tone(piezo,698.45,100);
delay(100);
tone(piezo,587.33,100);
delay(100);
tone(piezo,659.25,100);
delay(400);
tone(piezo,880,100);
}
Problemas Técnicos:
1- Sintaxis Uno de los problemas presentados en esta unidad fue que olvidaba agregar algún (;) o hacía falta una llave ( { } ).
- Solución: Hacer revisión del procedimiento realizado e ir uniendo el inicio y final de las llaves hasta detectar el problema y agregar o eliminar según fuera el procedimiento los punto y coma en la sintaxis de la programación.
2- Detección de la distancia con el sensor ultrasónico
- Solución: Con el apoyo de la compañera Melissa, resolví el problema, ya que el sensor ultrasónico se activaba de forma constante, porque la distancia programada activaba el piezo, y para ello lo que se hizo fue bajar la distancia reportada en a sintaxis para que no estuviera tan sensible y de ese modo no se activara tantas veces las otras funciones programadas. Quedando el problema solucionado.
No hay comentarios:
Publicar un comentario