Lista de materiales para este tutorial
Pieza | Cantidad | |
---|---|---|
FOTORESISTENCIA GL5516 LDR 10k | 2 | |
Resistencias 1/4 W - 10K | 2 | |
Servo 9g SG90 Microservo | 1 | |
Arduino UNO R3 Compatible ATMEGA328 | 1 | |
40 x Cables Macho-Macho 20cm jumper dupont 2.54 | 1 |
En este tutorial vamos a aprender a controlar la posición en grados de un servo mediante dos LDR. Si quieres aprender cómo funciona internamente el sensor LDR te recomendamos que visites el tutorial de ¿Qué es una fotoresistencia?.
En los siguientes esquemas os mostramos gráficamente cómo conectarlo.Con Arduino Uno
Con Arduino Mega
Con Arduino Nano
Ya
lo tenemos todo listo para pasar a la programación. Vamos a realizar un programa que tome la lectura por la entrada analógica de cada uno de los dos sensores LDR (izquierda y derecha) y en función de la intensidad de luz captada en cada uno de los dos, al motor se mueva a la posición más optima de luz. Este sencillo ejemplo puede ser usado por ejemplo para mover una pequeño panel solar a la zona de mayor incidencia de luz para ser más eficiente.
Para ello vamos a explicar las funciones que vamos a usar dentro de nuestro Arduino IDE:
SETUP()
En nuestro software Arduino, la función setup es una función que solo se ejecuta en el encendido de nuestro Arduino, por lo que aquí es donde pondremos la configuración de los pines (pinMode), los iniciadores (begin) que puede tener cualquier librería que hayamos añadido o cualquier configuración del aparato o variables que queremos que se realicen durante el encendido.
#INCLUDE
Instrucción que utilizamos para añadir una libreria o header externo que necesitemos para programar nuestra placa. En este tutorial lo usamos para llamar a la librería DHT, sensor que hemos instalado con anterioridad.
LOOP()
En nuestro software Arduino, la función loop es una función que se ejecuta en bucle (continuamente) mientras nuestro arduino está en marcha de manera secuencial, es decir, en orden de líneas que existen dentro del loop. En ella pondremos todas las funciones y chequeos que va a realizar durante su ciclo normal de trabajo: lectura de sensores, encendido y apagado de leds, cálculos que necesitemos realizar con la captura de los sensores,...
SERVO()
Con esta instrucción declaramos que vamos a usar un servo en nuestro programa. Su estructura es Servo NombredelServo. El NombredelServo es un nombre que daremos nosotros para identificarlo dentro del programa.
DELAY()
El comando delay se utiliza para añadir un tiempo de espera en el programa. Esta función tiene la siguiente estructura: delay(tiempo de espera en milisegundos), donde en tiempo de espera en milisegundos pondremos los milisegundos que queremos que espere el programa para continuar.
ATTACH()
Esta instrucción se usa siempre que tengamos servos en nuestros programa. Lo pondremos dentro del bucle setup. Su estructura es NombredelServo.atttach(pin al que esta conectado). Con esto declaramos que hay un servo conectado al pin que indicamos para que la librería Servo.h de arduino lo reconozca.
WRITE()
Esta función se utiliza para decirle al servo que se mueva a una posición determinada en grados. Su estructura es NombredelServo.write(posicion en grados).
SERIAL.BEGIN()
Esta instrucción se utiliza dentro del Setup() para iniciar la comunicación serial en nuestro arduino. Su estructura es Serial.begin(baudrate de comunicación), introduciendo en el baudrate de comunicación la velocidad que queremos de la conexión serie (siendo generalmente por defecto 9600).
SERIAL.PRINT()
Esta instrucción se utiliza para escribir en la consola serial un texto o dato. Su estructura es Serial.print(texto o dato a imprimir), donde en texto o dato a imprimir introduciremos el nombre de la variable que queremos que muestre o un texto (debería ir entrecomillado "").
SERIAL.PRINTLN()
Lo mismo que el Serial.print() pero inserta un salto de línea tras escribir el texto. Su estructura Serial.println(texto o dato a imprimir), donde en texto o dato a imprimir introduciremos el nombre de la variable que queremos que muestre o un texto (debería ir entrecomillado "").
ANALOGREAD()
Esta instrucción se utiliza para obtener la lectura en un pin analógico indicado de nuestro arduino. Su estructura es analogRead(pin del que debe obtener la lectura).
Una vez visto un resumen del uso de los comandos, vamos a pasar a programar en nuestro Arduino IDE con el siguiente código:
- Primero incluimos la librería en nuestro proyecto arduino al principio del programa.
- Definimos las variables del Modelo de Sensor y el pin al que está conectado.
- Declaramos nuestro servo
- Creamos variables necesarias para guardar datos del sistema
- En Setup inicializamos nuestra consola serial para poder visualizar las lecturas en nuestro PC e inicializamos nuestro servo y lo ponemos a la posición central de 90 grados (ya que este servo va de 0 a 180 grados).
- Una vez hecho esto, ya pasamos al Loop y creamos un programa que espere 2000 milisegundos y que nos lea la humedad y la temperatura y las guarde en una variable.
- Y por último hacemos que nos escriba por serial los valores leídos por el sensor.
- Comparamos la lectura de los dos sensores y ajustamos el ángulo de giro
#include "Servo.h"
#define leftSensorPin = A0;#define rightSensorPin = A1;
Servo myServo;
int angle=90;int leftSensorValue=0;int leftSensorValue=0;int security=50;
void setup() {
Serial.begin(9600);
myServo.attach(11);
myServo.write(angle);
}
void loop() { leftSensorValue = analogRead (leftSensorPin); delay (10); rightSensorValue = analogRead (rightSensorPin); delay (10);
Serial.print("Lectura sensor izquierdo: ");
Serial.print(leftSensorValue);
Serial.print("- Lectura sensor derecho:");
Serial.print(rightSensorValue);
Serial.print(" - Posición motor: ");
Serial.println(angle);
if (rightSensorValue > leftSensorValue && angle > 5 && rightSensorValue-leftSensorValue > security) { angle = angle - 5; myServo.write (angle);
} if (rightSensorValue < leftSensorValue && angle < 175 && leftSensorValue-rightSensorValue > security){ angle = angle + 5; myServo.write (angle);
} delay(15);}
#include "Servo.h"
#define leftSensorPin = A0;#define rightSensorPin = A1;
Servo myServo;
int angle=90;int leftSensorValue=0;int leftSensorValue=0;int security=50;
void setup() {
Serial.begin(9600);
myServo.attach(11);
myServo.write(angle);
}
void loop() { leftSensorValue = analogRead (leftSensorPin); delay (10); rightSensorValue = analogRead (rightSensorPin); delay (10);
Serial.print("Lectura sensor izquierdo: ");
Serial.print(leftSensorValue);
Serial.print("- Lectura sensor derecho:");
Serial.print(rightSensorValue);
Serial.print(" - Posición motor: ");
Serial.println(angle);
if (rightSensorValue > leftSensorValue && angle > 5 && rightSensorValue-leftSensorValue > security) { angle = angle - 5; myServo.write (angle);
} if (rightSensorValue < leftSensorValue && angle < 175 && leftSensorValue-rightSensorValue > security){ angle = angle + 5; myServo.write (angle);
} delay(15);}