Práctica Dirigida 2
Puertas Automáticas
Siguiendo la misma línea de publicación de este blog, primero se presenta el video del resultado final de la práctica dirigida dos, seguida por el código del programa y luego se procede a explicar algunos de los aspectos de programación de las cuatro partes que componen esta práctica.
Finalmente se expone el video del reto dos siguiendo la misma metodología.
#include <Servo.h>
Servo servo1;
LiquidCrystal lcd(8,9,4,5,6,7);
int v = 1;
int puertoservo = 3;
int trig = 13;
int echo = 12;
int piezo = 2;
int grados;
int tmp = 0;
int pulsominimo = 650;
int pulsomaximo = 2550;
float disCalculada;
void setup()
{
lcd.setCursor (4,1);
lcd.print ("PRONIE");
lcd.noBlink ();
delay (2000);
servo1.attach (puertoservo, pulsominimo, pulsomaximo);
pinMode (trig, OUTPUT);
pinMode (echo, INPUT);
pinMode (piezo, OUTPUT);
Serial.begin (9600);
}
void loop()
{
disCalculada = calcularDistancia ();
grados = servo1.read ();
Serial.println ("--------");
Serial.print ("cm :");
Serial.println (disCalculada);
delay (200);
if (disCalculada < 100)
{
tmp = 100;
tone (piezo, 600, 100);
}
else
{
tmp = 0;
}
delay (10);
servo1.write (tmp);
lcd.setCursor (1,1);
lcd.print ("Distancia");
lcd.println (disCalculada);
delay (100);
}
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;
}
Este segundo reto consiste en aprender a utilizar el sensor ultrasónico, el servo motor y la pantalla de cristal líquido LCD; incorporando el piezo para emitir sonido, que ya lo trabajamos en la práctica dirigida 1. Para ello esta práctica se dividió en cuatro partes, iniciando con qué es y cómo funciona el
Finalmente se expone el video del reto dos siguiendo la misma metodología.
Video Puerta automática
Programa
#include <LiquidCrystal.h>#include <Servo.h>
Servo servo1;
LiquidCrystal lcd(8,9,4,5,6,7);
int v = 1;
int puertoservo = 3;
int trig = 13;
int echo = 12;
int piezo = 2;
int grados;
int tmp = 0;
int pulsominimo = 650;
int pulsomaximo = 2550;
float disCalculada;
void setup()
{
lcd.setCursor (4,1);
lcd.print ("PRONIE");
lcd.noBlink ();
delay (2000);
servo1.attach (puertoservo, pulsominimo, pulsomaximo);
pinMode (trig, OUTPUT);
pinMode (echo, INPUT);
pinMode (piezo, OUTPUT);
Serial.begin (9600);
}
void loop()
{
disCalculada = calcularDistancia ();
grados = servo1.read ();
Serial.println ("--------");
Serial.print ("cm :");
Serial.println (disCalculada);
delay (200);
if (disCalculada < 100)
{
tmp = 100;
tone (piezo, 600, 100);
}
else
{
tmp = 0;
}
delay (10);
servo1.write (tmp);
lcd.setCursor (1,1);
lcd.print ("Distancia");
lcd.println (disCalculada);
delay (100);
}
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;
}
Este segundo reto consiste en aprender a utilizar el sensor ultrasónico, el servo motor y la pantalla de cristal líquido LCD; incorporando el piezo para emitir sonido, que ya lo trabajamos en la práctica dirigida 1. Para ello esta práctica se dividió en cuatro partes, iniciando con qué es y cómo funciona el
Sensor ultrasónico
Este sensor mide la distancia a través de las ondas ultrasónicas. tiene 4 terminales:
Para programar este sensor se declaran 3 variables
int trig = 13; // envía onda ultrasónica
int echo = 12; // recibe onda ultrasónica que rebotan en él
float disCalculada; // Guarda el valor de la distancia, admite decimales
y se establece la polaridad:
1. Establecer conexión entre el protoboard y la tarjeta arduino.
2. conectar los cuatro terminales del sensor ultrasónico
a tierra (-), alimentación eléctrica ( + ), Trig a puerto 13
( envío datos) y Echo a puerto 12 (receptor de datos)
En el setup se activan los eventos que se necesitan para el sensor de entrada y salida de datos
pinMode (trig, OUTPUT); // salida de datos
pinMode (echo, INPUT); // recepción de datos
Serial.begin (9600) // activar monitor serial para desplegar valores
En el loop se define este procedimiento para capturar y desplegar los datos en el monitor serial
{
disCalculada = calcularDistancia (); // variable que devuelve el valor que captura calcularDistancia
Serial.println ("--------"); //línea que divide la información y hace salto de línea.
Serial.print ("cm :"); //inserta inicial de centímetros sin salto de línea
Serial.println (disCalculada); //devuelve el número que calcula esta variable
delay (200); //Espera 200 milisegundos
Además se declara la variable calcularDistancia basada en el principio de la distancia que recorre el tiempo en un segundo. Esto se convierte a un centímetro por micro-segundos. Luego se aplica la regla de tres entre distancia y duración y se obtiene la distancia que se necesita dividir entre 29 Quedando así:
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;
}
Se prueba el programa para confirmar que funciona.
- UCC Voltaje positivo
- Trig Receptor de datos
- Echo Envío de datos
- GND Tierra polaridad negativa
Para programar este sensor se declaran 3 variables
int trig = 13; // envía onda ultrasónica
int echo = 12; // recibe onda ultrasónica que rebotan en él
float disCalculada; // Guarda el valor de la distancia, admite decimales
y se establece la polaridad:
1. Establecer conexión entre el protoboard y la tarjeta arduino.
2. conectar los cuatro terminales del sensor ultrasónico
a tierra (-), alimentación eléctrica ( + ), Trig a puerto 13
( envío datos) y Echo a puerto 12 (receptor de datos)
En el setup se activan los eventos que se necesitan para el sensor de entrada y salida de datos
pinMode (trig, OUTPUT); // salida de datos
pinMode (echo, INPUT); // recepción de datos
Serial.begin (9600) // activar monitor serial para desplegar valores
En el loop se define este procedimiento para capturar y desplegar los datos en el monitor serial
{
disCalculada = calcularDistancia (); // variable que devuelve el valor que captura calcularDistancia
Serial.println ("--------"); //línea que divide la información y hace salto de línea.
Serial.print ("cm :"); //inserta inicial de centímetros sin salto de línea
Serial.println (disCalculada); //devuelve el número que calcula esta variable
delay (200); //Espera 200 milisegundos
Además se declara la variable calcularDistancia basada en el principio de la distancia que recorre el tiempo en un segundo. Esto se convierte a un centímetro por micro-segundos. Luego se aplica la regla de tres entre distancia y duración y se obtiene la distancia que se necesita dividir entre 29 Quedando así:
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;
}
Se prueba el programa para confirmar que funciona.
Incorporar el Piezo
El piezo se incorpora para notificar de manera auditiva si algo está cerca del sensor ultrasónido.
Se declara la variable piezo:
int piezo = 2; // se declara el piezo en el pin #2
Se declara la variable piezo:
int piezo = 2; // se declara el piezo en el pin #2
Los números en las variables permiten direccionarlas a los pines del arduino.
En el setup se establece el piezo como un elemento de salida de datos:
pinMode (piezo, OUTPUT);
En el loop se programa la condicional sí If que comparará si la distancia es menor a 100 cms para que suene el piezo, si no cumple con esta condición no sucede nada, como se declara en el else.
if (disCalculada < 100)
{
tmp = 100;
tone (piezo, 600, 100);
}
else
{
tmp = 0;
}
delay (10);
pinMode (piezo, OUTPUT);
En el loop se programa la condicional sí If que comparará si la distancia es menor a 100 cms para que suene el piezo, si no cumple con esta condición no sucede nada, como se declara en el else.
Circuitería Piezo
Se establece una espera de 10 mili-segundos con el delay.if (disCalculada < 100)
{
tmp = 100;
tone (piezo, 600, 100);
}
else
{
tmp = 0;
}
delay (10);
Se prueba el programa para confirmar que funciona.
#include <Servo.h>
Servo servo1;
Declararlo y crear variable
int puertoservo = 3
Crear más variables para:
int grados; //variables grados para guardar el ángulo del giro del servo
int tmp = 0; //Variable temporal para poder trabajar en la condicional
int pulsominimo = 650; // define ángulo mínino que puede trabajar el servo
int pulsomaximo = 2550; // define ángulo máximo
En el setupt se define el pin en el que va a trabajar el servo, el ángulo mínimo y el ángulo máximo en que va a trabajar el servo.
servo1.attach (puertoservo, pulsominimo, pulsomaximo);
En el loop debajo de la sentencia disCalculada = calcularDistancia (); se escribe
grados = servo1.read (); donde se guarda la lectura del valor ángulo de giro que reporta el servo
Dentro de la condicional de distancia calculada, le escribimos que si la distancia es menor que 100 guarde en la variable temporal el número 100 o sea un ángulo de 100 grados.
Si no se cumple esta condición se le asigna a la variable temporal un cero, o sea que vuelva al ángulo 0 de giro.
Se prueba el programa para confirmar que funciona.
menú
#include <LiquidCrystal.h>
LiquidCrystal lcd(8,9,4,5,6,7); // pines que controlan la pantalla LCD
int v = 1;
En el setup se define el siguiente procedimiento para escribir en la paltalla LCD
{
lcd.setCursor (4,1);//posición del cursor en la pantalla LCD
lcd.print ("PRONIE"); // escribe palabra PRONIE
lcd.noBlink (); //no parpadée la pantalla
delay (2000); // espera 2 segundos
Para poder ver la distancia que reporta el sensor ultrasónido, agregamos el siguiente código al final del loop.
lcd.setCursor (1,1); //Texto aparece primera fila pantalla LCD
lcd.print ("Distancia"); //escriba la palabra Distancia
lcd.println (disCalculada); //imprime en la pantalla LCD el valor de la variable disCalculada
delay (100); //espera 100 mili-segundos
}
lcd.print = no hace salto de línea
Se prueba el programa para confirmar que funciona.
#include <LiquidCrystal.h>
#include <Servo.h>
Servo servo1;
LiquidCrystal lcd(8,9,4,5,6,7);
int v = 1;
int puertoservo = 3;
int trig = 13;
int echo = 12;
int piezo = 2;
int grados;
int tmp = 0;
int pulsominimo = 650;
int pulsomaximo = 2550;
float disCalculada;
int melody[] = {
NOTE_C4, NOTE_G3, NOTE_G3, NOTE_A3, NOTE_G3, 0, NOTE_B3, NOTE_C4
};
int noteDurations[] = {
4, 8, 8, 4, 4, 4, 4, 4
};
void setup()
{
lcd.setCursor (4,1);
lcd.print ("PRONIE");
lcd.noBlink ();
delay (2000);
servo1.attach (puertoservo, pulsominimo, pulsomaximo);
pinMode (trig, OUTPUT);
pinMode (echo, INPUT);
pinMode (piezo, OUTPUT);
Serial.begin (9600);
}
void loop()
{
disCalculada = calcularDistancia ();
grados = servo1.read ();
Serial.println ("--------");
Serial.print ("cm :");
Serial.println (disCalculada);
delay (200);
if (disCalculada < 100)
{
tmp = 100;
//tone (piezo, 600, 100);
}
else
{
tmp = 0;
}
delay (10);
servo1.write (tmp);
if (tmp == 100){ // se pregunta si la puerta está abierta, para que sea aquí donde suene la canción
sonar ();
tmp=0; //Servo vuelve a su estado original, 0 grados
delay (100);
}
lcd.setCursor (1,1);
lcd.print ("Distancia");
lcd.println (disCalculada);
delay (100);
}
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;
}
void sonar (){
for (int thisNote = 0; thisNote < 8; thisNote++) {
int noteDuration = 1000 / noteDurations[thisNote];
tone(piezo, melody[thisNote], noteDuration);
int pauseBetweenNotes = noteDuration * 1.30;
delay(pauseBetweenNotes);
noTone(piezo);
}
}
Para poder utilizar el archivo de notas musicales se debe incluir una biblioteca en el programa Arduino como un archivo extra .h
En el Menú se va a Archivo - Ejemplos - Dígital - ToneMelody
Una vez copiado el archivo se explora para conocer las notas musicales y se analiza el programa para ver cómo funciona y programa.
En el programa se declara la subcarpeta #include "pitches.h" al nivel de las liberías.
Antes del setup se declara como una variable la melodía y el tiempo de duración de las notas:
int melody[] = {
NOTE_C4, NOTE_G3, NOTE_G3, NOTE_A3, NOTE_G3, 0, NOTE_B3, NOTE_C4
}; //melodía en notas musicales
int noteDurations[] = {
4, 8, 8, 4, 4, 4, 4, 4 //Duración en correspondencia a cada nota
};
En el loop se define una nueva condicional sí, que pregunta si la distancia del objeto al sensor ultrasónico es == a 100 active el procedimiento sonar, que la melodía suene mientras la puerta esté abierta
if (tmp == 100){ // se pregunta si la puerta está abierta, para que sea aquí donde suene la canción
sonar (); //llama al procedimiento que toca la melodía
tmp=0;
delay (100);
}
Al final del loop se copió el programa sonar, tal como venía en el ejemplo ToneMelody, solamente se hicieron algunos cambios con respecto al pin #8, donde se ubicaba la salida de datos del programa original y se colocó la palabra piezo, que es el dispositivo en el cual se programó el output de sonido.
El procedimiento utiliza una estructura de control de tipo for (mientras)
void sonar (){
for (int thisNote = 0; thisNote < 8; thisNote++) {
int noteDuration = 1000 / noteDurations[thisNote];
tone(piezo, melody[thisNote], noteDuration);
int pauseBetweenNotes = noteDuration * 1.30;
delay(pauseBetweenNotes);
noTone(piezo);
}
PROBLEMAS
En la parte de la práctica dirigida 2, después de conectar el servo, la tarjeta arduino dejó de leer el puerto com. Para solucionarlo se conectó y desconectó la tarjeta; se utilizó una nueva tarjeta que leí el puerto y cuando se conectó de nuevo la trajeta arduino con la que se estaba trabajando, volvió a dejar de leer el puerto.
Se procedió a revisar la cirduitería en nos percatamos que había un problema de polaridad, por eso, para no quemar la atrjeta, es que desconectaba el puerto com.
Moraleja tratar de manejar el polo positivo con colora de la gama del rojo y el engativo de la gama de los azules para no conectar mal la polaridad.
En cuanto al Reto2, fue de gran ayuda que Efraim ya hubiera trabajado y hasta traducido el archivo pitches.h, porque fue quien me orientó para copiar la subcarpeta en mi archivo y me explicó como modificar el programa original sonar, cuando me bloqueé; para que funcionara en mi proyecto.
Incorporar el Servo motor
Para utilizar el servo primero hay que incluir una librería, que se descarga desde el menú Programa, librería, servo.#include <Servo.h>
Servo servo1;
Declararlo y crear variable
int puertoservo = 3
Crear más variables para:
int grados; //variables grados para guardar el ángulo del giro del servo
int tmp = 0; //Variable temporal para poder trabajar en la condicional
int pulsominimo = 650; // define ángulo mínino que puede trabajar el servo
int pulsomaximo = 2550; // define ángulo máximo
En el setupt se define el pin en el que va a trabajar el servo, el ángulo mínimo y el ángulo máximo en que va a trabajar el servo.
servo1.attach (puertoservo, pulsominimo, pulsomaximo);
Circuitería del Servo
En el loop debajo de la sentencia disCalculada = calcularDistancia (); se escribe
grados = servo1.read (); donde se guarda la lectura del valor ángulo de giro que reporta el servo
Dentro de la condicional de distancia calculada, le escribimos que si la distancia es menor que 100 guarde en la variable temporal el número 100 o sea un ángulo de 100 grados.
Si no se cumple esta condición se le asigna a la variable temporal un cero, o sea que vuelva al ángulo 0 de giro.
if (disCalculada < 100)
{
tmp = 100;
tone (piezo, 600, 100);
}
else
{
tmp = 0;
}
Se prueba el programa para confirmar que funciona.
Incorporar Pantalla LCD
Lo primero que se hace para utilizar la pantalla LCD es incluir una librería, que se descarga desde el Programa, librería, liquidCristal. Además se definen los pines en la tarjeta Arduino que controlan la pantalla LCD#include <LiquidCrystal.h>
LiquidCrystal lcd(8,9,4,5,6,7); // pines que controlan la pantalla LCD
int v = 1;
En el setup se define el siguiente procedimiento para escribir en la paltalla LCD
{
lcd.setCursor (4,1);//posición del cursor en la pantalla LCD
lcd.print ("PRONIE"); // escribe palabra PRONIE
lcd.noBlink (); //no parpadée la pantalla
delay (2000); // espera 2 segundos
Para poder ver la distancia que reporta el sensor ultrasónido, agregamos el siguiente código al final del loop.
lcd.setCursor (1,1); //Texto aparece primera fila pantalla LCD
lcd.print ("Distancia"); //escriba la palabra Distancia
lcd.println (disCalculada); //imprime en la pantalla LCD el valor de la variable disCalculada
delay (100); //espera 100 mili-segundos
}
Nota: Diferencia entre
lcd.println = hace salto de línea en la escrituralcd.print = no hace salto de línea
Se prueba el programa para confirmar que funciona.
*******************************************************************
Reto2
Puerta Automática con ToneMelody
Para el reto 2 se nos pidió que incorporemos una melodía que suene mientras la puerta automática esté abierta. Para aprender cómo utilizar las notas musicales se observaron dos videos. Como se utilizó el mismo programa con alguna programación de más, a continuación se presenta el video explicativo, el programa y me voy a concentrar en el detalle de cómo incluí el archivo con las notas musicales y los problemas solucionados.
Video Puerta Automática con ToneMelody
Programa
#include "pitches.h"#include <LiquidCrystal.h>
#include <Servo.h>
Servo servo1;
LiquidCrystal lcd(8,9,4,5,6,7);
int v = 1;
int puertoservo = 3;
int trig = 13;
int echo = 12;
int piezo = 2;
int grados;
int tmp = 0;
int pulsominimo = 650;
int pulsomaximo = 2550;
float disCalculada;
int melody[] = {
NOTE_C4, NOTE_G3, NOTE_G3, NOTE_A3, NOTE_G3, 0, NOTE_B3, NOTE_C4
};
int noteDurations[] = {
4, 8, 8, 4, 4, 4, 4, 4
};
void setup()
{
lcd.setCursor (4,1);
lcd.print ("PRONIE");
lcd.noBlink ();
delay (2000);
servo1.attach (puertoservo, pulsominimo, pulsomaximo);
pinMode (trig, OUTPUT);
pinMode (echo, INPUT);
pinMode (piezo, OUTPUT);
Serial.begin (9600);
}
void loop()
{
disCalculada = calcularDistancia ();
grados = servo1.read ();
Serial.println ("--------");
Serial.print ("cm :");
Serial.println (disCalculada);
delay (200);
if (disCalculada < 100)
{
tmp = 100;
//tone (piezo, 600, 100);
}
else
{
tmp = 0;
}
delay (10);
servo1.write (tmp);
if (tmp == 100){ // se pregunta si la puerta está abierta, para que sea aquí donde suene la canción
sonar ();
tmp=0; //Servo vuelve a su estado original, 0 grados
delay (100);
}
lcd.setCursor (1,1);
lcd.print ("Distancia");
lcd.println (disCalculada);
delay (100);
}
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;
}
void sonar (){
for (int thisNote = 0; thisNote < 8; thisNote++) {
int noteDuration = 1000 / noteDurations[thisNote];
tone(piezo, melody[thisNote], noteDuration);
int pauseBetweenNotes = noteDuration * 1.30;
delay(pauseBetweenNotes);
noTone(piezo);
}
}
**********************************************
Para poder utilizar el archivo de notas musicales se debe incluir una biblioteca en el programa Arduino como un archivo extra .h
En el Menú se va a Archivo - Ejemplos - Dígital - ToneMelody
- Desde el explorador se abre la carpeta de este archivo, ahí se encuentran dos archivos, toneMelody.ino y pitches.h
- se copia el archivo pitches.h
- se busca el programa en que se va a incorporar este nuevo archivo desde el administrador de archivos,
- se abre la carpeta del archivo y se pega el archivo pitches.h, de notas musicales.
- Cuando se abre el proyecto en arduino automáticamente carga esta subcarpeta pitches.h
Una vez copiado el archivo se explora para conocer las notas musicales y se analiza el programa para ver cómo funciona y programa.
En el programa se declara la subcarpeta #include "pitches.h" al nivel de las liberías.
Antes del setup se declara como una variable la melodía y el tiempo de duración de las notas:
int melody[] = {
NOTE_C4, NOTE_G3, NOTE_G3, NOTE_A3, NOTE_G3, 0, NOTE_B3, NOTE_C4
}; //melodía en notas musicales
int noteDurations[] = {
4, 8, 8, 4, 4, 4, 4, 4 //Duración en correspondencia a cada nota
};
En el loop se define una nueva condicional sí, que pregunta si la distancia del objeto al sensor ultrasónico es == a 100 active el procedimiento sonar, que la melodía suene mientras la puerta esté abierta
if (tmp == 100){ // se pregunta si la puerta está abierta, para que sea aquí donde suene la canción
sonar (); //llama al procedimiento que toca la melodía
tmp=0;
delay (100);
}
Al final del loop se copió el programa sonar, tal como venía en el ejemplo ToneMelody, solamente se hicieron algunos cambios con respecto al pin #8, donde se ubicaba la salida de datos del programa original y se colocó la palabra piezo, que es el dispositivo en el cual se programó el output de sonido.
El procedimiento utiliza una estructura de control de tipo for (mientras)
void sonar (){
for (int thisNote = 0; thisNote < 8; thisNote++) {
int noteDuration = 1000 / noteDurations[thisNote];
tone(piezo, melody[thisNote], noteDuration);
int pauseBetweenNotes = noteDuration * 1.30;
delay(pauseBetweenNotes);
noTone(piezo);
}
PROBLEMAS
En la parte de la práctica dirigida 2, después de conectar el servo, la tarjeta arduino dejó de leer el puerto com. Para solucionarlo se conectó y desconectó la tarjeta; se utilizó una nueva tarjeta que leí el puerto y cuando se conectó de nuevo la trajeta arduino con la que se estaba trabajando, volvió a dejar de leer el puerto.
Se procedió a revisar la cirduitería en nos percatamos que había un problema de polaridad, por eso, para no quemar la atrjeta, es que desconectaba el puerto com.
Moraleja tratar de manejar el polo positivo con colora de la gama del rojo y el engativo de la gama de los azules para no conectar mal la polaridad.
En cuanto al Reto2, fue de gran ayuda que Efraim ya hubiera trabajado y hasta traducido el archivo pitches.h, porque fue quien me orientó para copiar la subcarpeta en mi archivo y me explicó como modificar el programa original sonar, cuando me bloqueé; para que funcionara en mi proyecto.











0 comentarios:
Publicar un comentario