Práctica Dirigida 2


Practica Dirigida 2


En esta práctica utilizaremos:






 

Puerta automática - sensor ultrasónico



Comenzamos con la conexión de cables en el Arduino Uno y la  Protoboard.

Positivo de Protoboard se conecta a 5V de Arduino Uno.

Negativo de Protoboard se conecta a GND.



Se conecta el sensor ultrasónico a Arduino y a la Protoboard:



Gnd se conecta a negativo de Protoboard.

Echo se conecta al pin 12 de Arduino Uno.

Trig se conecta al pin 13 de Arduino Uno.
Ucc se conecta a positivo de Protoboard.


Programación

Se abre el Programa ID Arduino y se configuran la Tarjeta y el Puerto en Herramientas en Arduino Uno, se definen las variables y puertos luego le indicamos a los puertos su funcionalidad, una envía (Trig) una onda ultrasónica y el otro la recibe (Echo). Se crea una variable (float) que guarde el valor de la distancia entre el objeto y el sensor.
En el setup definimos el pin que va ser el de entrada y salida.

En el loop ejecutamos el procedimiento para que nos lo muestre en el monitor serial



int trig = 13;
int echo = 12;
float disCalculada;
void setup()
{
  pinMode (trig, OUTPUT);
  pinMode (echo, INPUT);
  Serial.begin (9600);
void loop()
{
  disCalculada =calcularDistancia();
  Serial.println("----");
  Serial.println("Cm: ");
  Serial.println(disCalculada);
  delay(200);   
}
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;
}

Video sensor ultrasónico




Puerta automática – piezo

 

Vamos a agregar el piezo para que nos pueda detectar si algo está cerca o lejos.
Colocaremos unas terminales al bus en la parte negativa y la parte positiva,  que va  direccionada al pin número 2 de la tarjeta arduino.

Programación

Utilizamos la programación de la práctica anterior.
Agregaremos lo siguiente:
En la sección de variables crearemos una llamada piezo  y  le asignaremos el numero 2 lo cual la direccionará al pin del arduino.
En el setup
Se establece piezo como una  salida.

Se usa la lógica computacional, tipo si para comparar si la distancia es mayor a 100 cm. Y  en base a esto accionara un tono del piezo, sino cumple no ejecutara la acción. Se espera diez milisegundos.

int trig = 13;
int echo = 12;
int piezo = 2;
float disCalculada;
void setup(){
  pinMode (trig, OUTPUT);
  pinMode (echo, INPUT);
  pinMode (piezo, OUTPUT);
  Serial.begin (9600);}
 void loop(){
  disCalculada = calcularDistancia();
  Serial.println("----");
  Serial.println("Cm: ");
  Serial.println(disCalculada);
  delay(200);   
  if (disCalculada < 100)
  { tone (piezo, 600,100);}
  else {}
  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;
}



Puerta automática – servomotor

 

Conectar los polos positivo y negativo en el bus de la protoboard y un cable conectado al Pin 3
Para activarlo se realiza la siguiente programación.

Agregar a librería que va manipular el servomotor se programa agregar librería y se selecciona la librería del servomotor.
Crear las variables para su uso creamos la sentencia servo1 con la instrucción (puerto servo).

Se crean las siguientes variables:
grados la que va a guardar el ángulo giro servo, tipo temporal para trabajar en la condicional, pulso mínimo lo que define el ángulo mínimo que trabaja el servo, pulso máximo lo que define el ángulo máximo que trabaja el servo.
En el setup se define cual  es el puerto con el punto máximo y minino que puede trabajar el servomotor.
En el Loop se le dice a la variable grados que va a guardar la lectura del ángulo que le reporta el servomotor.
Cuando se entra a la condicional de distancia calculada vamos a decirle que se distancia es menor que 100 y que guarda en la variable temporal si el número es 100 de  lo contrario que guarde en la variable temporal 0, lo que quiere decir que el servomotor regrese a 0 de gire se esperan 10 milisegundo.
Luego se dice al servomotor que gire la cantidad de grados que tiene la variable temporal la cual varia si se cumple o no la condicional.





Puerta automática – LCD



Pantalla LCD

Se creara un nuevo circuito
_La pantalla LCD tiene 2 partes y utiliza muchas conexiones, la primera es la alimentación eléctrica la cual se conecta al bus de la protoboard la segunda parte la comunicación con la pantalla LCD requerimos 6 conectores  con terminal los que van al pin 4 hasta el 9 en la tarjeta arduino1 en la pantalla LCD los pines corresponde del 5 al 10.
Programación
Agregamos una librería  LiquidCrystal.
Variables pines se conecta Arduino1 4,5,6,7,8,9

En el Setup se usa la nueva instrucción LCD.SetCursor la cual se define la posición de la línea en la pantalla utilizamos posición 4 fila1 también se utilizara LCDprint con una palabra (“Pronie”) lo que muestra el en la pantalla el texto LCD, luego que no parpade la pantalla se utiliza LCD.noblinke, se da una espera de 2 segundos con la sentencia delay 2000 para poder dar distancia que reporta el sensor electrónico en la parte final del loop.

#include <LiquidCrystal.h>
#include <Servo.h>
Servo servo1;

LiquidCrystal  lcd(8,9,4,5,6,7);
int v=-1;
int puertoservo=3;
int grados;
int tmp=0;
int pulsominimo=650;
int pulsomaximo=2550;
int trig=13;
int echo=12;
float disCalculada;
int piezo=2;


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.print("Grados: ");
  Serial.println(grados);
  delay (200);
  Serial.println("------");
  Serial.print("cm: ");
  Serial.println(disCalculada);
  delay(200);
  if (disCalculada<100)
  {
    tmp=90+10;
    tone (piezo, 600, 100);
  }
  else
  {
    tmp=0-10;
  }
  delay(10);
servo1.write(tmp);
//lcd.clear();
lcd.setCursor(1,1);
lcd.print("Distancia");
//lcd.setCursor(4,1);
lcd.println(disCalculada);
}

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:

El reto es el siguiente: Modificar la melodía del ejemplo por otra conocida y encender un led cada vez que se abren las puertas.


En este reto se utiliza el sensor ultrasónico que detecta un objeto a determinada distancia, al hacerlo se abre la puerta (servo motor), se enciende una led en este caso roja, y a la vez se escucha una melodía (piezo). 
#include <LiquidCrystal.h>
#include <Servo.h>
Servo servo1; 
LiquidCrystal lcd (8,9,4,5,6,7); 
int puertoservo =3; 
int trig= 13;
int echo= 12;
int grados; 
int tmp=0; 
int pulsominimo=650; 
int pulsomaximo=2550;
float disCalculada;
int pinRojo = 11;
const int piezo = 2; 
const int tonos[] = {2637, 2637, 2637,2093, 2637,3136, 1568, 3136, 1568, 1319, 1760, 1976};
const int countTonos = 5;

void setup() 
{
  lcd.setCursor (4,1); 
  lcd.print ("Com-fis-Yadi");
  lcd.noBlink (); 
  delay(2000);

servo1.attach (puertoservo,pulsominimo, pulsomaximo); 
  pinMode (trig, OUTPUT);
  pinMode(echo, INPUT);
  pinMode (piezo, OUTPUT); 
  pinMode (pinRojo, OUTPUT);
  Serial.begin (9600);
}

void loop() {
 disCalculada = calcularDistancia();
  grados=servo1.read();
  Serial.println("--------");
  Serial.print("cm:");
  Serial.println(disCalculada);
  delay(200);
  if (disCalculada < 40 )
  { 
    tmp=100; 
   digitalWrite(pinRojo, HIGH); 
      
  for (int iTono = 0; iTono < countTonos; iTono++)
  
 {
 tone(piezo, tonos[iTono]); 
 delay(500);
  
    
     }
        }
     
       else

  {
    tmp=0; 
  
  digitalWrite(pinRojo, LOW); 

  noTone(piezo); 
  }  
  
delay (10); 
servo1.write (tmp); 
lcd.setCursor(1,1); 
lcd.print ("Distancia "); 
lcd.println(disCalculada); 
}
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;


    }

 

Video



Problemas Técnicos

Algunas de las situaciones técnicas que se me dificultaron fue la conexión de cables (pines), para resolverlo fue necesario utilizar la lupa que venía en las herramientas. 
En la manipulación de la protoboard y tarjeta de arduino, se me desprendió un pin quedando dentro de ésta,  por lo que tuve que utilizar unas pinzas que igual se encuentran en las herramientas para sacarlo.
Se me dificulto lograr que funcionara el servomortor, revisé la conexión y lo logré.
En la programación no funcionaba, entonces me devolvía a revisar el orden lógico y sintaxis hasta lograrlo.





Comentarios