Paso 5: El Arduino código
#define TILTL 2#define labrado 3
#define fondo 2
#define TOPLEFT 0
#define color 1
#include < Servo.h >
#include "math.h"
Servo hservo;
Servo vservo;
int tlsense;
int trsense;
int bsense;
int tavg;
int diff;
int spd;
int divisor;
sensibilidad del int;
int tiltl;
int labrado;
void setup () {}
vservo.Attach(9); se fija el servo en el pin 9 al objeto servo
hservo.Attach(10); se fija el servo en el pin 10 al objeto servo
divisor = 10; controla la velocidad del servo. menor número = mayor velocidad de
sensibilidad = 5; Esto controla la sensibilidad del rastreador. menor número = mayor sensibilidad. Si el tracker es variación constantemente hacia adelante y hacia atrás, aumentar el número
Serial.Begin(19200); abrir com serial
Serial.Print ("SolarTracker listo!");
pinMode (parte inferior, entrada); configurar las entradas de
pinMode (TOPLEFT, entrada);
pinMode (color, entrada);
pinMode (TILTL, entrada);
pinMode (labrado, entrada);
}
void loop () {}
tiltl = digitalRead(TILTL); leer el sensor de inclinación
labrado = digitalRead(TILTH);
tlsense = analogRead(TOPLEFT); leer los sensores de luz
trsense = analogRead(TOPRIGHT);
bsense = analogRead(BOTTOM);
bsense = bsense * 1.05; Tuve que ajustar el valor de este sensor para que sea más precisa. puede que tenga que hacer lo mismo pero empezar por dejarlo solo
Tavg = (tlsense + trsense) / 2; obtener un valor medio de los sensores de la tapa 2
diff = abs (tavg - bsense); Esta juzga cuánto debe girar el tracker
SPD = diff/divisor; y ajusta la velocidad de la reacción en consecuencia
SPD = max (spd, 1); establece la velocidad mínima en 1
Serial.Print ("\nTOP:"); Serial.Print (tavg, DEC); imprimir los valores de los sensores a la serie com
Serial.Print("\tBOTTOM:"); Serial.Print (bsense, DEC);
Serial.Print("\tLEFT:"); Serial.Print (tlsense, DEC);
Serial.Print("\tRIGHT:"); Serial.Print (trsense, DEC);
Si ((tavg < bsense) & & (diff > sensibilidad) & & (tiltl == LOW) & & (labrado == LOW)) {/ / si el valor medio de los sensores superior es más pequeño (más luz) que el sensor de fondo y sensor de la inclinación está en el rango correcto
vservo.Write (90 - spd); Enviar comando servo para girar hacia arriba y agregar velocidad
Serial.Print ("\tState:"); Serial.Print("up!");
} else if ((tavg < bsense) & & (diff > sensibilidad) & & (tiltl == HIGH) & & (labrado == LOW)) {/ / si el valor medio de los sensores superior es más pequeño (más luz) que el sensor de fondo y sensor de la inclinación está en el rango correcto
vservo.Write (90 - spd); Enviar comando servo para girar hacia arriba y agregar velocidad
Serial.Print ("\tState:"); Serial.Print("up!");
} else if ((tavg > bsense) & & (diff > sensibilidad) & & (tiltl == HIGH) & & (labrado == LOW)) {/ / si el valor del sensor de la parte inferior es más pequeño (más luz) que el valor promedio de los principales sensores y el sensor de inclinación está en el rango correcto
vservo.Write (90 + spd); Enviar comando servo para girar hacia abajo además de agregar velocidad
Serial.Print ("\tState:"); Serial.Print("Down!");
} else if ((tavg > bsense) & & (diff > sensibilidad) & & (tiltl == LOW) & & (labrado == HIGH)) {/ / si el valor del sensor de la parte inferior es más pequeño (más luz) que el valor promedio de los principales sensores y el sensor de inclinación está en el rango correcto
vservo.Write (90 + spd); Enviar comando servo para girar hacia abajo además de agregar velocidad
Serial.Print ("\tState:"); Serial.Print("Down!");
} else {/ / para todos los otros casos
vservo.Write(90); parar el motor del eje y
Serial.Print ("\tState:"); Serial.Print("STOP!");
}
tlsense = analogRead(TOPLEFT); volver a leer los sensores de la tapa 2 porque probablemente han cambiado
trsense = analogRead(TOPRIGHT);
trsense = trsense * 1.03; otra vez tuve que ajustar el valor de un sensor para hacer el seguimiento más preciso
diff = abs (tlsense - trsense); restablecer la variable diff para los nuevos valores
SPD = diff/divisor; y generar en consecuencia una velocidad de
SPD = max (spd, 1); establece la velocidad mínima en 1
Si ((tlsense < trsense) & & (diff > sensibilidad)) {/ / si el valor de sensor izquierdo superior es más pequeño (más luz) que el sensor superior derecha
hservo.Write (90 + spd); Enviar comando servo para girar a la izquierda
Serial.Print ("\tState:"); Serial.Print("left!");
} else if ((tlsense > trsense) & & (diff > sensibilidad)) {/ / si el valor de sensor izquierdo superior es más grande (menos luz) que el sensor superior derecha
hservo.Write (90 - spd); Enviar comando servo para girar a la derecha
Serial.Print ("\tState:"); Serial.Print("Right!");
} else {/ / para todos los otros casos
hservo.Write(90); parar el motor del eje x
Serial.Print ("\tState:"); Serial.Print("STOP!");
}
Delay(10); retardo de 10 ms
}
Arduino sondea los sensores y reacciona en consecuencia asegurándose de que no se incline demasiado hacia abajo o hacia arriba. La diferencia de luz determina qué tan rápido debe reaccionar el tracker.