Introduction: Jugando Con Sensores Y Arduino

About: Somos el espacio de imaginación, experimentación y prototipado de la PUCV.

¡Hola a tod@s! ¿List@ para aprender un poco más sobre Arduino y sensores? En esta ocasión vamos revisar y entender cómo hacer lectura de los diversos sensores disponibles en Tinkercad Circuits, los que a su vez son representaciones de los reales, por lo que si estas usando una Arduino real ¡Puedes seguir este instructivo de todas maneras!

Si estas con ganas de probar antes de construir puede revisar este link, donde está la simulación terminada en Tinkercad, los objetivos de hoy son:

  1. Aprender a usar diversos sensores con Arduino.
  2. Apreciar y considerar ciertos detalles asociados a los sensores.

Supplies

Los materiales a usar son:

  • 1 X Arduino UNO.
  • 1 X Protoboard.
  • 1 X Sensor HC SR04.
  • 1 X Sensor PIR.
  • 1 X Fotorresistencia 180k Ohm
  • 1 X Sensor TMP36.
  • 1 X Sensor SW 200D.
  • 1 X Sensor MQ-6.
  • 1 X Resistencia 10k Ohm.
  • 1 X Resistencia 20k Ohm.
  • 2 X Resistencia 1k Ohm.
  • 1 X Capacitor 100 nF.
  • Jumpers/Cables varios.

Step 1: ¡Preparemos La Base Para Trabajar!

Primero que nada debemos abrir Tinkercad Circuits y poner nuestra Arduino y protoboard para trabajar, entonces:

  1. En los componentes básicos buscamos una Arduino Uno y la arrastramos al entorno de trabajo (imagen 1).
  2. Cambiamos la pestaña de componentes básicos a todos (imagen 2).
  3. Buscamos la placa de desarrollo más grande y la posicionamos al lado de la Arduino (imagen 3).
  4. Conectamos la alimentación de la Arduino a la protoboard tal cual se ve en la imagen 4.

¡Parte Completada!

Step 2: ¡Agreguemos Los Componentes! - HC SR04

Para poner el sensor de distancia en el espacio de trabajo debemos:

  1. Buscar HC SR04 dentro de los componentes y arrastrarlo al espacio de trabajo (imagen 1).
  2. Conectarlo a Arduino (trig a pin 6 y eccho a pin 5) y a las lineas de alimentación (imagen 2).

¡Listo!

Step 3: ¡Agreguemos Los Componentes! - Sensor PIR

Para poner el sensor de movimiento en el espacio de trabajo debemos:

  1. Buscar Sensor PIR dentro de los componentes y arrastrarlo al espacio de trabajo (imagen 1).
  2. Conectarlo a Arduino (señal a pin A4) y a las lineas de alimentación (imagen 2).

¡Pasemos al siguiente sensor!

Step 4: ¡Agreguemos Los Componentes! - TMP36

Para poner el sensor de temperatura en el espacio de trabajo debemos:

  1. Buscar Sensor TMP36 dentro de los componentes y arrastrarlo al espacio de trabajo (imagen 1).
  2. Conectarlo a Arduino (señal a pin A5) y a las lineas de alimentación (imagen 2).

¡Pasemos al siguiente!

Step 5: ¡Agreguemos Los Componentes! - Fotorresistencia

Para poner el sensor de luminosidad en el espacio de trabajo debemos:

  1. Buscar la fotorresistencia (ldr) dentro de los componentes y arrastrarlo al espacio de trabajo (imagen 1).
  2. Agregamos una resistencia entre un pin del ldr y 5 V y le cambiamos el valor a 1k Ohm (imagen 2).
  3. Conectarlo a Arduino (señal a pin A1) y a las lineas de alimentación (imagen 3).

Step 6: ¡Agreguemos Los Componentes! - SW 200D

Para poner el sensor de inclinación en el espacio de trabajo debemos:

  1. Buscar el SW 200D dentro de los componentes y arrastrarlo al espacio de trabajo (imagen 1).
  2. Agregamos una resistencia entre un pin del sensor y tierra, le cambiamos el valor a 1k Ohm (imagen 2).
  3. Agregamos otra resistencia entre un pin del sensor y 5 V, le cambiamos el valor a 10k Ohm (imagen 3).

  4. Agregamos un capacitor al lado de la resistencia de 10k Ohm, le cambiamos el valor a 100 nF (imagen 4).

  5. Conectarlo a Arduino (señal a pin A2) y a las lineas de alimentación (imagen 5).

¡Solo queda uno!

Step 7: ¡Agreguemos Los Componentes! - MQ-6

Para agregar el sensor de gas debemos seguir los siguientes pasos:

  1. Buscar el sensor entre los componentes y arrastrarlo a la protoboard (imagen 1).
  2. Buscar la resistencia, arrastrarla al espacio de trabajo y rotarla presionando el botón de rotación 3 veces, luego cambiar su valor a 20k Ohm (imagen 2).
  3. Luego posicionarla en la parte mostrada en la imagen 3 y conectarla a tierra.
  4. Realizar las conexiones a alimentación (5 V) y Arduino (pin de señal a A3).

¡Terminamos!

Step 8: ¡Hora De Programar!

El programa que entenderemos ahora es:

float movimiento  = 0;
float luminosidad = 0;
float distancia = 0;
float temperatura = 0;
float inclinado = 0;
float gas = 0;

void setup()
{
Serial.begin(9600);
pinMode(6, OUTPUT);
pinMode(5, INPUT );
}

void loop()
{
movimiento = analogRead(A4)/1023.0 ;
luminosidad = map(analogRead(A1),1017,344, 0, 100);
temperatura = map(analogRead(A5),20,358,-40,125) ;
inclinado = analogRead(A2)/1023.0 ;
gas = map(analogRead(A3),660,939,0,100) ;
hsr04();
imprimir();
delay(10);
}
// Para TEMP36
// -40ºc son 100 mv hasta 125ºc
// 20 mV/ºc
void hsr04()
{
digitalWrite(6, LOW);
delayMicroseconds(2);
// Poner trigger pin en HIGH por 10 microsegundos
digitalWrite(6, HIGH);
delayMicroseconds(10);
digitalWrite(6, LOW);
// leer pin echo en microsegundos y hace la equivalencia en cm
distancia = 0.01723 * pulseIn(5, HIGH);
}

void imprimir()
{
Serial.print("Luminosidad[%] = ");
Serial.print(luminosidad);
Serial.print('\t');
Serial.print("Movimiento = ");
if(movimiento < 0.5) Serial.print("No");
else Serial.print("Si");
Serial.print('\t');
Serial.print("Temperatura[ºC] = ");
Serial.print(temperatura);
Serial.print('\t');
Serial.print("Inclinado = ");
if(inclinado < 0.5) Serial.print("Si");
else Serial.print("No");
Serial.print('\t');
Serial.print("Gas[%] = ");
Serial.print(gas);
Serial.print('\t');
Serial.print("Distancia[cm] = ");
Serial.println(distancia);
}

Se declaran las siguientes variables globales:

float movimiento  = 0;
float luminosidad = 0;
float distancia = 0;
float temperatura = 0;
float inclinado = 0;
float gas = 0;

Cada una de estas es usada para guardar el valor adaptado de los distintos sensores, son de tipo float para que estas puedan admitir decimales, con respecto a la función void setup(){} se tiene que:

void setup()
{
Serial.begin(9600);
pinMode(6, OUTPUT);
pinMode(5, INPUT );
}

Primero podemos observar la función Serial.begin(9600) la cual habilita la comunicación serial entre el Arduino y el computador con una velocidad de 9600 baudios (los baudios son una forma de especificar la velocidad a la que los datos se transmiten), luego tenemos la función pinMode(A,B) donde especificamos si el pin A va a ser usado como entrada (INPUT) o salida (OUTPUT).

Nos detendremos un momento en la función que maneja el sensor de distancia:

void hsr04()
{
digitalWrite(6, LOW);
delayMicroseconds(2);
// Poner trigger pin en HIGH por 10 microsegundos
digitalWrite(6, HIGH);
delayMicroseconds(10);
digitalWrite(6, LOW);
// leer pin echo en microsegundos y hace la equivalencia en cm
distancia = 0.01723 * pulseIn(5, HIGH);
}

void hsr04(){} realiza el manejo del sensor del mismo nombre, primero que nada establece al pin 6 (trig) en estado LOW para luego de una pequeña pausa volver a ponerlo en HIGH, esto genera que el sensor emita una señal ultrasónica, 10 microsegundos después se pone en estado bajo, finalmente pasamos a asignar un valor a la variable distancia mediante la función pulseIn(A,B) la que cuenta el tiempo en que en el pin A está el estado HIGH, valor que es transformado a centímetros mediante el factor de 0.01723.

La siguiente función a revisar es void imprimir(){}:

void imprimir()
{
Serial.print("Luminosidad[%] = ");
Serial.print(luminosidad);
Serial.print('\t');
Serial.print("Movimiento = ");
if(movimiento < 0.5) Serial.print("No");
else Serial.print("Si");
Serial.print('\t');
Serial.print("Temperatura[ºC] = ");
Serial.print(temperatura);
Serial.print('\t');
Serial.print("Inclinado = ");
if(inclinado < 0.5) Serial.print("Si");
else Serial.print("No");
Serial.print('\t');
Serial.print("Gas[%] = ");
Serial.print(gas);
Serial.print('\t');
Serial.print("Distancia[cm] = ");
Serial.println(distancia);
}

Esta función consiste principalmente en llamar a Serial.print(A), donde A es lo que se desea mostrar por comunicación serial, tenemos por ejemplo Serial.print("Luminosidad[%] = ") que muestra una serie de caracteres, Serial.print(luminosidad) muestra la variable luminosidad, Serial.print('\t') donde \t es un carácter especial que genera un espaciado constante entre luminosidad y lo que sea que se muestre luego.

Finalmente revisamos la función void loop(){}:

void loop()
{
movimiento = analogRead(A4)/1023.0 ;
luminosidad = map(analogRead(A1),1017,344, 0, 100);
temperatura = map(analogRead(A5),20,358,-40,125) ;
inclinado = analogRead(A2)/1023.0 ;
gas = map(analogRead(A3),660,939,0,100) ;
hsr04();
imprimir();
delay(10);
}

Para modificar las lecturas realizadas mediante analogRead(A) se usan dos formas distintas, una es el escalamiento directo al dividir por 1023.0 (el .0 es importante ya que de no especificarse el resultado será sin decimales), esto genera valores de 0 a 1 cuya interpretación podría ser de 0% a 100% del nivel de la señal de entrada, la otra forma es mediante la función map(A,B,C,D,E) que nos dice "cambia la variable A que tiene un rango de valores entre B y C a otra que tenga el mismo comportamiento, pero en un rango de D a E".

¡Listo!

Step 9: ¡Revisemos Las Lecturas Mediante El Monitor Serial!

Revisemos el vídeo de como funciona juntos.

Step 10: ¿Por Qué Las Cosas Funcionan?

El sensor HC SR04 es capaz de medir distancias mediante el uso de ultrasonido ¿Ultra-qué? Son ondas de sonoras que los humanos no pueden oír ¿Te fijaste que el sensor tiene algo así como dos tamborsitos? Uno es usado para emitir (trig) este sonido el cual, una vez impacta un objeto, rebota, el tiempo que se demora en ir y rebotar hasta el segundo "tambor" (echo) es lo que se usa para medir la distancia, ya que si se sabe a qué velocidad viaja el sonido y se tiene el tiempo de viaje, se puede obtener la distancia.

La fotorresistencia cambia su resistencia interna a medida que le llega o no luz, si hay poca, su valor está más cercana a los 180k Ohm, mientras que si esta a pleno sol, su resistencia disminuye a valores muy bajos (entre 100 y 10 Ohms). Para el caso del sensor de temperatura y de gas, tienen el mismo tipo de comportamiento ante las variables que miden.

El sensor SW 200D encapsula dos pelotitas metálicas que cuando hay determinada orientación el contacto se cierra y deja conducir electricidad, funciona casi igual que un pulsador, solo que en vez de pulsar para activarlo se cambia la orientación.