CALCULO DE AREAS Y VOLUMENES UTILIZANDO EL SENSOR ULTRASONICO HC-SR04 CON ARDUINO
El sensor Ultrasónico HC-SR04 sirve para conocer la
distancia en que se encuentra algún objeto del Sensor. Funciona emitiendo un
sonido por el pin de disparo (Trigger), devolviendo en el pin de eco (echo) el
tiempo en micro segundos que tarda en rebotar en algún objeto.
He aquí un pequeño diagrama de como más o menos funciona
este sensor…
MATERIALES NECESARIOS
- ·
1 Tarjeta
Arduino UNO
- ·
HC-SR04
Modulo Sensor Ultrasónico
- ·
3
pulsadores
- ·
3
resistencias de 1K
- ·
3 Leds de
cualquier color
- ·
Puentes
de varios tipos
- ·
Protoboard
CALCULO DE ÁREAS
El primer ejercicio a realizarse
es que, utilizando los datos proporcionados por el sensor, podamos calcular el
área utilizando la formula Área=Dato1*Dato2. Cabe mencionar que
los datos 1 y 2, serán dados por el sensor.
¿Qué es lo que tiene que hacer el
programa?
- · Al accionar el primer pulsador, se va a guardar la distancia dada por el sensor en ese preciso momento en una variable. La primera Led se va a encender y se va a imprimir en pantalla “El valor de A es: [el dato]”.
- · Al accionar el segundo pulsador, se va a guardar la distancia dada por el sensor en ese preciso momento en otra variable. La segunda Led se va a encender y se va a imprimir en pantalla “El valor de B es: [el dato]”. Se calcula el área y se imprime en pantalla “El área es: [área]” y se enciende la tercera Led.
- · Al accionar el tercer pulsador, se reinicia el programa, apagando los tres leds.
El circuito va estar dado de la siguiente manera:
- 1.
Los tres pulsadores estarán conectados a los
pines 5, 6 y 7 del Arduino con sus respectivos resistores de 1k.
- 2.
Los tres Leds estarán conectados a los pines
11, 12 y 13 del Arduino.
- 3.
Los pines del Sensor HC-SR04, el Trigg y
Echo estarán conectados a los pines 9 y 8 respectivamente del Arduino.
El diagrama de conexiones se presenta a continuación:
La codificación en Arduino se va a hacer sin usar ninguna
Librería, solo utilizaremos la función “PulseIn”.
---------------------------------------------------------------------------------------------
int A;
int B;
int C;
int area;
const int pinecho = 8;
const int pintrigger = 9;
int tiempo,distancia;
int cont1=0,cont2=0,cont3=0;
void setup() {
pinMode(5,INPUT);
pinMode(6,INPUT);
pinMode(7,INPUT);
Serial.begin(9600);
pinMode(pinecho, INPUT);
pinMode(pintrigger, OUTPUT);
pinMode(13, OUTPUT);
pinMode(12, OUTPUT);
pinMode(11, OUTPUT);
}
void loop() {
areaa();
}
void sensor(){
// ENVIAR PULSO DE DISPARO EN EL PIN "TRIGGER"
digitalWrite(pintrigger, LOW);
delayMicroseconds(2);
digitalWrite(pintrigger, HIGH);
// EL PULSO DURA AL MENOS 10 uS EN ESTADO ALTO
delayMicroseconds(10);
digitalWrite(pintrigger, LOW);
tiempo = pulseIn(pinecho, HIGH);
// LA VELOCIDAD DEL SONIDO ES DE 340 M/S O 29 MICROSEGUNDOS POR CENTIMETRO
// DIVIDIMOS EL TIEMPO DEL PULSO ENTRE 58, TIEMPO QUE TARDA RECORRER IDA Y VUELTA UN CENTIMETRO LA ONDA SONORA
distancia = tiempo / 58;
}
void areaa(){
sensor();
delay(200);
if(digitalRead(5) == HIGH && cont1==0)
{
cont1=1;
A=distancia;
Serial.print("El valor A es: ");
Serial.print(A);
Serial.println(" cm");
digitalWrite(11,HIGH);
}
if(digitalRead(6) == HIGH && cont2 == 0)
{
cont2=1;
B=distancia;
Serial.print("El valor B es: ");
Serial.print(B);
Serial.println(" cm");
Serial.print("\n \n");
digitalWrite(12,HIGH);
}
if(cont1>0 && cont2>0){
area= A*B;
delay(1000);
Serial.print("El area es: ");
Serial.print(area);
Serial.println(" cm cuadrados");
digitalWrite(13,HIGH);
delay(500);
}
if(digitalRead(7) == HIGH){
Serial.print("Reinicio: \n \n");
digitalWrite(13,LOW);
digitalWrite(12,LOW);
digitalWrite(11,LOW);
delay(500);
cont1=0;
cont2=0;
A=0;
B=0;
distancia=0;
area=0;
}
}
---------------------------------------------------------------------------------------------
EXPLICACIÓN DE
CADA BLOQUE DE CÓDIGO.
Declaración de Variables y constantes
int A; (variable
entera para guardar el primer valor)
int B; (variable
entera para guardar el segundo valor)
int area; (variable
entera para guardar el área calculada)
const int pinecho = 8; (constante
entera referenciando el pin del Arduino (8) para el pin Echo del Sensor)
const int pintrigger = 9; (constante entera referenciando el pin del Arduino (9) para el pin Trig
del Sensor)
int tiempo,distancia; (variables
enteras, una para guardar el tiempo dado por el sensor y la otra para hacer el
cálculo de la distancia usando el tiempo).
int cont1=0,cont2=0; (variables para llevar el control de
los pulsadores)
Funcion Setup
(configuración de los
pines 5, 6 y 7 como entradas porque ahí están conectados los pulsadores.)
pinMode(5,INPUT);
pinMode(6,INPUT);
pinMode(7,INPUT);
Serial.begin(9600); (Preparar la comunicación serial)
pinMode(pinecho,
INPUT); (se configura el pin del Echo al pin 8 del Arduino como Entrada)
pinMode(pintrigger,
OUTPUT); (se configura el pin del Trig al
pin 9 del Arduino como Salida
(configuración de los
pines 11, 12 y 13 como Salidas ya que ahí están conectados los Leds.
pinMode(13, OUTPUT);
pinMode(12, OUTPUT);
pinMode(11, OUTPUT);
PROCEDIMIENTO sensor() , se crea el
siguiente procedimiento para obtener los datos del sensor, para cada vez que
necesitemos el dato, solo llamemos la función.
void sensor(){
// enviar pulso de
disparo en el pin "trigger"
digitalWrite(pintrigger, LOW);
delayMicroseconds(2);
digitalWrite(pintrigger, HIGH);
// el pulso dura al
menos 10 microsegundos en estado alto
delayMicroseconds(10);
digitalWrite(pintrigger, LOW);
tiempo =
pulseIn(pinecho, HIGH);(se guarda el tiempo que tardo en rebotar el pulso
utilizando la función PulseIn)
La velocidad del sonido es de 340 m/s o 29 microsegundos
por centímetro, dividimos el tiempo del pulso entre 58, tiempo que tarda
recorrer ida y vuelta un centímetro la onda sonora
distancia = tiempo /
58; (la distancia recorrida se guarda en la variable)
}
PROCEDIMIENTO areaa()
void areaa(){
sensor(); (se
llama la función que nos calcula la distancia en cm)
delay(200);
(cuando se pulsa el primer botón y la variable cont1 que
sirve como bandera para controlar que no se haya pulsado ya ese botón, sigue en
0)
if(digitalRead(5)
== HIGH && cont1==0)
{
cont1=1; (se le
asigna el valor de 1, indicando que ya se pulso el primer botón)
A=distancia; (la
variable A recibe la distancia dada por el sensor)
(se hace la impresión de los datos en pantalla)
Serial.print("El valor A es: ");
Serial.print(A);
Serial.println(" cm");
digitalWrite(11,HIGH); (se
enciende la primera led)
}
(cuando se pulsa el segundo botón y la variable cont2 que
sirve como bandera para controlar que no se haya pulsado ya ese botón, sigue en
0)
if(digitalRead(6)
== HIGH && cont2 == 0)
{
cont2=1; (se le
asigna el valor de 1, indicando que ya se pulso el segundo botón)
B=distancia; (la
variable B recibe la distancia dada por el sensor)
(se hace la impresión de los datos en pantalla)
Serial.print("El valor B es: ");
Serial.print(B);
Serial.println(" cm");
Serial.print("\n \n");
digitalWrite(12,HIGH); (se enciende la segunda led)
}
(condición para saber si ya se pulsaron los dos
pulsadores)
if(cont1>0
&& cont2>0){
area= A*B; (se
calcula el área)
delay(1000);
(se hace la impresión en pantalla)
Serial.print("El area es: ");
Serial.print(area);
Serial.println(" cm cuadrados");
digitalWrite(13,HIGH);(se enciende la tercera led)
delay(500);
}
(si se acciona el tercer pulsador)
if(digitalRead(7) ==
HIGH){
Serial.print("Reinicio: \n \n"); (se imprime Reinicio)
(se apagan todas las leds)
digitalWrite(13,LOW);
digitalWrite(12,LOW);
digitalWrite(11,LOW);
delay(500);
(se les asigna 0 a las variables que funcionan como
banderas)
cont1=0;
cont2=0;
(todas las variables las reiniciamos en 0)
A=0;
B=0;
distancia=0;
area=0;
}
}
EL setup()
(En este bloque solo llamamos el procedimiento creado
llamado areaa()).
void setup(){
areaa();
}
CALCULO DE VOLÚMENES
El segundo ejercicio consiste en que,
utilizando los datos proporcionados por el sensor, podamos calcular el volumen
utilizando la formula Volumen=Dato1*Dato2*Dato3. Casi lo
mismo que en el cálculo de áreas.
Para este ejercicio se va a
utilizar el mismo diagrama anterior, lo único que cambiara es el código de programación
del micro controlador.
¿Qué es lo que tiene que hacer el
programa?
- · Al accionar el primer pulsador, se va a guardar la distancia dada por el sensor en ese preciso momento en una variable. La primera Led se va a encender y se va a imprimir en pantalla “El valor de A es: [el dato]”.
- · Al accionar el segundo pulsador, se va a guardar la distancia dada por el sensor en ese preciso momento en otra variable. La segunda Led se va a encender y se va a imprimir en pantalla “El valor de B es: [el dato]”.
- · Al accionar el tercer pulsador, se va a guardar la distancia dada por el sensor en ese preciso momento en otra variable. La tercera Led se va a encender y se va a imprimir en pantalla “El valor de C es: [el dato]”. Se calcula el volumen y se imprime en pantalla “El volumen es: [volumen]”.
- · Si se acciona el tercer pulsador, habiendo ya calculado el volumen, se reinicia el programa, apagando los tres leds.
A continuación, el código del
programa
int A;
int B;
int C;
int volumen;
const int pinecho = 8;
const int pintrigger = 9;
int tiempo,distancia;
int cont1=0,cont2=0, cont3=0;
void setup() {
pinMode(5,INPUT);
pinMode(6,INPUT);
pinMode(7,INPUT);
// PREPARAR LA COMUNICACION SERIAL
Serial.begin(9600);
// CONFIGURAR PINES
DE ENTRADA Y SALIDA
pinMode(pinecho,
INPUT);
pinMode(pintrigger,
OUTPUT);
pinMode(13, OUTPUT);
pinMode(12, OUTPUT);
pinMode(11, OUTPUT);
}
void loop() {
volumenn();
}
void sensor(){
// ENVIAR PULSO DE
DISPARO EN EL PIN "TRIGGER"
digitalWrite(pintrigger, LOW);
delayMicroseconds(2);
digitalWrite(pintrigger, HIGH);
// EL PULSO DURA AL
MENOS 10 uS EN ESTADO ALTO
delayMicroseconds(10);
digitalWrite(pintrigger, LOW);
tiempo =
pulseIn(pinecho, HIGH);
// LA VELOCIDAD DEL
SONIDO ES DE 340 M/S O 29 MICROSEGUNDOS POR CENTIMETRO
// DIVIDIMOS EL
TIEMPO DEL PULSO ENTRE 58, TIEMPO QUE TARDA RECORRER IDA Y VUELTA UN CENTIMETRO
LA ONDA SONORA
distancia = tiempo /
58;
}
void volumenn(){
sensor();
delay(100);
if(digitalRead(5)
== HIGH && cont1==0)
{
cont1= 1;
A=distancia;
Serial.print("El valor A es: ");
Serial.print(A);
Serial.println(" cm");
digitalWrite(11,HIGH);
}
if(digitalRead(6)
== HIGH && cont2 == 0)
{
cont2=1;
B=distancia;
Serial.print("El valor B es: ");
Serial.print(B);
Serial.println(" cm");
digitalWrite(12,HIGH);
}
if(digitalRead(7)
== HIGH && cont3 == 0)
{
cont3=1;
C=distancia;
Serial.print("El valor C es: ");
Serial.print(C);
Serial.println(" cm");
digitalWrite(13,HIGH);
Serial.print("\n \n");
}
if(cont1>0
&& cont2>0 && cont3>0){
volumen= A*B*C;
delay(1000);
Serial.print("El volumen es: ");
Serial.print(volumen);
Serial.println(" cm cubicos");
}
if(digitalRead(7) ==
HIGH && cont3>0){
Serial.print("Reinicio: \n \n");
digitalWrite(13,LOW);
digitalWrite(12,LOW);
digitalWrite(11,LOW);
cont1=0;
cont2=0;
cont3=0;
A=0;
B=0;
C=0;
distancia=0;
volumen=0;
}
}
EXPLICACIÓN DE
CADA BLOQUE DE CÓDIGO.
Declaración de Variables y constantes
int A; (variable
entera para guardar el primer valor)
int B; (variable
entera para guardar el segundo valor)
int C; (variable
entera para guardar el tercer valor)
int volumen; (variable
entera para guardar el volumen calculado)
const int pinecho = 8; (constante
entera referenciando el pin del Arduino (8) para el pin Echo del Sensor)
const int pintrigger = 9; (constante entera referenciando el pin del Arduino (9) para el pin Trig
del Sensor)
int tiempo,distancia; (variables
enteras, una para guardar el tiempo dado por el sensor y la otra para hacer el
cálculo de la distancia usando el tiempo).
int cont1=0,cont2=0,cont3=0; (variables para llevar el
control de los pulsadores)
Funcion Setup
(configuración de los
pines 5, 6 y 7 como entradas porque ahí están conectados los pulsadores.)
pinMode(5,INPUT);
pinMode(6,INPUT);
pinMode(7,INPUT);
Serial.begin(9600); (Preparar la comunicación serial)
pinMode(pinecho,
INPUT); (se configura el pin del Echo al pin 8 del Arduino como Entrada)
pinMode(pintrigger,
OUTPUT); (se configura el pin del Trig al
pin 9 del Arduino como Salida
(configuración de los
pines 11, 12 y 13 como Salidas ya que ahí están conectados los Leds.
pinMode(13, OUTPUT);
pinMode(12, OUTPUT);
pinMode(11, OUTPUT);
PROCEDIMIENTO sensor() , se crea el
siguiente procedimiento para obtener los datos del sensor, para cada vez que
necesitemos el dato, solo llamemos la función. LOS DETALLES FUERON EXPLICADOS
EN EL PRIMER EJERCICIO YA QUE ES EL MISMO.
PROCEDIMIENTO volumenn()
void volumenn(){
sensor(); (se
llama la función que nos calcula la distancia en cm)
delay(200);
(cuando se pulsa el primer botón y la variable cont1 que
sirve como bandera para controlar que no se haya pulsado ya ese botón, sigue en
0)
if(digitalRead(5)
== HIGH && cont1==0)
{
cont1=1; (se le
asigna el valor de 1, indicando que ya se pulso el primer botón)
A=distancia; (la
variable A recibe la distancia dada por el sensor)
(se hace la impresión de los datos en pantalla)
Serial.print("El valor A es: ");
Serial.print(A);
Serial.println(" cm");
digitalWrite(11,HIGH); (se
enciende la primera led)
}
(cuando se pulsa el segundo botón y la variable cont2 que
sirve como bandera para controlar que no se haya pulsado ya ese botón, sigue en
0)
if(digitalRead(6)
== HIGH && cont2 == 0)
{
cont2=1; (se le
asigna el valor de 1, indicando que ya se pulso el segundo botón)
B=distancia; (la
variable B recibe la distancia dada por el sensor)
(se hace la impresión de los datos en pantalla)
Serial.print("El valor B es: ");
Serial.print(B);
Serial.println(" cm");
Serial.print("\n \n");
digitalWrite(12,HIGH); (se enciende la segunda led)
}
(cuando se pulsa el tercer botón y la variable cont3 que
sirve como bandera para controlar que no se haya pulsado ya ese botón, sigue en
0)
if(digitalRead(7)
== HIGH && cont3 == 0)
{
cont3=1; (se le
asigna el valor de 1, indicando que ya se pulso el segundo botón)
C=distancia; (la
variable recibe el dato de la distancia)
(se hace la impresión en pantalla)
Serial.print("El valor C es: ");
Serial.print(C);
Serial.println(" cm");
digitalWrite(13,HIGH); (se enciende la tercera led)
Serial.print("\n \n");
}
(condición para saber si ya se pulsaron los tres
pulsadores)
if(cont1>0
&& cont2>0 && cont3>0){
volumen= A*B*C; (se
calcula el volumen)
delay(1000);
(se imprimen los datos en pantalla)
Serial.print("El volumen es: ");
Serial.print(volumen);
Serial.println(" cm cubicos");
}
(si se acciona nuevamente el tercer pulsador se reinicia
el programa)
if(digitalRead(7) == HIGH && cont3>0){
Serial.print("Reinicio: \n \n");
(se apagan todas las leds)
digitalWrite(13,LOW);
digitalWrite(12,LOW);
digitalWrite(11,LOW);
(se reinician todas las variables en 0)
cont1=0;
cont2=0;
cont3=0;
A=0;
B=0;
C=0;
distancia=0;
volumen=0;
}
}
EL setup()
(En este bloque solo llamamos el procedimiento creado
llamado volumenn ()).
void setup(){
volumenn();
}
Comentarios
Publicar un comentario