Paso 9: Código
Les dejo el código de control, espero no haber omitido nada, ya el editor me revolvió todo jaja XD.
Paso a paso Motor seguidor Solar de HHG
#include //Integración de la librería Stepper.h para manejar motores a pasos
#include //Integración de la librería math.h para diseño de operaciones matemáticas básicas
Declaración de constantes
#define motorStephor 200 //Número de pasos del motor horizontal
#define motorStepver 200 //Número de pasos del motor vertical
Uso de las entradas digitales de Arduino
#define motor1hor 6
#define motor2hor 7
#define motor1ver 8
#define motor2ver 9
Declaración de variables
int prom; Promedio de los cuatroLDR
pyr int; Valor del fotodiodo
int h = 60; Pasos ejecutados por el motor horizontal
int v = 5; Pasos ejecutados por el motor vertical
int ltsensor; Valor del LDR izquierdo superior
int rtsensor; Valor del LDR superior derecho
int rdsensor; Valor del LDR izquierdo inferior
int ldsensor; Valor del LDR inferior derecho
sen int = 50; Sensibilidad
int dil; Promedio del conjunto de LDR izquierdo
int dit; Promedio del conjunto de LDR arriba
dir int; Promedio del conjunto de LDR derecho
int lo hizo; Promedio del conjunto de LDR abajo
int diff; Diferencia entre los de LDR arriba con abajo de los
int diff2; Diferencia entre los LDR de la izquierda con los de la derecha
int pup; Superior del interruptor
int pdown; Inferior del interruptor
Paso a paso horStep (motorStephor, motor1hor, motor2hor); Inicia la librería paso a paso
Paso a paso verStep (motorStepver, motor1ver, motor2ver);
Inicialización del programa
void setup)
{
horStep.setSpeed (30); Motor RPM del horizontal
verStep.setSpeed (10); Motor RPM del vertical
Inicialización del puerto Serial COM
Serial.Begin(9600);
Configuración de pines como entradas
pinMode (pyr, entrada);
pinMode (ltsensor, entrada);
pinMode (rtsensor, entrada);
pinMode (ldsensor, entrada);
pinMode (rdsensor, entrada);
pinMode (pup, entrada);
pinMode (pdown, entrada);
}
Inicialización del bucle
void loop)
{
hacer //Comienza la estructura de control repetitiva hacer-mientras
{
Pyr = analogRead(0); Lectura de las entradas analógicas
ltsensor = analogRead (1) * 1.022; (La constante es para calibrar las fotorresistencias)
rtsensor = analogRead (2) * 1.007;
ldsensor = analogRead(3);
rdsensor = analogRead (4) * 1.013;
perrito = digitalRead (3); Lectura de los interruptores
pdown = digitalRead(4);
prom = (ltsensor + ldsensor + rtsensor + rdsensor) / 4; Promedio de los cuatro sensores
DIT = (ltsensor + rtsensor) / 2; Promedio de los sensores de arriba
= (ldsensor + rdsensor) / 2; Promedio de los sensores de abajo
diff = (dit - lo); Diferencia entre el nivel de radiación
Delay (50);
Si ((pyr==0) & &(pup==HIGH) & & (prom < = 8) || (Pyr==0) & &(pdown==HIGH) & & (prom < = 8))
Si el valor de pyr es cero y el promedio de los sensores es igual o menor a 8 y los interruptores Charlotte el rango
MOV(); Ejecutar la función "mov"
}
mientras que ((pyr == 0) & &(pup==HIGH) & & (prom < = 8) || (Pyr==0) & &(pdown==HIGH) & & (prom < = 8));
Mientras el valor de pyr sea cero y el promedio de los sensores sea igual o menor a 8 y los interruptores Charlotte el rango, sigue ejecutándose el bucle
Si (-1 * sen > diff || diff > sen) //Si la diferencia medida entre el conjunto de sensores es mayor o menor al valor de la sensibilidad
{
if(DIT < DID) de sensores de la los de //Si el valor medio de arriba es más pequeña la de los sensores de abajo
{
Si (pdown == HIGH) //Si pdown se activa
{
verStep.step (0); Parar el motor en el sentido vertical
Delay (10);
}
else if (pdown == LOW) //Si pdown esta inactivo
{
verStep.step (v); Gira el motor hacia arriba
Delay (50);
}
}
otro if(dit > did)
Si el valor medio de los sensores de abajo es más pequeña la de los sensores de arriba
{
Si (cachorro == HIGH) //Si pup se activa
{
verStep.step (0); Para el motor en el sentido vertical
Delay (10);
}
else if (cachorro == LOW) //Si pup esta inactivo
{
verStep.step (-v); Gira el motor hacia abajo
Delay (50);
}
}
Else //Para cualquier otro caso
{
verStep.step (0); Parar el motor en el sentido vertical
Delay (10);
}
}
Delay (10);
Pyr = analogRead (0); Lectura de los sensores nuevamente por posible cambio
ltsensor = analogRead (1) * 1.022;
rtsensor = analogRead (2) * 1.007;
ldsensor = analogRead(3);
rdsensor = analogRead (4) * 1.013;
DIL = (ltsensor + ldsensor) / 2; Promedio de los sensores de la izquierda
DIR = (rtsensor + rdsensor) / 2; Promedio de los sensores de la derecha
diff2 = (dil - dir); Diferencia entre el nivel de radiación
Delay (50);
Si (-1 * sen > diff2 || diff2 > sen) //Si la diferencia medida entre el conjunto de sensores es mayor o menor al valor de la sensibilidad
{
if(DIL < dir) //Si el valor medio de los sensores de la izquierda es más pequeña la de los sensores de la derecha
{
horStep.step (h); Girar motor hacia la derecha
Delay (10);
}
otro if(dil > dir)
Si el valor medio de los sensores de la izquierda es más grande la de los sensores de la derecha
{
horStep.step (-h); Girar el motor hacia la izquierda
Delay (10);
}
Else //Para cualquier otro caso
{
horStep.step (0); Parar el motor en el sentido horizontal
Delay (10);
}
}
Delay(10);
}
Función "mov"
mov vacío)
{
Si (cachorro == HIGH) //Si pup está activo
{
verStep.step (72); Gira de 72 pasos hacia arriba
Delay (50);
}
else if (pdown == HIGH) //Si pdown está activo
{
verStep.step-(72); Gira de 72 pasos hacia abajo
Delay (50);
}
Delay (10);
}