RASTREADOR SOLAR!!! URGENTE...

Olá pessoal, sou novo aqui e tenho muitas duvidas com programação, então comprei um arduino e estou baixando algumas apostilas para poder aprender a programar!!!!

Mais estou aqui pois preciso fazer um trabalho com arduíno, é um RASTREADOR SOLAR... para isso vou usar 2 servos motores 9g (para ele se mover tanto horizontalmente, como verticalmente) e para fazer esse movimento usarei 4 LDRs para fazer a leitura e saber onde esta a maior intensidade de luz no momento...


![](http://C:\Users\GUILHERME AMÉRICO\Desktop\PI 2012\fotos_slides)

SE alguem puder me ajudar agradeço... é meio urgente !!!! vlw

O que é que já fizeste?

Nós estamos aqui para ajudar, não para te fazer o trabalho. Se disseres o que já fizeste e qual a dúvida em específico que encontraste, certamente que alguém aqui te ajudará.

Ser urgente não nos interessa para nada. :stuck_out_tongue:

Esse e o programa que pretendo usar, mas ele está meio instável... quando ele vai mover o servo da vertical ele não fica sempre apontado pro lugar de maior intensidade, fica para baixo... Já dei umas modificadas, mas não faço ideia do que fazer!!! Se puderem olhar e me dizer se tem algo errado, fico agradecido!!!

#include <Servo.h>

Servo servo1; //Declara servos
Servo servo2;
int pos1 = 0; // pos1 é a posião horizontal
int pos2 = 0; // pos2 é a posição vertical
int right = 0; // LDR direita
int left = 0; // LDR esquerda
int up = 0; // LDR superior
int down = 0; //LDR inferior

int ldr1 = 0; // pinos dos LDRs
int ldr2 = 1;
int ldr3 = 2;
int ldr4 = 3;

void setup()
{
servo1.attach(10); //anexar servo 1 ao pino digital 10
servo1.write(90); //posição inicial de 90 graus

servo2.attach(9); // anexar o servo 2 ao pino digital 9
servo2.write(90); // posição inicial de 90 graus

pinMode(ldr1, INPUT); //Declara LDRs como entradas
pinMode(ldr2, INPUT);
pinMode(ldr3, INPUT);
pinMode(ldr4, INPUT);
}

void loop()
{

pos1 = servo1.read(); // pos1 informa a posição atual do servo1 (horizontal)
pos2 = servo2.read(); // pos2 informa a posição atual do servo2 (vertical)

// Leitura de cada LDR

int right = analogRead(ldr1); // LDR1 é o da direita
int left = analogRead(ldr2); //LDR2 é o da esquerda
int up = analogRead(ldr3); //LDR3 é o superior
int down = analogRead(ldr4); //LDR4 é o inferior

//Controle da posição horizontal

if(right > left ) // Se tem mais luz no LDR da direita do que no da esquerda, move-se para a direita
{
servo1.write(pos1 +1); //Aumenta a posição do servo em 1
delay(10); // este atraso é necessário para evitar servo de ir 0-180 sem parar
}

else if(left > right) //Move-se para esquerda, pois existe mais intensidade
{
servo1.write(pos1 -1); // Diminui a posição do servo em 1
delay(10);
}

else
{
servo1.write(pos1); // Caso nenhuma condição seja satisfeita, se mantem a mesma posição
}

//Posição do controle Vertica

if(up > down)
{
servo2.write(pos2 +1);
delay(10);
}

else if(down > up)
{
servo2.write(pos2 -1);
delay(10);
}

else
{
servo2.write(pos2);
}

}

Já experimentaste meter uns Serial.print() para ver os valores das LDR e qual o fluxo do programa, ou seja como é que estão a funcionar os ifs.

Outra coisa, o Sol não se mexe o suficiente de segundo a segundo para o seguidor o seguir... então seria interessante fazeres uma filtragem dos valores analógicos para evitar que o sistema ande feito maluco dum lado para o outro. E isso é o outro problema, as tuas condições fazem com que o sistema nunca esteja estável. Repara que não existe a situação em que as LDRs têm o mesmo valor.

Mete uns Serial.print() dos valores das LDR e isso indica-te o que está mal com o programa.

Vou tentar fazer isso com os serial.print... então vc acha que seria bom eu colar uma função i indicando quando eles forem iguais ???

Sim, acho que deverias ter a opção de parar os motores, senão vais sempre tê-los a mexer dum lado para o outro.

Vou tentar fazer isso com os serial.print, mais eu coloco ele onde? e essa verificação eu faço usando a quela tela de monitoramento do arduino? ... mas a função else que mantem a posição do motor já não indica que nem umas das funções acima foi satisfeita, ou seja que há uma igualdade ???

tirei o delay, continuo normal... o problema e na hora dele mover verticalmente, pois ele não responde, já na horizontal está perfeito aparentemente

Desculpa o comentário da situação de igual... existe lá essa possibilidade no código.

Experimenta fazer um programa para mover o motor vertical com comandos de teclas e/ou porta série... ou para rodar numa sequência. Isso serve para provar que o motor está bem ligado e a funcionar.

continuo com o mesmo problema... Não faço ideia de onde esteja o erro desse programa!!!

Não consegues fazer mexer o motor? Que programa fizeste?

o motor fica travando, ele não vai... eu tampo um los ldr e o motor continua na mesma, sem mexer..

Eu disse para testares o motor... algo como:

#include <Servo.h>

Servo servo1;          //Declara servos

int pos1 = 0;             // pos1 é a posião horizontal


void setup()
{
  servo1.attach(9);      //anexar servo 1 ao pino digital 10
  servo1.write(pos1);       //posição inicial de 90 graus
    
}

void loop()
{
delay(1000); 

servo1.write(pos1%360); //assim pode andar às voltas... 
pos1 +=90;  
}

Isto deve fazer o motor rodar de 90 em 90 graus de segundo a segundo. Experimenta isto para ambos os motores de forma a tirares as dúvidas acerca das ligacões do motor.

Se queres ver se a lógica está com problemas, tens de colocar Serial.println() em sítios estratégicos... por exemplo:

#include <Servo.h>

Servo servo1;          //Declara servos
Servo servo2;
int pos1 = 0;             // pos1 é a posião horizontal
int pos2 = 0;             // pos2 é a posição vertical
int right = 0;            // LDR direita
int left = 0;             // LDR esquerda
int up = 0;               // LDR superior
int down = 0;             //LDR inferior

int ldr1 = 0;          // pinos dos LDRs
int ldr2 = 1;
int ldr3 = 2;
int ldr4 = 3;

void setup()
{
  servo1.attach(10);      //anexar servo 1 ao pino digital 10
  servo1.write(90);       //posição inicial de 90 graus
  
  servo2.attach(9);        // anexar o servo 2 ao pino digital 9
  servo2.write(90);        // posição inicial de 90 graus
  
  pinMode(ldr1, INPUT);      //Declara LDRs como entradas
  pinMode(ldr2, INPUT);
  pinMode(ldr3, INPUT);
  pinMode(ldr4, INPUT);
}

void loop()
{
 
  pos1 = servo1.read();            // pos1 informa a posição atual do servo1 (horizontal)
  pos2 = servo2.read();            // pos2 informa a posição atual do servo2 (vertical)
  
 // Leitura de cada LDR

  int right = analogRead(ldr1);      // LDR1 é o da direita
  int left = analogRead(ldr2);   //LDR2 é o da esquerda
  int up = analogRead(ldr3);   //LDR3 é o superior
  int down = analogRead(ldr4);   //LDR4 é o inferior

//pegas nestes valores e comparas com o programa para ver o que ele está a fazer... 
 Serial.print("down = ");
 Serial.println(down); 
 Serial.print("up = ");
 Serial.println(up);
 Serial.print("left = ");
 Serial.println(left);
 Serial.print("right = ");
 Serial.println(right);
 
                  //Controle da posição horizontal

  if(right > left )                   // Se tem mais luz no LDR da direita do que no da esquerda, move-se para a direita
  {
    Serial.println("R > L");
    servo1.write(pos1 +1);                  //Aumenta a posição do servo em 1
    delay(10);                                      // este atraso é necessário para evitar servo de ir 0-180 sem parar
  }
  
  else if(left > right)      //Move-se para esquerda, pois existe mais intensidade 
  {
    Serial.println("L > R");
    servo1.write(pos1 -1);                    // Diminui a posição do servo em 1
    delay(10);
  }
  
  else
  {
    Serial.println("R = L");
    servo1.write(pos1);                    // Caso nenhuma condição seja satisfeita, se mantem a mesma posição
  }
                  
                 //Posição do controle Vertica


  if(up > down)
  {
    Serial.println("U > D");   
    servo2.write(pos2 +1);
    delay(10);
  }
  
  else if(down > up)
  {
    Serial.println("D > U");
    servo2.write(pos2 -1);
    delay(10);
  }
  
  else
  {
    Serial.println("U = D");
    servo2.write(pos2);
  }
  
}

E assim podes ver se existe algum problema na lógica do programa ou nas leituras do AD.

Ola Guilherme Americo, lhe enviei um e-mail, se puder ver ficarei muito grato!
Abraço!

O mais importante num segredo... é não informar que existem segredos... :wink:

Vlw pela ajuda bubulindo,

Eu apresentei ele com aquelas falhas mesmo e dei uma parada agora, pois ira começar as provas de ultimo bimestre!!! Mas nas férias pretendo voltar a mexer com esse projeto, e farei o que vc me indicou acima!!! Caso obtenha bons resultados ou alguma outra duvida,volto a postar aqui blz!!!

Vlw mesmo por tentar me ajudar!!!

CiceroVfl, acabei de enviar ao seu e-mail o que me pediu... espero que possa ter ajudado!!!

muito obrigado Guilherme pela resposta!
bubulindo, nao se preocupe, nao passei nenhum segredo pra ele, rsrsrs, soh pedi algumas dicas pois tb estou com duvidas na montagem de um rastreador..

falando nisso..., voces sabem como eu posso pedir pra mostrar o angulo/posicao que o servomotor no SerialMonitor..?

abraço!