Práctica Dirigia 2
A continuación les voy a presentar mi Práctica Dirigida II-Prototipos Interactivos II
Esta práctica consiste en crear a través de cuatro pasos, la simulación de una puerta automática.
En primera instancia se debía utilizar una sensor ultrasónico para medir la distancia de un objeto, luego se debía incorporar un piezo o buzzer que es un actuador que se utiliza para emitir sonido, su función radica en que si el objeto estaba cerca debía sonar, si el objeto está lejos no emite sonido. Luego se debía incorporar un actuador llamado servo motor, el cual sirve para simular la puerta electrónica que debe abrirse si el objeto está cerca o debe cerrarse si está lejos. Por último había que incorporar una pantalla LCD para que apareciera anotada la distancia a la cual se encuentra el objeto, si la distancia es mejor a 100 el objeto está cerca, sino se encuentra a una distancia mayor a 100.
Video Práctica Dirigida II
Código Fuente Utilizado en la Práctica Dirigida II:
#include
#include
Servo servo1;
LiquidCrystal lcd(8,9,4,5,6,7); // El actuador pantalla LCD, ocupa los puertos 8, 9, 4 , 5, 6 y 7. Se deben declarar para que la pantalla sea leída.
int V=-1;
int puertoservo = 3;
int trig = 13;
int echo = 12;
int piezo = 2; //Todas estas instrucciones que tiene un int son variables que se necesitan para ser utilizadas en la práctica, unas como trig, puertoservo,
int grados; //echo y piezo se usan para indicar el pin en el cual fueron colocados los sensores o actuadores para que sean leídos por la
int tmp = 0; // la placa de Arduino. Otras como V, tmp, pulsominimo, pulsomaximo son variables que se utilizan de manera local.
int pulsominimo = 650; //define el ángulo mínimo en que se puede mover el servo motor
int pulsomaximo = 2550; //define el ángulo máximo en que se puede mover el servo motor
float disCalculada; //Esta variable disCalculada se declara de forma flotante ya que, necesitamos que lea números decimales para la distancia en la que
//se encuentra el objeto.
void setup()
{
lcd.setCursor (4,1); //Coloca el cursos en la pantalla LCD en la posición 4 renglón 1
lcd.print("PRONIE"); //Se imprime la palabra PRONIE
lcd.noBlink(); //Esta instrucción evita que la pantalla parpadee
delay (2000);
servo1.attach (puertoservo, pulsominimo, pulsomaximo); // indica a través de cual puerto se va a comunicar el servomotor y el ángulo mínimo y máximo.
pinMode (trig, OUTPUT); // Se delcara el trig que envía la onda ultrasónica, como un elemento de salida
pinMode (echo, INPUT); // Se declara el echo que recibe la onda ultrasónica, como un elemento de entrada.
pinMode (piezo, OUTPUT); //Se declara el piezo como un elemento de salida por el sonido que debe emitir
Serial.begin (9600); //Se inicia el monitor serial
}
void loop()
{
disCalculada = calcularDistancia (); //Se le da a la variable disCalculada el dato que envía el procedimiento llamado calcularDistancia
grados = servo1.read(); //La variable grados, guarda la lectura de los grados de inclinación del servo motor.
Serial.print ("Grados :"); // Imprime en el monitor serial la palabra grados
delay (200);
Serial.println ("----------"); //baja de línea y coloca los guiones y luego
Serial.print ("cm :" ); //se escribe la palabra cm
Serial.println (disCalculada);//y seguidamene el resulado del procedimiento para calcular la distancia.
delay (200);
if (disCalculada < 100) //Este procedimiento del if y el else, lo que hace es lo siguiente: Si la distancia es menor a 100 (si está muy cerca el objeto) { tmp=90+10; tone (piezo, 600, 100); //el piezo emite un sonido alertando la cercanía } else //sino { tmp=0-10; //deja de sonar } delay (10); servo1.write(tmp); //hace que el servo motor obtenga el valor de tmp dependiendo de la distancia lcd.setCursor(1,1); //Con estas instrucciones lcd se va a imprimir en la línea 1 posición1 la palabra Distancia seguido del valor que tiene la variable disCalculada lcd.print ("Distancia"); //para saber la distancia a la cual está el objeto. lcd.println(disCalculada); } int calcularDistancia () //todo esta procedimiento lo que hace es calcular la distancia a la que se encuentra un objeto del Sensor ultrasónico { 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 Solución al Reto II
Este reto consiste en incorporarle al diseño anterior una luz LED para que indique cuando la puerta está abierta y en cambiar el sonido del piezo por una melodía conocida.
Código Fuente Reto II
#define NOTE_B0 31 //estas instrucciones se crearon para declarar las notas musicales para así producir la melodía que se desea.
#define NOTE_C1 33
#define NOTE_CS1 35
#define NOTE_D1 37
#define NOTE_DS1 39
#define NOTE_E1 41
#define NOTE_F1 44
#define NOTE_FS1 46
#define NOTE_G1 49
#define NOTE_GS1 52
#define NOTE_A1 55
#define NOTE_AS1 58
#define NOTE_B1 62
#define NOTE_C2 65
#define NOTE_CS2 69 //estas instrucciones se crearon para declarar las notas musicales para así producir la melodía que se desea.
#define NOTE_D2 73
#define NOTE_DS2 78
#define NOTE_E2 82
#define NOTE_F2 87
#define NOTE_FS2 93
#define NOTE_G2 98
#define NOTE_GS2 104
#define NOTE_A2 110
#define NOTE_AS2 117 //estas instrucciones se crearon para declarar las notas musicales para así producir la melodía que se desea.
#define NOTE_B2 123
#define NOTE_C3 131
#define NOTE_CS3 139
#define NOTE_D3 147
#define NOTE_DS3 156
#define NOTE_E3 165
#define NOTE_F3 175
#define NOTE_FS3 185
#define NOTE_G3 196
#define NOTE_GS3 208
#define NOTE_A3 220
#define NOTE_AS3 233
#define NOTE_B3 247
#define NOTE_C4 262
#define NOTE_CS4 277
#define NOTE_D4 294
#define NOTE_DS4 311
#define NOTE_E4 330
#define NOTE_F4 349
#define NOTE_FS4 370
#define NOTE_G4 392
#define NOTE_GS4 415
#define NOTE_A4 440
#define NOTE_AS4 466
#define NOTE_B4 494
#define NOTE_C5 523
#define NOTE_CS5 554
#define NOTE_D5 587
#define NOTE_DS5 622
#define NOTE_E5 659
#define NOTE_F5 698
#define NOTE_FS5 740
#define NOTE_G5 784
#define NOTE_GS5 831
#define NOTE_A5 880
#define NOTE_AS5 932
#define NOTE_B5 988
#define NOTE_C6 1047
#define NOTE_CS6 1109
#define NOTE_D6 1175
#define NOTE_DS6 1245
#define NOTE_E6 1319
#define NOTE_F6 1397
#define NOTE_FS6 1480
#define NOTE_G6 1568
#define NOTE_GS6 1661
#define NOTE_A6 1760
#define NOTE_AS6 1865
#define NOTE_B6 1976
#define NOTE_C7 2093
#define NOTE_CS7 2217
#define NOTE_D7 2349
#define NOTE_DS7 2489
#define NOTE_E7 2637
#define NOTE_F7 2794
#define NOTE_FS7 2960
#define NOTE_G7 3136
#define NOTE_GS7 3322
#define NOTE_A7 3520
#define NOTE_AS7 3729
#define NOTE_B7 3951
#define NOTE_C8 4186
#define NOTE_CS8 4435
#define NOTE_D8 4699
#define NOTE_DS8 4978
#include
#include
# include "pitches.h" //Librería necesaria para ejecutir las notas y hacer la melodía
#include
Servo servo1; // Se crea la variable para el servo motor
LiquidCrystal lcd(8,9,4,5,6,7);// Se declaran los pines que utiliza la pantalla LCD para que sea detectada
int melody[] = { NOTE_C4, NOTE_G3, NOTE_G3, NOTE_A3, NOTE_G3, 0, NOTE_B3, NOTE_C4};//Variable que guarda las notas musicales de la melodía que se desea implementar.
int noteDurations[] = {4, 8, 8, 4, 4, 4, 4, 4}; //Esta variable se utiliza para programar la duración de la nota y obtener la melodía deseada.
int v=-1; //Todas estas instrucciones que tiene un int son variables que se necesitan para ser utilizadas en la práctica, unas como trig, puertoservo,
int pinRojo = 10; //echo y piezo se usan para indicar el pin en el cual fueron colocados los sensores o actuadores para que sean leídos por la
int puertoservo =3; // la placa de Arduino. Otras como V, tmp, pulsominimo, pulsomaximo son variables que se utilizan de manera local.
int trig = 13;
int echo = 12;
int piezo = 2;
int grados;
int tmp=0;
int pulsominimo=650; //define el ángulo mínimo en que se puede mover el servo motor
int pulsomaximo=2550; //define el ángulo máximo en que se puede mover el servo motor
float disCalculada; //Esta variable disCalculada se declara de forma flotante ya que, necesitamos que lea números decimales para la distancia en la que
//se encuentra el objeto.
void setup() {
lcd.setCursor(4,1); //Coloca el cursos en la pantalla LCD en la posición 4 renglón 1
lcd.print ("PRONIE"); //Se imprime la palabra PRONIE en la pantalla
lcd.noBlink(); //Esta instrucción evita que la pantalla parpadee
delay(2000);
servo1.attach (puertoservo,pulsominimo,pulsomaximo); // indica a través de cual puerto se va a comunicar el servomotor y el ángulo mínimo y máximo.
pinMode (trig, OUTPUT); // Se delcara el trig que envía la onda ultrasónica, como un elemento de salida.
pinMode (echo, INPUT); // Se declara el echo que recibe la onda ultrasónica, como un elemento de entrada.
pinMode (piezo, OUTPUT); //Se declara el piezo como un elemento de salida por el sonido que debe emitir
pinMode (pinRojo, OUTPUT); //Se declara la luz LED como un elemento de salida por la luz que emite.
Serial.begin (9600); //Se inicia el monitor serial.
}
void loop() {
disCalculada = calcularDistancia (); //Se le da a la variable disCalculada el dato que envía el procedimiento llamado calcularDistancia
grados=servo1.read(); //La variable grados, guarda la lectura de los grados de inclinación del servo motor.
Serial.print("Grados :"); // Imprime en el monitor serial la palabra grados
Serial.println (grados); //Baja de línea para anotar los grados
delay (200);
Serial.println ("---------"); //baja de línea y coloca los guiones y luego
Serial.print ("cm :"); //se escribe la palabra cm
Serial.println (disCalculada); //y seguidamene el resulado del procedimiento para calcular la distancia.
delay(200);
if (disCalculada < 20) //Este procedimiento del if y el else, lo que hace es lo siguiente: Si la distancia es menor a 20 (si está muy cerca el objeto)
{
digitalWrite (pinRojo, HIGH); //se enciende la luz led si el objeto está cerca
tmp=90+10; //agrega a la variable tmp el valor 90+10
for (int thisNote = 0; thisNote < 8; thisNote++) { //Este pequeño procedimiento hace que se genere la melodía a través del piezo o buzzer
int noteDuration = 1000 / noteDurations[thisNote]; //se calcula la duración de la nota
tone(2, melody[thisNote], noteDuration); //suena la melodía a través del pin 2
int pauseBetweenNotes = noteDuration * 1.30; //se da una pausa entre una nota y otra
delay(pauseBetweenNotes);
noTone(2); //cuando finaliza la melodía deja de sonar
digitalWrite (pinRojo, LOW); //se apaga la luz LED
}
}
else
{
tmp=0-10; //si la distancia no es menor a 20, no suena la melodía ni se enciende la luz
}
delay (10);
servo1.write(tmp); //hace que el servo motor obtenga el valor de tmp dependiendo de la distancia y se mueva
lcd.setCursor(1,1); //Con estas instrucciones lcd se va a imprimir en la línea 1 posición1 la palabra Distancia seguido del valor que tiene la variable disCalculada
lcd.print ("distancia"); /para saber la distancia a la cual está el objeto.
lcd.println (disCalculada);
}
int calcularDistancia () //todo esta procedimiento lo que hace es calcular la distancia a la que se encuentra un objeto del Sensor ultrasónico
{
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;
}