Prácticas de Sensores Con Arduino H.M
Prácticas de Sensores Con Arduino H.M
sensores con
arduino
1. SENSOR DE INCLINACIÓN
Los sensores de inclinación (interruptor de bola de inclinación) le permiten
detectar orientación o inclinación. Son pequeños, económicos, de bajo
consumo y fáciles de usar. Si se usan correctamente, no se desgastarán. Su
simplicidad los hace populares para los juguetes, los adminículos y los
aparatos. A veces, se conocen como "interruptores de mercurio", "interruptores
de inclinación" o "sensores de bola rodante" por razones obvias. Se componen
generalmente de una cavidad de una cierta clase (cilíndrica es popular, aunque
no siempre) con una masa libre conductora adentro, tal como una gota del
mercurio o bola rodante. Un extremo de la cavidad tiene dos elementos
conductores (polos). Cuando el sensor está orientado de tal manera que dicho
extremo está hacia abajo, la masa rueda sobre los polos y los cortocircuitos,
actuando como un interruptor de tiro. Aunque no es tan preciso ni flexible como
un acelerómetro completo, los interruptores de inclinación pueden detectar
movimiento u orientación. Otro beneficio es que los grandes pueden cambiar
de energía por su cuenta. Los acelerómetros, por otro lado, producen voltaje
digital o analógico que luego deben analizarse utilizando circuitos extra.
No es una tecnología reciente, pues llevan en uso mucho tiempo, pero antes se
hacían con una gotita de mercurio líquido, que es conductor y que al desplazarse
por el interior del cilindro acababa por cerrar el circuito entre un par de contactos
en el fondo.
Pero dado que el mercurio es sumamente toxico para el entorno y para las
personas que lo manejan, hace ya bastante tiempo que se han reemplazado por
el modelo que vamos a usar, aunque aún es fácil encontrarnos con que se siguen
llamando interruptores de mercurio.
ESQUEMA DE CONEXIÓN
Vamos a usar el mismo esquema de conexión que con un interruptor normal. Por
ello necesitamos usar una resistencia de pullup, y según el valor que leamos
encendemos o apagamos un LED conectado al pin 13.
• Por una vez, y sin que sirva de precedente conectaremos el LED al pin 13
sin resistencia, porque este pin ya lleva una en serie. Para cualquier otro pin
deberíamos poner una resistencia de limitación o veremos un bonito plof con el
LED.
PROGRAMA DE CONTROL
int inPin = 2;
int outPin = 13;
int lectura;
int previo = LOW;
long time = 0; // Para guardar la hora de la inversion de valor
long debounce = 50; // Tiempo de rebote
void setup()
{
pinMode(inPin, INPUT_PULLUP);
pinMode(outPin, OUTPUT);
}
void loop()
{
lectura = digitalRead(inPin);
if (lectura = previo) // Si hay cambio en la lectura
time = millis();
if ((millis() - time) > debounce)
digitalWrite(outPin, lectura);
previo = lectura ;
}
El pin central es el de señal, pero para saber cuál es GND y 5V, el encapsulado
tiene una cara plana y otra curva. Poniendo la cara plana mirando hacia vosotros
con las patas hacia abajo, el pin de la izquierda es alimentación 5V y
naturalmente el otro es GND.
• SI conectáis la tensión al revés, Tendréis tiempo de reaccionar y
cambiarla, pero mucho cuidado porque se calentará más que suficiente para
haceros una quemadura dolorosa.
• Si veis que está caliente no tratéis de sacarlo con los dedos, simplemente
desconectad el Arduino y dadle un rato para que se enfríe.
ESQUEMA ELECTRÓNICO DEL CIRCUITO
Vamos a montar un pequeño circuito que lea la temperatura de un sensor,
imprima el valor en el monitor serial y encienda un diodo cuando esta sobrepase
un cierto umbral. Aquí tenemos el esquema electrónico:
CALCULANDO LA TEMPERATURA.
El fabricante del LM35DZ nos dice que la salida de tensión será de 10 mV (mili
voltios) por cada grado de temperatura y además sabemos que
nuestro Arduino mide en las puertas analógicas una máximo de 1.024 para 5V
(y 0 para 0V), por tanto, para una lectura dada, el valor en voltios de la medida
será:
Y como cada voltio equivale a 100ºC (1V / 10mv = 100), la temperatura en grados
Celsius es resultado de multiplicar esto por 100. El LM35DZ empieza en 0º
Resumiendo. Para calcular la temperatura en ºC a partir de la lectura de Arduino:
Puedes encontrar cantidad de sensores similares a estos con diferentes rangos
de medida, , pero puedes usar este mismo método para calibrar la medida.
Así pues, ya tenemos claro como calcular la temperatura, pero como vemos por
ahí que tenemos divisiones, nos conviene utilizar nuestra primera variable de tipo
float, o sea que va a tener decimales.
La tendencia natural es usar int para todo, pero normalmente en cuanto
haya una división de por medio conviene usar un float.
Cada vez que tomemos una muestra de nuestra entrada analógica vamos a
calcular la temperatura y si sobrepasa el umbral definido, damos orden de
activar la alarma, en caso contrario la apagamos.
Como la temperatura es algo que varía lentamente usaremos un delay para que
solo nos dé una medida por segundo.
EL PROGRAMA DE CONTROL
En primer lugar vamos a definir un par de variables:
int Sensor = 0 ;
int umbral = 25 ;
Sensor es el pin analógico (A0) al que conectamos el sensor de temperatura y
umbral el valor a partir del cual disparamos la alarma de temperatura.
El valor de umbral habrá que ajustarlo en función de la temperatura
ambiente donde esté montando el circuito.
En principio 25ºC son buenos para que si quieres subir la temperatura, lo
puedes hacer simplemente soplando o manteniendo entre los dedos el
sensor. Otro sistema de subir la temperatura rápido, es poner el sensor al
lado de la salida de refrigeración de un portátil.
Y pasando los cálculos de la página anterior al IDE de arduino nos quedaría algo
parecido a:
void loop ()
{
int lectura = analogRead(Sensor);
float voltaje = 5.0 /1024 * lectura ;
float temp = voltaje * 100 ;
Serial.println(temp) ;
delay(1000);
}
Importante: En la línea donde calculamos el voltaje hemos escrito 5.0 y no
5. Esto es para evitar que IDE de arduino intente hacer una división entre
enteros y nos desprecie los decimales.
Ya solo nos resta comprobar si la temperatura alcanza el umbral y encender el
LED o apagarlo.
¿QUÉ ES UN VENTILADOR?
Un ventilador es una máquina hidráulica que incrementa la energía cinética de
un gas, normalmente aire. Los ventiladores son objetos comunes en nuestra vida
cotidiana y, al igual que otros muchos dispositivos, podemos controlarlos desde
un procesador como Arduino.
Un ventilador dispone de un rotor con alabes (o aspas) accionado,
habitualmente, por un motor eléctrico. Al rotar, los alabes impulsan las moléculas
de aire aumentando su energía cinética sin apenas variación de volumen, motivo
por el cual se consideran máquinas hidráulicas en lugar de turbo máquinas.
En el campo de la electrónica casera es frecuente emplear ventiladores como
los utilizados en informática para disipación de calor en ordenadores. Estos
ventiladores se encuentran disponibles en una gran variedad de tamaños, siendo
frecuentes 40x40mm, 80x80mm y 120x120mm. La tensión de alimentación
normalmente es 12V.
Industrialmente los ventiladores se emplean en todo tipo de aplicaciones, como
control de temperatura, instalaciones de climatización, homogenización de
gases, evacuación de humos, refrescamiento de maquinaria, o disipación de
calor en sistemas de refrigeración.
void setup()
{ Serial.begin(115200);
pinMode(control, OUTPUT) ;
}
void loop()
{ int lectura = analogRead(Sensor);
float voltaje = 5.0 /1024 * lectura ;
float temp = voltaje * 100 -5 ;
Serial.println(temp) ;
delay(200);
}
Finalmente, conectamos la salida digital del sensor a una entrada digital para
leer el estado del sensor.
void setup() {
Serial.begin(9600); //iniciar puerto serie
pinMode(sensorPin , INPUT); //definir pin como entrada
}
void loop(){
int value = 0;
value = digitalRead(sensorPin ); //lectura digital de pin
if (value == HIGH) {
Serial.println("Detectado obstaculo");
}
delay(1000);
}
V=R*I
EN SERIE EN PARALELO
La pregunta del millón ahora es ¿Si medimos entre las dos resistencias cuanto
es Vout? Pues igual de fácil:
Fíjate que el LDR R1, junto con R2 forma un divisor de tensión. La lectura de
A0 dependerá de la luz que incida en el LDR. El esquema de protoboard es
igual de fácil:
int tono[ ] = {261, 277, 294, 311, 330, 349, 370, 392, 415, 440,466, 494};
void setup()
{
pinMode (pinBuzzer , OUTPUT) ;
}
void loop()
{
int p = analogRead(A0) ;
int n = map (p, 500,1024, 0, 12) ; // El array solo tiene 12 notas
tone(pinBuzzer, tono[n]);
delay(300);
}
PROGRAMA DE CONTROL
El programa es de lo más simple. Solo tenemos que leer la caída de tensión en
el divisor y mandar una señal acústica con el buzzer en cuanto el valor de la
lectura en A0 sobrepase un cierto umbral. Vamos a recuperar, además, la
función Beep () que escribimos en la sesión Buzzers o zumbadores, para dar el
tono de alarma cuando se detecte una llama. Lo que hace el programa es leer el
pin A0 y si su valor sobrepasa un mínimo (para evitar los falsos positivos) llama
a la función beep () para dar la alarma.
Nota: Normalmente hay que calibrar la sensibilidad del sensor. Para ello
hay que ver que valores te devuelve en tu caso concreto y afinar este valor
umbral, para que no esté pitando continuamente.
Los sensores en placa, suelen venir con un potenciómetro, que hay que
ajustar para calibrar la sensibilidad el detector.
Digitar el siguiente programa:
int flame=A5;//Define flame interface as analog interface
int Beep=8;//Define buzzer interface as digital interface
int val=0; //Define digital variables.
val void setup()
{
pinMode(Beep,OUTPUT);//Set LED as output
pinMode(flame,INPUT);//Set buzzer as input
Serial.begin(9600);//Set baud rate as 9600
}
void loop()
{
val=analogRead(flame);//Read the analog value
from flame sensor
Serial.println(val);//Output analog value and print it out
if(val>=600)//When analog value ¡µ600£¬buzzer make sound
{
digitalWrite(Beep,HIGH);
}
else
{
digitalWrite(Beep,LOW);
}
}
eléctrica diferencial, que es captada por el sensor, y se emite una señal digital.
El otro elemento restante para que todo funcione es la óptica del sensor.
Básicamente es una cúpula de plástico formada por lentes de fresnel, que divide
el espacio en zonas, y enfoca la radiación infrarroja a cada uno de los campos
del PIR. De esta manera, cada uno de los sensores capta un promedio de la
radiación infrarroja del entorno. Cuando un objeto entra en el rango del sensor,
alguna de las zonas marcadas por la óptica recibirá una cantidad distinta de
radiación, que será captado por uno de los campos del sensor PIR, disparando
la alarma.
ESQUEMA DE CONEXIÓN
Estos sensores PIR pueden disparar directamente una alarma con una señal de
3.3V y son capaces de excitar pequeños relés, de modo que no necesitáis micro
controladores, si lo único que queréis es encender una luz o dispara una alarma.
Por eso vamos a hacer, en primer lugar, un pequeño circuito de prueba como
este, de modo que nos sirva para probar el sensor, y percibas que se puede usar
directamente. Vamos a montar un circuito sencillo de detección de movimiento
que encienda una LED cuando perciba algo:
Precisar que hay 3 pines en el lateral, que usaremos para pinchar el sensor
PIR HC-SR501 a nuestra protoboard, y aquí debajo os pongo el esquema de
conexiones:
Como puedes ver, hay un par de potenciómetros que podemos usar para
ajustarlo además de un jumper para elegir el modo de funcionamiento.
AJUSTANDO EL SENSOR
Precisar que el modelo de la imagen este jumper no existe, pero la mayor parte
de los modelos que veras por ahí puedes seleccionar H o L, conectando el
jumper entre el pin central y la selección deseada o bien dejarlo sin conectar.
Cuando colocamos el sensor en la posición L, al detectar algo el LED se
encenderá, y al poco se apagará y hará una cadencia tipo blinking LED
dependiendo de lo que detecte. A este modo se le llama no retriggering y no
suele ser demasiado interesante.
Si lo ponemos en H, cuando detecte movimiento se encenderá y mantendrá así
durante un tiempo (Llamado retrigger mode) y suele ser más conveniente en
buena parte de los circuitos prácticos. Para ajustar la sensibilidad podemos usar
uno de los potenciómetros que incluye el sensor, fijaras en la imagen de arriba.
(Girando a favor del reloj aumentamos la sensibilidad). El segundo
potenciómetro ajusta el tiempo que estará activa la señal de detección después
de que esta haya desaparecido. Pero parece que también afecta al retraso con
que inicia la alarma, así que es cuestión de que vayas jugando para encontrar
un punto adecuado para vuestra alarma.
ESQUEMA MONTAJE
EJEMPLO DE CÓDIGO
El código necesario para realizar la lectura es simple. Simplemente leemos la
salida del PIR, y hacemos parpadear el LED mientras la señal esté activa.
Digitar el siguiente programa:
const int LEDPin= 13;
const int PIRPin= 2;
void setup()
{
pinMode(LEDPin, OUTPUT);
pinMode(PIRPin, INPUT);
}
void loop()
{
int value= digitalRead(PIRPin);
if (value == HIGH)
{
digitalWrite(LEDPin, HIGH);
delay(50);
digitalWrite(LEDPin, LOW);
delay(50);
}
else
{
digitalWrite(LEDPin, LOW);
}
}
const int LEDPin= 13;
const int PIRPin= 2;
void setup()
{
pinMode(LEDPin, OUTPUT);
pinMode(PIRPin, INPUT);
}
void loop()
{
int value= digitalRead(PIRPin);
if (value == HIGH)
{
digitalWrite(LEDPin, HIGH);
delay(50);
digitalWrite(LEDPin, LOW);
delay(50);
}
else
{
digitalWrite(LEDPin, LOW);
}
}
Si quisiéramos ejecutar una acción una única vez al detectar movimiento, en
lugar de todo el tiempo que la señal este activa, usaríamos el siguiente
código.
const int LEDPin = 13; // pin para el LED
const int PIRPin = 2; // pin de entrada (for PIR sensor)
{
digitalWrite(LEDPin, HIGH); //LED ON
if (pirState == LOW) //si previamente estaba apagado
{
Serial.println("Sensor activado");
pirState = HIGH;
}
}
else //si esta desactivado
{
digitalWrite(LEDPin, LOW); // LED OFF
if (pirState == HIGH) //si previamente estaba encendido
{
Serial.println("Sensor parado");
pirState = LOW;
}
}
}
const int LEDPin = 13; // pin para el LED
const int PIRPin = 2; // pin de entrada (for PIR sensor)
int pirState = LOW; // de inicio no hay movimiento
int val = 0; // estado del pin
void setup()
{
pinMode(LEDPin, OUTPUT);
pinMode(PIRPin, INPUT);
Serial.begin(9600);
}
void loop()
{
val = digitalRead(PIRPin);
if (val == HIGH) //si está activado
{
digitalWrite(LEDPin, HIGH); //LED ON
if (pirState == LOW) //si previamente estaba apagado
{
Serial.println("Sensor activado");
pirState = HIGH;
}
}
else //si esta desactivado
{
digitalWrite(LEDPin, LOW); // LED OFF
if (pirState == HIGH) //si previamente estaba encendido
{
Serial.println("Sensor parado");
pirState = LOW;
}
}
}
El motivo de dividir por dos el tiempo (además de la velocidad del sonido en las
unidades apropiadas, que hemos calculado antes) es porque hemos medido el
tiempo que tarda el pulso en ir y volver, por lo que la distancia recorrida por el
pulso es el doble de la que queremos medir.
ESQUEMA ELÉCTRICO
ESQUEMA MONTAJE
EJEMPLO DE CÓDIGO
void setup() {
Serial.begin(9600);
pinMode(LedPin, OUTPUT);
pinMode(TriggerPin, OUTPUT);
pinMode(EchoPin, INPUT);
}
void loop() {
int cm = ping(TriggerPin, EchoPin);
Serial.print("Distancia: ");
Serial.println(cm);
delay(1000);
}
int ping(int TriggerPin, int EchoPin)
{
long duration, distanceCm;