Go Down

Topic: RASTREADOR SOLAR!!! URGENTE... (Read 3102 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

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
Eu não sou o teu criado. Se respondo no fórum é para ajudar todos mediante a minha disponibilidade e disposição. Responder por mensagem pessoal iria contra o propósito do fórum e por isso evito-o.
Se realmente pretendes que eu te ajude por mensagem pessoal, então podemos chegar a um acordo e contrato onde me pagas pela ajuda que eu fornecer e poderás então definir os termos de confidencialidade do meu serviço. De forma contrária toda e qualquer ajuda que eu der tem de ser visível a todos os participantes do fórum (será boa ideia, veres o significado da palavra fórum).
Nota também que eu não me responsabilizo por parvoíces escritas neste espaço pelo que se vais seguir algo dito por mim, entende que o farás por tua conta e risco.

Dito isto, mensagens pessoais só se forem pessoais, ou seja, se já interagimos de alguma forma no passado ou se me pretendes convidar para uma churrascada com cerveja (paga por ti, obviamente).

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

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.

Eu não sou o teu criado. Se respondo no fórum é para ajudar todos mediante a minha disponibilidade e disposição. Responder por mensagem pessoal iria contra o propósito do fórum e por isso evito-o.
Se realmente pretendes que eu te ajude por mensagem pessoal, então podemos chegar a um acordo e contrato onde me pagas pela ajuda que eu fornecer e poderás então definir os termos de confidencialidade do meu serviço. De forma contrária toda e qualquer ajuda que eu der tem de ser visível a todos os participantes do fórum (será boa ideia, veres o significado da palavra fórum).
Nota também que eu não me responsabilizo por parvoíces escritas neste espaço pelo que se vais seguir algo dito por mim, entende que o farás por tua conta e risco.

Dito isto, mensagens pessoais só se forem pessoais, ou seja, se já interagimos de alguma forma no passado ou se me pretendes convidar para uma churrascada com cerveja (paga por ti, obviamente).

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

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.

Eu não sou o teu criado. Se respondo no fórum é para ajudar todos mediante a minha disponibilidade e disposição. Responder por mensagem pessoal iria contra o propósito do fórum e por isso evito-o.
Se realmente pretendes que eu te ajude por mensagem pessoal, então podemos chegar a um acordo e contrato onde me pagas pela ajuda que eu fornecer e poderás então definir os termos de confidencialidade do meu serviço. De forma contrária toda e qualquer ajuda que eu der tem de ser visível a todos os participantes do fórum (será boa ideia, veres o significado da palavra fórum).
Nota também que eu não me responsabilizo por parvoíces escritas neste espaço pelo que se vais seguir algo dito por mim, entende que o farás por tua conta e risco.

Dito isto, mensagens pessoais só se forem pessoais, ou seja, se já interagimos de alguma forma no passado ou se me pretendes convidar para uma churrascada com cerveja (paga por ti, obviamente).

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

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.

Eu não sou o teu criado. Se respondo no fórum é para ajudar todos mediante a minha disponibilidade e disposição. Responder por mensagem pessoal iria contra o propósito do fórum e por isso evito-o.
Se realmente pretendes que eu te ajude por mensagem pessoal, então podemos chegar a um acordo e contrato onde me pagas pela ajuda que eu fornecer e poderás então definir os termos de confidencialidade do meu serviço. De forma contrária toda e qualquer ajuda que eu der tem de ser visível a todos os participantes do fórum (será boa ideia, veres o significado da palavra fórum).
Nota também que eu não me responsabilizo por parvoíces escritas neste espaço pelo que se vais seguir algo dito por mim, entende que o farás por tua conta e risco.

Dito isto, mensagens pessoais só se forem pessoais, ou seja, se já interagimos de alguma forma no passado ou se me pretendes convidar para uma churrascada com cerveja (paga por ti, obviamente).

americo

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?
Eu não sou o teu criado. Se respondo no fórum é para ajudar todos mediante a minha disponibilidade e disposição. Responder por mensagem pessoal iria contra o propósito do fórum e por isso evito-o.
Se realmente pretendes que eu te ajude por mensagem pessoal, então podemos chegar a um acordo e contrato onde me pagas pela ajuda que eu fornecer e poderás então definir os termos de confidencialidade do meu serviço. De forma contrária toda e qualquer ajuda que eu der tem de ser visível a todos os participantes do fórum (será boa ideia, veres o significado da palavra fórum).
Nota também que eu não me responsabilizo por parvoíces escritas neste espaço pelo que se vais seguir algo dito por mim, entende que o farás por tua conta e risco.

Dito isto, mensagens pessoais só se forem pessoais, ou seja, se já interagimos de alguma forma no passado ou se me pretendes convidar para uma churrascada com cerveja (paga por ti, obviamente).

americo

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:

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.
Eu não sou o teu criado. Se respondo no fórum é para ajudar todos mediante a minha disponibilidade e disposição. Responder por mensagem pessoal iria contra o propósito do fórum e por isso evito-o.
Se realmente pretendes que eu te ajude por mensagem pessoal, então podemos chegar a um acordo e contrato onde me pagas pela ajuda que eu fornecer e poderás então definir os termos de confidencialidade do meu serviço. De forma contrária toda e qualquer ajuda que eu der tem de ser visível a todos os participantes do fórum (será boa ideia, veres o significado da palavra fórum).
Nota também que eu não me responsabilizo por parvoíces escritas neste espaço pelo que se vais seguir algo dito por mim, entende que o farás por tua conta e risco.

Dito isto, mensagens pessoais só se forem pessoais, ou seja, se já interagimos de alguma forma no passado ou se me pretendes convidar para uma churrascada com cerveja (paga por ti, obviamente).

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... ;)
Eu não sou o teu criado. Se respondo no fórum é para ajudar todos mediante a minha disponibilidade e disposição. Responder por mensagem pessoal iria contra o propósito do fórum e por isso evito-o.
Se realmente pretendes que eu te ajude por mensagem pessoal, então podemos chegar a um acordo e contrato onde me pagas pela ajuda que eu fornecer e poderás então definir os termos de confidencialidade do meu serviço. De forma contrária toda e qualquer ajuda que eu der tem de ser visível a todos os participantes do fórum (será boa ideia, veres o significado da palavra fórum).
Nota também que eu não me responsabilizo por parvoíces escritas neste espaço pelo que se vais seguir algo dito por mim, entende que o farás por tua conta e risco.

Dito isto, mensagens pessoais só se forem pessoais, ou seja, se já interagimos de alguma forma no passado ou se me pretendes convidar para uma churrascada com cerveja (paga por ti, obviamente).

Go Up