S?guenos en Facebook
S?guenos en Twitter
S?guenos en Instagram
Crazy Design
Alicante
ROBÓTICA EDUCATIVA      •      IMPRESIÓN 3D      •      DISEÑO      •      WEB      •      TIENDA DE ELECTRÓNICA
Mi Carrito
    Total: 0€
    Servo Seguidor de Luz con LDR
    ¿Quieres comprar las piezas de este tutorial para experimentar en casa? Pulsando en lo botones de abajo se añadiran los productos del tutorial automaticamente a tu carrito. Pulsa sobre el botón Añadir Todo si quieres que se añadan todas las piezas necesarias para este tutorial incluido protoboard, cables dupont y placa (Arduino, Raspberry Pi, MicroBit, ESP...) o pulsa sobre Añadir solo sensores para añadir todas las piezas menos las protoboard, cables dupont y placa (Arduino, Raspberry Pi, MicroBit, ESP...).

    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:


    1. Primero incluimos la librería en nuestro proyecto arduino al principio del programa.
    2. #include "Servo.h"
    3. Definimos las variables del Modelo de Sensor y el pin al que está conectado.
    4. #define leftSensorPin = A0;#define rightSensorPin = A1;

    5. Declaramos nuestro servo
    6. Servo myServo;

    7. Creamos variables necesarias para guardar datos del sistema
    8. int angle=90;int leftSensorValue=0;int leftSensorValue=0;int security=50;
      

    9. 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).
    10. void setup() {
        Serial.begin(9600);
        myServo.attach(11);
        myServo.write(angle);
      }

    11. 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.
    12. void loop() {  leftSensorValue = analogRead (leftSensorPin);  delay (10);  rightSensorValue = analogRead (rightSensorPin);  delay (10);

    13. Y por último hacemos que nos escriba por serial los valores leídos por el sensor.
    14.   Serial.print("Lectura sensor izquierdo: ");
        Serial.print(leftSensorValue);
        Serial.print("- Lectura sensor derecho:");
        Serial.print(rightSensorValue);
        Serial.print(" - Posición motor: ");
        Serial.println(angle);
      

    15. Comparamos la lectura de los dos sensores y ajustamos el ángulo de giro
    16.   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);}



    Código completo


    #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);}