Buenos días.
He hecho un robot que basicamente solo hace que pasearse y esquivar obstaculos, pero encima lleva un seguidor solar independiente. Al tener que buscar la luz independientemente de la posición del robot, no usé un servo para su movimiento horizontal, si no un motor DC controlado por un L298N.
Ahora bien. hay un problema. Cuando detecta la luz y la tiene mas o menos centrada, el motor debería pararse hasta que la luz se mueva un poco hacia un lado, y no lo hace. no consigo que quede parado dentro de un margen que le he dado.
Pongo el código a ver si podeis echarme una mano.
#include <Servo.h> // libreria para los servo motores
/*
// 180 horizontal MAXIMO
Servo horizontal; // declaramos el valor para el servo horizontal
int servoh = 180;
int servohLimitHigh = 180; //limite en posicion superior
int servohLimitLow = 65; //limite para posicion inferior
*/
Servo vertical; // vertical servo
int servoReposo = 45; // grados a los que se inicia el servo
int servovLimiteSuperior = 60; // limite de grados a los que subirá el servo
int servovLimiteInferior = 15; // límite de grados a los que bajará en servo
int ldrIzqSup = 2; // conexion a las resistencias LDR Izquierda arriba
int ldrDrchSup = 3; // conexion a las resistencias LDR derecha arriba
int ldrIzqInf = 0; // conexion a las resistencias LDR izquierda abajo
int ldrDrchInf = 1; // conexion a las resistencias LDR izquierda abajo 1023
//motor horizontal. pines
int ENA = 6;
int IN1 = 5;
int IN2 = 4;
void setup()
{
pinMode (ENA, OUTPUT);
pinMode (IN1, OUTPUT);
pinMode (IN2, OUTPUT);
Serial.begin(9600);
vertical.attach(10); // servo vertical pin digital 10
vertical.write(45);
delay(3000);
}
void loop()
{
int valorIZQarriba = analogRead(ldrIzqSup); // top left (superior izquierdo)
int valorDRCHarriba = analogRead(ldrDrchSup); // top right (superior derecho)
int valorIZQabajo = analogRead(ldrIzqInf); // down left (inferior izquierdo)
int valorDRCHabajo = analogRead(ldrDrchInf); // down rigt (inferior derecho)
// int dtime = analogRead(4)/20; // Opcional si utilizamos potenciometros para la velocidad
// int tol = analogRead(5)/4;
int dtime = 10; //velocidad
int tolerancia = 50; //tolerancia en la medición de la resistencia de los LDR
int tolerancia_motor = 50;
int avARRIBA = (valorIZQarriba + valorDRCHarriba) / 2; // valor superior maximo
int avABAJO = (valorIZQabajo + valorDRCHabajo) / 2; // valor inferior maximo
int avIZQ = (valorIZQarriba + valorIZQabajo) / 2; // valor izquierdo maximo
int avDRCH = (valorDRCHarriba + valorDRCHabajo) / 2; // valor derecho maximo
int difVERT = avARRIBA - avABAJO; // diferencia entre superior e inferior
int difHORIZON = avIZQ - avDRCH;// diferencia entre izquierdo y derecho
Serial.print(avARRIBA); // Imnprimir valores de posicion en monitor serial
Serial.print(" ");
Serial.print(avABAJO);
Serial.print(" ");
Serial.print(avIZQ);
Serial.print(" ");
Serial.print(avDRCH);
Serial.print(" ");
Serial.print(dtime);
Serial.print(" ");
Serial.print(tolerancia);
Serial.print(" ");
Serial.print(difHORIZON);
Serial.print(" ");
Serial.print(valorIZQarriba);
Serial.print(" ");
Serial.print(valorDRCHarriba);
Serial.print(" ");
Serial.print(valorIZQabajo);
Serial.print(" ");
Serial.print(valorDRCHabajo);
Serial.println(" ");
if (-1*tolerancia > difVERT || difVERT > tolerancia) // revisar la diferencia para cambiar al angulo vertical
{
if (avARRIBA < avABAJO)
{
servoReposo = ++servoReposo;
if (servoReposo > servovLimiteSuperior)
{
servoReposo = servovLimiteSuperior;
}
}
else if (avARRIBA > avABAJO)
{
servoReposo= --servoReposo;
if (servoReposo < servovLimiteInferior)
{
servoReposo = servovLimiteInferior;
}
}
vertical.write(servoReposo);
}
// aqui empieza el movimiento del motor
if (-1*tolerancia_motor > difHORIZON || difHORIZON > tolerancia_motor) // revisar la diferencia para cambiar al angulo horizontal
{
if (avIZQ > avDRCH){
motor_izquierda();
}else if (avIZQ < avDRCH){
motor_derecha();
}else if (avIZQ = avDRCH){
}
}
delay(dtime);
}
void motor_derecha () // motor dc
{
//Direccion motor A
digitalWrite (IN1, HIGH);
digitalWrite (IN2, LOW);
analogWrite (ENA, 100); //Velocidad motor A
}
void motor_izquierda () // motor dc
{
//Direccion motor A
digitalWrite (IN1, LOW);
digitalWrite (IN2, HIGH);
analogWrite (ENA, 100); //Velocidad motor A
}
void Parar ()
{
//Direccion motor A
digitalWrite (IN1, LOW);
digitalWrite (IN2, LOW);
analogWrite (ENA, 0); //Velocidad motor A
}
El seguidor solar está basado en este proyecto:
Un saludo y gracias de ante mano