Actualmente
mantengo la intención de desarrollar pequeños robots y autómatas con fines
didácticos y de ocio. Pero antes de acometer complejos y divertidos montajes, me
encuentro con la necesidad de desarrollar e implementar sensores y actuadores. Tener
las cosas bien claras a la hora de montarlos y los códigos de programa a mano
para adaptarlos rápidamente a los proyectos en curso. Incluso dejarlos ya
ensamblados en forma de bloques y no tener más que conectarlos.
Dos magnitudes muy comunes a la hora de aportar información a nuestros robots son la temperatura y la intensidad lumínica. Tras realizar breves consultas por internet, he visto dos componentes baratos y fáciles de usar: el LM35 y la fotocélula LDR.
Dos magnitudes muy comunes a la hora de aportar información a nuestros robots son la temperatura y la intensidad lumínica. Tras realizar breves consultas por internet, he visto dos componentes baratos y fáciles de usar: el LM35 y la fotocélula LDR.
En
la red hay multitud de tutoriales que me han ayudado a desarrollar mi propio
montaje con una tarjeta Arduino UNO y una placa protoboard. No considero malo
copiar a otros, pero entendiendo lo que están haciendo y transformándolo y
adaptándolo a mis necesidades y filosofía. Y por supuesto, mencionándoles
debidamente.
Tanto
el LM35 como la fotocélula LDR son sensores analógicos. Y dichos componentes
pasivos son leídos por las tarjetas Arduino gracias a analogRead(). Se trata de
una función que mide los valores de los pines analógicos especificados, que en
Arduino UNO son 6, de A0 a A5. Detrás de dichos pines lo que hay es un
conversor de analógico a digital de 6 canales. Tiene una resolución de 10 bits
y proporciona al microcontrolador ATmega328p valores enteros entre 0 y 1023
bits. Comentar brevemente que estos pines también se pueden usar como
digitales, por si nos vemos faltos de ellos.
El
LM35 es un sensor de temperatura hecho con semiconductores. Puede medir
temperaturas entre -55 ºC y 150 ºC. Trabaja con tensiones comprendidas entre
los 4 y 30 V. Una variación de 1 ºC en la temperatura se traduce en una variación
de 1 mV entre sus terminales. Pero como se ha comentado antes, el rango de valores
binarios que le llega al microcontrolador va de 0 a 2023. Es decir, la señal
analógica es "troceada" en 1024 valores. Para obtener la temperatura
en grados Celsius hemos de escalar la lectura según la fórmula:
La
fotorresistencia LDR es un componente pasivo cuya resistencia al paso de la
electricidad varía en función de la intensidad de luz que incide sobre él. A
medida que dicha intensidad aumenta, su resistencia óhmica disminuye. Además de
la intensidad de luz, el LDR reacciona a una gama amplia de frecuencias, entre
el infrarrojo y el ultravioleta. Con este transductor podemos hacer desde
sistemas de encendido automático de luces hasta robots seguidores de líneas ya
que es sensible a la luz emitida por un diodo led infrarrojo y reflejada en la
superficie de una pista.
De
cara a programar la tarjeta Arduino UNO hay muchos tutoriales. Pero
principalmente de forma separada: por un lado para LDR y por otro para LM35. Lo
que he hecho ha sido un programa para obtener las lecturas de los dos sensores.
En la placa protoboard he montado un
indicador de luminosidad con tres diodos led, especificando como umbrales
máximos y mínimos de luz los valores de 100 y 50, respectivamente, leídos
gracias a la función analogRead(). Por otro lado, para poder leer la
temperatura medida en el monitor serie, he usado la función Serial.begin()
configurada a la velocidad de 9600 bps. Un siguiente paso sería mostrar dicha
lectura en una pantalla LCD, pero es algo que ya he practicado y prefiero
dejarlo para proyectos definitivos.
Un
aplicación inmediata que se me ocurre de lo realizado es la siguiente. De la
misma manera que he configurado los leds, establecer una condición de luz
ambiental mínima para la activación de un sistema de riego nocturno. Y con la
temperatura leída, activar un ventilador o sistema de refrigeración.
Código de programa
//declaración de las variables globales que vamos a usar
float tempC; // Variable para almacenar los valores proporcionados por LM35
const int LDRPin = A0; // Variable del pin de entrada A0 para el sensor LDR
const int LM35Pin = A1; // Variable del pin de entrada A1 para el sensor LM35
const int LED_verde = 2;
const int LED_amarillo = 3;
const int LED_rojo = 4;
const int limite_superior = 100;
const int limite_inferior = 50;
void setup() {
Serial.begin(9600); // Configuramos el puerto serial a 9600 bps
pinMode(LED_verde, OUTPUT);
pinMode(LED_amarillo, OUTPUT);
pinMode(LED_rojo, OUTPUT);
pinMode(LDRPin, INPUT);
pinMode(LM35Pin, INPUT);
}
void loop() {
int input = analogRead(LDRPin); // Asignamos valores obtenidos de LDRPin a input
// Establecemos 3 condiciones para el encendido de los diodos led
if (input > limite_superior)
{
digitalWrite(LED_verde, HIGH);
digitalWrite(LED_amarillo, LOW);
digitalWrite(LED_rojo, LOW);
}
if (input <= limite_superior && input >= limite_inferior) /
{
digitalWrite(LED_verde, LOW);
digitalWrite(LED_amarillo, HIGH);
digitalWrite(LED_rojo, LOW);
}
if (input < limite_inferior)
{
digitalWrite(LED_verde, LOW);
digitalWrite(LED_amarillo, LOW);
digitalWrite(LED_rojo, HIGH);
}
int input_temperatura = analogRead(LM35Pin);
tempC = analogRead(LM35Pin);
tempC = (5.0 * tempC * 100.0)/1024.0; // Cálculo de la temperatura
Serial.print(tempC); // Envia el dato al puerto serial
Serial.print("\n"); // Salto de línea
delay (1000); // Detenemos el programa 1 segundo entre cada lectura
}
Código de programa
//declaración de las variables globales que vamos a usar
float tempC; // Variable para almacenar los valores proporcionados por LM35
const int LDRPin = A0; // Variable del pin de entrada A0 para el sensor LDR
const int LM35Pin = A1; // Variable del pin de entrada A1 para el sensor LM35
const int LED_verde = 2;
const int LED_amarillo = 3;
const int LED_rojo = 4;
const int limite_superior = 100;
const int limite_inferior = 50;
void setup() {
Serial.begin(9600); // Configuramos el puerto serial a 9600 bps
pinMode(LED_verde, OUTPUT);
pinMode(LED_amarillo, OUTPUT);
pinMode(LED_rojo, OUTPUT);
pinMode(LDRPin, INPUT);
pinMode(LM35Pin, INPUT);
}
void loop() {
int input = analogRead(LDRPin); // Asignamos valores obtenidos de LDRPin a input
// Establecemos 3 condiciones para el encendido de los diodos led
if (input > limite_superior)
{
digitalWrite(LED_verde, HIGH);
digitalWrite(LED_amarillo, LOW);
digitalWrite(LED_rojo, LOW);
}
if (input <= limite_superior && input >= limite_inferior) /
{
digitalWrite(LED_verde, LOW);
digitalWrite(LED_amarillo, HIGH);
digitalWrite(LED_rojo, LOW);
}
if (input < limite_inferior)
{
digitalWrite(LED_verde, LOW);
digitalWrite(LED_amarillo, LOW);
digitalWrite(LED_rojo, HIGH);
}
int input_temperatura = analogRead(LM35Pin);
tempC = analogRead(LM35Pin);
tempC = (5.0 * tempC * 100.0)/1024.0; // Cálculo de la temperatura
Serial.print(tempC); // Envia el dato al puerto serial
Serial.print("\n"); // Salto de línea
delay (1000); // Detenemos el programa 1 segundo entre cada lectura
}
Webs consultadas
. Para cualquier duda, sugerencia, congratulación, desacuerdo o diferencias, mi correo electrónico es: amsanz83@gmail.com Sígueme en https://wikitree.es/maria-reiche/
ResponderEliminar