martes, 7 de abril de 2026

Sistema: Rastreador de Posición del Sol

 

/*

 * =========================================================

 * COLEGIO GIMNASIO BILINGÜE MARIE CURIE

 * Proyecto de Tecnología y Automatización

 * Sistema: Rastreador de Posición del Sol

 * Desarrollado por: Centro Prisma

 * Versión: 1.0

 * Fecha: 19 de Febrero de 2026

 * =========================================================

*/

#include <ESP32Servo.h>

 

/*

=========================================================

RASTREADOR DE POSICIÓN DEL SOL

=========================================================

 

¿QUÉ HACE ESTE PROYECTO?

 

Este sistema usa:

- 2 sensores de luz

- 1 servo (motor que gira por ángulo)

 

El programa compara cuánta luz recibe cada sensor.

Si un lado recibe más luz, el servo gira hacia ese lado.

 

El proceso se repite muchas veces por segundo.

Eso permite que el sistema se ajuste constantemente.

Eso es un sistema de lazo cerrado con retroalimentación.

=========================================================

*/

 

 

// ================= SENSORES =================

 

// Pin donde conectamos el sensor izquierdo

const int SENSOR_IZQUIERDO = 34; // Lee valores entre 0 y 4095

 

// Pin donde conectamos el sensor derecho

const int SENSOR_DERECHO = 35; // También lee valores entre 0 y 4095

 

 

// ================= ACTUADOR =================

const int PIN_SERVO = 27; // Pin que envía la señal de control al servo

 

Servo actuador; // Creamos el objeto que controla el servo

 

 

// ================= AJUSTES DEL SISTEMA =================

const int SENSIBILIDAD = 50; // Diferencia mínima entre los sensores de luz para considerar que sí hay cambio real de luz

 

 

const int LIMITE_IZQ = 10; // Límite mínimo permitido para proteger el servo

 

const int LIMITE_DER = 170; // Límite máximo permitido para proteger el servo

 

const int PASO_GIRO = 2; // Cantidad de grados que gira cada vez que se mueve

 

int posicion = 90; // Posición actual del servo (empieza en el centro)

 

 

// ================= FUNCIONES =================

// Devuelve la cantidad de luz que recibe el sensor izquierdo

int medirIzquierda() {

  return analogRead(SENSOR_IZQUIERDO);

}

 

 

// Devuelve la cantidad de luz que recibe el sensor derecho

int medirDerecha() {

  return analogRead(SENSOR_DERECHO);

}

 

 

// Resta 2 grados a la posición actual

void girarIzquierda() {

  posicion = posicion - PASO_GIRO;

}

 

 

// Suma 2 grados a la posición actual

void girarDerecha() {

  posicion = posicion + PASO_GIRO;

}

 

 

// Evita que el servo se pase del límite izquierdo

void protegerIzquierda() {

 

  // Si la posición es menor al límite permitido en el servo

  if (posicion < LIMITE_IZQ) {

 

    // Forzamos la posición al límite seguro del servo

    posicion = LIMITE_IZQ;

  }

}

 

 

// Evita que el servo se pase del límite derecho

void protegerDerecha() {

 

  // Si la posición es mayor al límite permitido del servo

  if (posicion > LIMITE_DER) {

 

    // Forzamos la posición al límite seguro del servo

    posicion = LIMITE_DER;

  }

}

 

 

// Envía la posición actual al servo

void moverServo() {

  actuador.write(posicion); //escribe la nueva posición del servo

}

 

 

 

// ================= INICIO =================

void setup() {

 

  // Inicia comunicación con el computador

  Serial.begin(115200);

 

  // Conecta el servo al pin definido

  actuador.attach(PIN_SERVO);

 

  // Lleva el servo a la posición inicial

  moverServo();

 

  Serial.println("RASTREADOR DE SOL INICIADO");

}

 

 

 

// ================= CICLO PRINCIPAL =================

// Esta parte se repite una y otra vez mientras el programa esté encendido.

// Es como el "ciclo de pensamiento" del sistema.

void loop() {

 

  // 1️⃣ MEDIR LUZ

  // Le preguntamos a cada sensor cuánta luz está viendo.

  // Guardamos esos números en dos variables.

  int luzIzq = medirIzquierda();   // Luz que ve el sensor izquierdo

  int luzDer = medirDerecha();     // Luz que ve el sensor derecho

 

  // 2️⃣ CALCULAR DIFERENCIA

  // Restamos izquierda menos derecha para comparar.

  // Si el resultado es positivo → hay más luz a la izquierda.

  // Si es negativo → hay más luz a la derecha.

  int diferencia = luzIzq - luzDer;

 

  // 3️⃣ DECIDIR MOVIMIENTO

  // Si la diferencia es suficientemente grande hacia la izquierda,

  // el servo gira hacia la izquierda.

  if (diferencia > SENSIBILIDAD) {

    girarIzquierda();

  }

 

  // Si la diferencia es suficientemente grande hacia la derecha,

  // el servo gira hacia la derecha.

  if (diferencia < -SENSIBILIDAD) {

    girarDerecha();

  }

 

  // 4️⃣ PROTEGER EL SERVO

  // Revisamos que el servo no se pase de los límites seguros.

  // Esto evita que el motor se fuerce o se dañe.

  protegerIzquierda();

  protegerDerecha();

 

  // 5️⃣ MOVER EL SERVO

  // Ahora sí enviamos la nueva posición al motor.

  // Aquí es cuando realmente se mueve.

  moverServo();

 

  // 6️⃣ MOSTRAR DATOS EN PANTALLA

  // Esto nos permite ver qué está "pensando" el sistema.

  // No cambia el movimiento, solo muestra información.

  Serial.print("Sensor Izq: ");

  Serial.print(luzIzq);

 

  Serial.print(" | Sensor Der: ");

  Serial.print(luzDer);

 

  Serial.print(" | Diferencia: ");

  Serial.print(diferencia);

 

  Serial.print(" | Posicion Servo (grados): ");

  Serial.println(posicion);

 

  // Esperamos un momento antes de repetir todo.

  // Esto hace que el movimiento sea más estable.

  delay(20);

}

 

 

 

No hay comentarios:

Publicar un comentario