Práctica Dirigida 2

La práctica dirigida 2 consiste en realizar un prototipo utilizando la tarjeta arduino uno que simule la función de una puerta automática la cual permite activarse cuando detectan a una persona en la entrada. La programación se realizará en cuatro partes.

1. Programación del sensor ultrasónico:


En esta parte se programara el sensor ultrasónico, que permite medir distancias mediante el uso de ondas ultrasónicas. La programación utilizada es la siguiente:

int trig = 13;          //variable, envía una onda ultrasonica atravez del disparador
int echo = 12;          // variable, recibe las ondas que rebotan en el objeto
float disCalculada;      // variable, guarda el valor de la distancia


void setup() {
  pinMode (trig, OUTPUT);     //pin 13 de salida
  pinMode (echo, INPUT);      // pin 12 de entrada
  Serial.begin (9600);        // activa al monitr serial
 }

void loop() 
{                                        // procedimiento que calcula y procesa los datos y luego los muestra en el monitor serial
  disCalculada = calcularDistancia ();
  Serial.println ("----------");
  Serial.print ("cm :");
  Serial.println (disCalculada);
  delay (200);

}

int calcularDistancia ()       // función que calcula la distancia y devuelve un valor
{
  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 = distancia/29;
  return distancia;

}




2. Programación del piezo:


En esta parte se agrega un piezo o parlante al prototipo iniciado anteriormente, el piezo permite que emita un sonido cuando hay algo cerca. La programación es la siguiente:

int trig = 13;
int echo = 12;
int piezo = 2;         //variable para el parlante en el pin 2
float disCalculada;


void setup() {
  
  pinMode (trig, OUTPUT);
  pinMode (echo, INPUT);
  pinMode (piezo, OUTPUT);   // establece el piezo en modo de salida
  Serial.begin (9600);
}

void loop() {
  disCalculada = calcularDistancia ();
  Serial.println ("-----");
  Serial.print ("cm: ");
  Serial.print (disCalculada);
  delay (200);
  
  if (disCalculada < 100)         // condición que compara si el valor de la distancia es menor a 100 
  { 
    tone (piezo, 600, 100);      // tono que emitirá el piezo
  }
  else 
  {            // ninguna instrucción po el momento
  } 
  delay (10);
 }

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;
  
}



3. Programación del servo motor:


Para simular la forma en que abre la puerta automática se agrega un servomotor, este actuador se activará cuando haya algo cerca. La programación utilizada es la siguiente:

#include <Servo.h>         //librería del servo

Servo servo1;         //constructor de la senencia servo
int puertoservo = 3;   //variable para mandar datos al servo
int grados;            //variable para guardar los grados del servo
int tmp = 0;           //variable temporal para usar en la condicional
int pulsominimo = 650;  //define el ángulo menor del servo
int pulsomaximo = 2550;   //define el ángulo mayor del servo
int trig = 13;            //variable, envía una onda ultrasonica atravez del disparador
int echo = 12;          // variable, recibe las ondas que rebotan en el objeto
int piezo = 2;         //variable para el parlante en el pin 2
float disCalculada;    // variable, guarda el valor de la distancia


void setup() {
  servo1.attach (puertoservo, pulsominimo, pulsomaximo);   //indica al servomotor por cual pin se comunica y cuál es su ángulo mayor y menor
  pinMode (trig, OUTPUT);     //pin 13 de salida
  pinMode (echo, INPUT);      // pin 12 de entrada
  pinMode (piezo, OUTPUT);   // establece el piezo en modo de salida
  Serial.begin (9600);      //activa el monitor serial
}

void loop() {           // procedimiento que calcula y procesa los datos y luego los muestra en el monitor serial
  disCalculada = calcularDistancia ();
  grados = servo1.read ();         //guarda la lectura del ángulo que reporta el servomotor
  Serial.print ("Grados: ");
  Serial.print (grados);
  delay (200);
  Serial.println ("-----");
  Serial.print ("cm: ");
  Serial.print (disCalculada);
  delay (200);
  
  if (disCalculada < 100)         // condición que compara si el valor de la distancia es menor a 100 
  { 
    tmp = 100;           //si se cumple la condición la variable temporal guarda el valor de 100
    tone (piezo, 600, 100);  //sonido que emitirá el piezo
  }
  else 
  {           
    tmp = 0;    //si no secumple la condición la variable temporal guarda 0 lo que indica que el servo no se mueve
  } 
  delay (10);
  servo1.write (tmp);     //indica al servomotor que gire la cantidad de grados que esta en la variable
 }

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;
  
}




4. Programación de la pantalla LCD


Como última parte se agregará una pantalla LCD que permita ver los valores registrados por el prototipo referentes a la distancia. La programación utilizada es la siguiente:

#include <LiquidCrystal.h>     //librería de la pantalla lcd

#include <Servo.h>                //librería del servomotor


Servo servo1;         //constructor de la senencia servo
LiquidCrystal lcd (8,9,4,5,6,7);  //define los pines que controlan la LCD
int puertoservo = 3;   //variable para mandar datos al servo
int grados;            //variable para guardar los grados del servo
int tmp = 0;           //variable temporal para usar en la condicional
int pulsominimo = 650;  //define el ángulo menor del servo
int pulsomaximo = 2550;   //define el ángulo mayor del servo
int trig = 13;            //variable, envía una onda ultrasonica atravez del disparador
int echo = 12;          // variable, recibe las ondas que rebotan en el objeto
int piezo = 2;         //variable para el parlante en el pin 2
float disCalculada;    // variable, guarda el valor de la distancia


void setup() {

  lcd.setCursor (4,1);    //define la posición 4 de la fila 1 en la pantalla
  lcd.print ("PRONIE");   //muestra el texto
  lcd.noBlink ();        //indica al LCD que no parpadee
  delay (2000);
  servo1.attach (puertoservo, pulsominimo, pulsomaximo);   //indica al servomotor por cual pin se comunica y cuál es su ángulo mayor y menor
  pinMode (trig, OUTPUT);     //pin 13 de salida
  pinMode (echo, INPUT);      // pin 12 de entrada
  pinMode (piezo, OUTPUT);   // establece el piezo en modo de salida
  Serial.begin (9600);      //activa el monitor serial
}

void loop() {           // procedimiento que calcula y procesa los datos y luego los muestra en el monitor serial
  disCalculada = calcularDistancia ();
  grados = servo1.read ();         //guarda la lectura del ángulo que reporta el servomotor
  Serial.print ("Grados: ");
  Serial.print (grados);
  delay (200);
  Serial.println ("-----");
  Serial.print ("cm: ");
  Serial.print (disCalculada);
  delay (200);
  
  if (disCalculada < 100)         // condición que compara si el valor de la distancia es menor a 100 
  { 
    tmp = 100;           //si se cumple la condición la variable temporal guarda el valor de 100
    tone (piezo, 600, 100);
  }
  else 
  {           
    tmp = 0;   // si no se cumple la condición la variable temporal guarda 0
  } 
  delay (10);
  servo1.write (tmp);       //indica al servomotor que gire la cantidad de grados que esta en la variable
  lcd.setCursor (1,1);         //posición del cursor
  lcd.print ("Distancia ");   //muestra el texto
  lcd.println (disCalculada);   //muestra el valor de la variable
 }

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;
  
}




Reto 2


El reto 2 consiste en agregarle un sonido diferente al prototipo de la puerta automática, esta debe ser una melodía conocida, además de agregarle una luz, que se encienda cuando la puerta se abre y se apague al cerrarla.  Para la realización del reto se utilizó un actuador (led) y se agregó una nueva librería llamada pitches.h que contiene las notas que se utilizaron para la melodía. La programación utilizada es la siguiente:




#include <pitches.h>        //librería para la melodía
#include <LiquidCrystal.h>  //librería para la pantalla led
#include <Servo.h>         // librería para el servomotor


Servo servo1;         //constructor de la senencia servo
LiquidCrystal lcd (8,9,4,5,6,7);  //define los pines que controlan la LCD
int puertoservo = 3;   //variable para mandar datos al servo
int grados;            //variable para guardar los grados del servo
int tmp = 0;           //variable temporal para usar en la condicional
int pulsominimo = 650;  //define el ángulo menor del servo
int pulsomaximo = 2550;   //define el ángulo mayor del servo
int trig = 13;            //variable, envía una onda ultrasonica atravez del disparador
int echo = 12;          // variable, recibe las ondas que rebotan en el objeto
int piezo = 2;         //variable para el parlante en el pin 2
float disCalculada;    // variable, guarda el valor de la distancia
int led = 10;         //define el pin 10 para el led

int notas[] = {NOTE_E4,NOTE_E4,NOTE_E4,NOTE_E4,NOTE_E4,NOTE_E4,NOTE_E4,NOTE_G4,NOTE_C4,NOTE_D4,NOTE_E4,
                 NOTE_F4,NOTE_F4,NOTE_F4,NOTE_F4,NOTE_E4,NOTE_E4,NOTE_E4,NOTE_D4,NOTE_D4,NOTE_E4,NOTE_D4,NOTE_G4};     //melodía "Navidad"
  

int tiempoNotas[] = {8,8,4,8,8,4,8,8,8,8,4,8,8,4,8,8,4,8,8,8,8,4,4};             //tiempo de las notas musicales para la melodía
  

void setup() {

  lcd.setCursor (4,1);    //define la posición 4 de la fila 1 en la pantalla
  lcd.print ("PRONIE");   //muestra el texto
  lcd.noBlink ();        //indica al LCD que no parpadee
  delay (2000);
  servo1.attach (puertoservo, pulsominimo, pulsomaximo);   //indica al servomotor por cual pin se comunica y cuál es su ángulo mayor y menor
  pinMode (trig, OUTPUT);     //pin 13 de salida
  pinMode (echo, INPUT);      // pin 12 de entrada
  pinMode (piezo, OUTPUT);   // establece el piezo en modo de salida
  pinMode (led, OUTPUT);   //pin 10 para el led es de salida
  Serial.begin (9600);      //activa el monitor serial
  
}

void loop() {           // procedimiento que calcula y procesa los datos y luego los muestra en el monitor serial
  disCalculada = calcularDistancia ();
  grados = servo1.read ();         //guarda la lectura del ángulo que reporta el servomotor
  Serial.print ("Grados: ");
  Serial.print (grados);
  delay (200);
  Serial.println ("-----");
  Serial.print ("cm: ");
  Serial.print (disCalculada);
  delay (200);

  servo1.write (tmp);       //indica al servomotor que gire la cantidad de grados que esta en la variable
  lcd.setCursor (1,1);         //posición del cursor
  lcd.print ("Distancia ");   //muestra el texto
  lcd.println (disCalculada);   //muestra el valor de la variable
  
  if (disCalculada < 100)         // condición que compara si el valor de la distancia es menor a 100 
  { 
    tmp = 100;           //si se cumple la condición la variable temporal guarda el valor de 100

    digitalWrite (led, HIGH);    //enciende el led si cumple con la condición
       for(int nota=0; nota<23; nota++)  //define de la nota 0 a la 23 que tiene la canción
      {
    int duracionNota=2000/tiempoNotas[nota];   //define el tiempo en la duración de cada nota
    tone(piezo,notas[nota],duracionNota);  //se reproduce la melodia definida al inicio
    int pausa=duracionNota*1.30;
    delay(pausa);
    noTone(piezo);  //deteniene el sonido del piezo
   
     }
     
    }
   
  else 
  {           
    tmp = 0;                   // si no se cumple la condición la variable temporal guarda 0
    digitalWrite (led, LOW);   // apaga el led si no se cumple la condición   
    noTone(piezo);
    delay (50);
   
  } 
  delay (10);
  
 }

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;
  

}




Problemas técnicos:


En esta práctica dirigida y reto tuve varios problemas técnicos especialmente errores de sintaxis, la solución fue revisar una y otra vez hasta encontrar el error.

La conexión de la pantalla LED también se me dificultó un poco ya que al no estar numerados los pines no sabia dónde iniciaba y dónde terminaba.

La melodía para el reto fue un poco complicado (notas y tiempos), pero con ayuda del ejemplo del curso y algunos vídeos lo pude hacer funcionar.



No hay comentarios.:

Publicar un comentario