Pages: [1]   Go Down
Author Topic: Arduino - Girasol seguidor de luz  (Read 2582 times)
0 Members and 1 Guest are viewing this topic.
Offline Offline
Newbie
*
Karma: 0
Posts: 1
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Quiero conseguir mediante un servomotor continuo que pueda seguir la luz allá donde incide luz, pero lo unico que consigo es que gire en el sentido en el qual recibe mas luz. Lo que quiero conseguir es que el servomotor deje de girar una vez apunto con una linterna y se quede quito hasta que señale a otro ldr y tendra que moverse hacia ese lado y quedarse quieto en la nueva posicion. Os dejo el codigo que tengo, por favor necesito una ayuda:

#include <Servo.h>
 
Servo myservo;
unsigned long time;
unsigned long timetest;
//int val = 0;
//int down = 255;
//int up = 0;

int pos = 90;

int entradaI = 0;
int entradaC = 1;
int entradaD = 2;

int baseI = 0;
int baseC = 0;
int baseD = 0;

int salidaI = 0;
int salidaC = 0;
int salidaD = 0;

int difI = 0;
int difD = 0;


void setup()
{
  Serial.begin(9600);
  pinMode(entradaI, INPUT);
  pinMode(entradaC, INPUT);
  pinMode(entradaD, INPUT);
 
  baseI = analogRead(entradaI);
  baseC = analogRead(entradaC);
  baseD = analogRead(entradaD);

  myservo.attach(9);
  myservo.write(pos);
 
  //time = millis();   
}
 
void loop()
{

  salidaI = analogRead(entradaI) - baseI+511;
  Serial.println(salidaI);
  salidaC = analogRead(entradaC) - baseC+511;
  Serial.println(salidaC);
  salidaD = analogRead(entradaD) - baseD+511;
  Serial.println(salidaD);
 
 difI = salidaC - salidaI;
 difD = salidaC - salidaD;
 
  if (salidaI < salidaC && difI > difD)
  {
   moveI();
  }
  if (salidaD < salidaC && difD > difI)
  {
   moveD();
  }
  Serial.println(".....");
  delay(25);
  timetest = millis() - time;
  //if (timetest > 20000)
  //{
   // reset();
  //}
}
 
void moveI()
{
  difI = salidaC - salidaI;
  if (difI > 4)
  {
    pos = pos + 1 ;                           
    myservo.write(pos);
    difI= salidaC - salidaI;
    if(difI < 4)
    {
      reset();
    }
    if(pos == 0)
    {
      for(pos = 0; pos < 90; pos++) 
      {                                 
        myservo.write(pos);             
        delay(25);                       
      }
    }     
    Serial.println("Mueve Derecha");
    Serial.println("nueva posicion: " + (pos));
    delay(55);
  }                     
  return;
}
 
void moveD()
{
  difD = salidaC - salidaD;
  if (difD > 4)
  {
    pos = pos - 1 ;                             
    myservo.write(pos);             
    difD = salidaC - salidaD;
    if(difD < 4)
    {
      reset();
    }
    if(pos == 0)
    {
      for(pos = 180; pos > 90; pos--) 
      {                                 
        myservo.write(pos);             
        delay(25);                       
      }
    }
    Serial.println("Mueve Izquierda");
    Serial.println("Nueva posicion: ");
    Serial.println(pos);
    delay(50);
  }                     
  return;
}
 
 
void reset()
{
   baseI = analogRead(entradaI);
   baseC = analogRead(entradaC);
   baseD = analogRead(entradaD);
   time = millis();
}
Logged

0
Offline Offline
God Member
*****
Karma: 1
Posts: 524
Arduino inside
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Hola Paulet,
tu tienes definidas 2 condiciones, si uno es mayor otro, haz esto, en tu caso gira a la derecha o a la izquierda, yo definiría ( con otro if) cuando quieres que este quieto y creas un void(parado) o con el nombre que más te guste, el servo se tendrá que quedar en la última posición, así estará parado.
Espero que te haya servido.

Nayma
Logged

Miami/Florida
Offline Offline
Sr. Member
****
Karma: 14
Posts: 350
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Code:
void moveI()
{
  difI = salidaC - salidaI;
  if (difI > 4)
  {
    pos = pos + 1 ;                           
    myservo.write(pos);
    difI= salidaC - salidaI;
    if(difI < 4)
    {
      reset();
    }
    if(pos == 0)
    {
      for(pos = 0; pos < 90; pos++) 
      {                                 
        myservo.write(pos);             
        delay(25);                       
      }
    }     
    Serial.println("Mueve Derecha");
    Serial.println("nueva posicion: " + (pos));
    delay(55);
  }                     
  return;
}


La condicion
 if(difI < 4)
    {
      reset();
    }
nunca se ejecuta porque esta dentro del if(difI > 4) que es la condicion opuesta.
 Unreachable code...
por tanto nunca ejectuta el metodo reset();

Debes ponerlo como:

if(difI >= 4)
{
Cosas que quieres hacer aqui si la condicion es verdadera;
}
else
{
reset();
}
Logged

Perseverance is 90% of the solution. The remaining 10% is more perseverance.

Pages: [1]   Go Up
Jump to: