Práctica Dirigida 2

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