Go Down

Topic: RASTREADOR SOLAR!!! URGENTE... (Read 4063 times) previous topic - next topic

americo

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://4.bp.blogspot.com/-tbUjXBBtip4/T4twRDb5YAI/AAAAAAAAAAk/QM5rnEKphYA/s1600/Capturar.PNG



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

bubulindo

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. :P
This... is a hobby.

americo

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);
  }
 
}

bubulindo

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.

This... is a hobby.

americo

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 ???

bubulindo

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.

This... is a hobby.

americo

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 ???

americo

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

bubulindo

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.

This... is a hobby.

americo

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

bubulindo

Não consegues fazer mexer o motor? Que programa fizeste?
This... is a hobby.

americo

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

bubulindo

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

Code: [Select]


#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:

Code: [Select]
#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.
This... is a hobby.

cicerovfl

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

bubulindo

O mais importante num segredo... é não informar que existem segredos... ;)
This... is a hobby.

Go Up