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