LusoRobótica - Robótica em Português

Robótica => Projectos de robótica => Projectos em desenvolvimento => Tópico iniciado por: fred gomes em 31 de Janeiro de 2010, 13:42

Título: Robot de Busca e Salvamento![CONLUIDO]
Enviado por: fred gomes em 31 de Janeiro de 2010, 13:42
Boas.
Estou a construir um robot de busca e salvamento para apresentar no final deste ano lectivo como pap (projecto de aptidão profissional), o robot consiste em  seguir uma linha preta, detectar cores de alumínio, verdes, e vermelhas(já explico o porquê das cores vermelhas), este quando detecta a cor de alumínio deve parar durante um determinado tempo e voltar a prosseguir o seu percurso (a cor de alumínio poderá representar uma ferramenta perdida, o robot apenas irá parar, avisar que ali têm uma ferramenta e prosseguir com o seu percurso), e ao detectar a cor verde este deverá parar até ser retirada a cor verde do seu caminho( a cor verde pretende representar um operário que poderá estar ferido na pista, então o robot deverá parar e apenas prosseguir quando este for socorrido). E por fim, a cor vermelha, é uma funcionalidade "extra" que quero acrescentar, caso seja um operário deseje que o robot funcione como distribuidor de material em vez de salvador de vidas, deverá colocar vários pontos de cor vemelha ao longo da pista (irei colocar pedaços de papel vermelho), e este ao detectar um ponto de cor vermelha deverá parar algum tempo e prosseguir (o tempo que para é para a retiração de o material que este possa conter ...),este também contém um regulador de velocidade (utilizando um potenciometro), ..

Poderei colocar outras funcionalidades (como o robot se ir desviando de obstáculos, ligação a um display que indica os seus passos, etc)...tudo dependerá do tempo que ainda tenha depois de concluida a parte descrita em cima..

O desenvolvimento do projecto será descrito ao longo deste tópico, onde postarei também dúvidas que poderei vir a têr, e, claro, conto com a vossa ajuda :)

Para já tenho um problema, que não sei ao que se deve, .. eu já construir a parte de "seguidor de linhas" e regulação de velocidade dos motores DC que estou a utilizar, pretendo alimentar o arduino, regular a velocidade, e só depois, clico num push button onde dou ordem para o robot andar...ele já segue a linha, e estava a funcionar na perfeição, até que passado um "tempão" de ter o arduino alimentado este deixa de responder à programação (reparei que a luz verde da alimentação do arduino anfraqueçeu), no entanto se deixar de mexer no arduino (desligando-lhe a alimentação) e passados 5 minutos voltar a tentar, ele já funciona, mas deixa logo de responder... alguma vez vos aconteceu isso? alguém sabe a causa disto acontecer? e o que posso fazer para corrigir?.. não consigo entender pq tive o arduino muito tempo ligado sem qualquer problema, e só agora começou a fazer isso, sem qualquer alteração nas suas ligações (reparei também que não existe qualquer tipo de sobreaquecimento neste)...

a programação que estou a utilizar é a seguinte:

Citar
// projecto de seguidor de linhas.

// declaração das variaveis:
int switch1 = 8;
int motor_right = 3;
int motor_left = 6;
int sensor_right = 5;
int sensor_left = 0;
int pin_pot = 1;

//variaveis auxiliares.

int valor = 0;      // variável para guardar o valor do sensor_right!
int valor1 = 0;     // "                      "valor do sensor_left!
int val_pot = 0;    // variável para guardar o valor do pot.
boolean walk = false; //

void setup(){
  Serial.begin(9600);
 
  pinMode (motor_right, OUTPUT);
  pinMode (motor_left, OUTPUT);
  pinMode (switch1, INPUT);
}


void loop(){
  // Leitura dos valores
  valor = analogRead (sensor_right);
  valor1 = analogRead (sensor_left);
  val_pot = analogRead (pin_pot);
  val_pot = map(val_pot,0,1023,50,255);
 
  Serial.println (val_pot); // print na consola
  delay(200); // delay
 
 
  if (digitalRead(switch1) == LOW) {
    if(walk == true) walk = false; // se estava false, passa a true
    else walk = true; // se estava true, passa a false
  }
 
  if (walk == true)
  {
    if(valor > 350 && valor1 < 350){
      analogWrite (motor_right,0 );
      analogWrite (motor_left, val_pot);
    }
    else{
      if (valor <350 && valor1 > 350){
        analogWrite (motor_right, val_pot);
        analogWrite (motor_left, 0);
      }
      else{
        if (valor >350 && valor1 >350){
          analogWrite (motor_right, val_pot);
          analogWrite (motor_left, val_pot);
        }
        else{
          if (valor <350 && valor1 < 350){
            analogWrite (motor_right, 0);
            analogWrite (motor_left, 0);
          }
        }
      }
    }
  }
  else{
      digitalWrite (motor_right, 0);
      digitalWrite (motor_left, 0);
  }
}

Título: Re: Robot de Busca e Salvamento!
Enviado por: fred gomes em 31 de Janeiro de 2010, 15:20
oh.. acho que já sei qual é o problema ;D , fui buscar o cabo USB e reparei que com o arduino alimentado pelo pc isto já funciona como deve ser, deve ser a tensao da bateria que chega ao arduino não ser suficiente para este actuar (falta de bateria), vou colocála a carregar.. fiquei feliz por saber que o arduino está óptimo de saúde :) , nunca me passou pela cabeça que o problema podesse ser esse... :P
irei postando novas novidades ;)
Título: Re: Robot de Busca e Salvamento!
Enviado por: TigPT em 31 de Janeiro de 2010, 15:31
Bem, estou a ver que já sabes de onde possa vir o problema.

Depois testa com as baterias carregadas e diz-nos se o problema era mesmo dai.

Boa sorte com o projecto.
Título: Re: Robot de Busca e Salvamento!
Enviado por: fred gomes em 31 de Janeiro de 2010, 15:40
sim é daí, caso nao fosse o arduino também não funcionava com a fonte do pc ( e faz sentido, que mais atras disse que tive o arduino um "tempão"ligado xD, ou seja, a gastar bateria)..ainda tenho um problema, o robot não consegue seguir a linha por completo pq acho que as rodas nao aderem muito bem ao papel, e deves em quando a roda "fica a andar mas parada no mesmo sítio" ,tenho de ver se arranjo alguma coisa de borracha ou assim para "puxar" melhor o papel e aumentar a aderência das rodas..e assim revolver este problema.
Irei postando novidades acerca do projecto, e também dúvidas que possam surgir :)
Obrigado..
Título: Re: Robot de Busca e Salvamento!
Enviado por: metRo_ em 31 de Janeiro de 2010, 15:56
Olha um pormenor que reparei no teu código:
Código: [Seleccione]
  if (digitalRead(switch1) == LOW) {
    if(walk == true) walk = false; // se estava false, passa a true
    else walk = true; // se estava true, passa a false
  }

isto é igual a isto:
Código: [Seleccione]
  if (digitalRead(switch1) == LOW) {
   walk=!walk;
  }
Título: Re: Robot de Busca e Salvamento!
Enviado por: fred gomes em 31 de Janeiro de 2010, 16:14
Obrigado metRo_ , vou corrigir isso, ambas as formas estão correctas, mas da forma que disseste fica mais simplificado ;)
Título: Re: Robot de Busca e Salvamento!
Enviado por: metRo_ em 31 de Janeiro de 2010, 17:14
Obrigado metRo_ , vou corrigir isso, ambas as formas estão correctas, mas da forma que disseste fica mais simplificado ;)

Exacto e eu referi que eram iguais é só para simplificar ;)
Título: Re: Robot de Busca e Salvamento!
Enviado por: davidjesus em 10 de Fevereiro de 2010, 11:41
Boas estou a fazer um robot de busca e salvamento e precisava do circuito, é possível arranjar a do seu robot para ver mais o menos ?

comprimentos.
Título: Re: Robot de Busca e Salvamento!
Enviado por: fred gomes em 07 de Março de 2010, 11:35
Boas.
Estou a tentar aplicar no seguidor de linhas um "QTR 8RC reflectance array" da Pololu.
http://www.pololu.com/docs/pdf/0J12/QTR-8x.pdf (http://www.pololu.com/docs/pdf/0J12/QTR-8x.pdf)

o circuito está a ser alimentado com 3.3 volts e tenho os pinos ligados como mostra a figura no pdf deixado em cima, ground´s ao - , VCC e LEDON ao +.
Os led´s acendem, no entanto estou a tentar fazer a leitura  de apenas um LED utilizando o código:

Citar
int sensor = 3;
int val = 0;

void setup(){
  Serial.begin(9600);
  digitalWrite (sensor, 0);
  pinMode ( sensor, INPUT);
}
void loop(){
  val = digitalRead (sensor);
  Serial.print (val);
  delay(500);
  delay(25);
}


e obtenho sempre o mesmo valor (1), ve vez em quando dá 0 se eu tocar no sensor duma certa forma, mas nem percebi nem porquê , nem quando isso acontece..

alguem me consegue ajudar?
Título: Re: Robot de Busca e Salvamento!
Enviado por: fred gomes em 07 de Março de 2010, 13:51
outra questão, se eu alterar no código a leitura do valor digital para o analógico, ele deveria me dar valores precisos (o ou 1023), mas não, está-me sempre a dar valores que rondam o 400. Alguém me sabe dizer uma causa possivel que me leva a não obter os valores desejados?,

Obrigado.
Título: Re: Robot de Busca e Salvamento!
Enviado por: senso em 07 de Março de 2010, 14:10
Ligas-te o 3.3v bypass?
Título: Re: Robot de Busca e Salvamento!
Enviado por: fred gomes em 07 de Março de 2010, 17:37
liguei, mas não sei se está bem ligado.. pelo que percebi através da documentação da pololu esses terminais devem ser chantados (caso alimente o circuito com 3.3volts) afim de aumentar o brilho dos leds, e foi isso que eu fiz..
Título: Re: Robot de Busca e Salvamento!
Enviado por: microbyte em 07 de Março de 2010, 20:44
outra questão, se eu alterar no código a leitura do valor digital para o analógico, ele deveria me dar valores precisos (o ou 1023), mas não, está-me sempre a dar valores que rondam o 400. Alguém me sabe dizer uma causa possivel que me leva a não obter os valores desejados?,

Obrigado.

Talvez seja por causa das referências de tensão.
Alimentas os sensores a 3.3v, mas a voltagem de referência para o conversor ADC é 5v, talvez esse seja o valor 1 para os 3.3v

Isto digo eu assim por alto. Não tenho a certeza se isto é verdade, alguém me corrija se assim não for.

Volto a dizer-te. Em vez de andares a ler os sensores 1 a 1, usa a biblioteca que eles disponibilizam.
Título: Re: Robot de Busca e Salvamento!
Enviado por: fred gomes em 07 de Março de 2010, 21:22
 Eu percebi o que quiseste dizer mas o problema não é daí, pois ja experimentei alimentar o circuito com ambas as tensoes (3.3v e 5v),
 
acho que já obtive uma resposta ao porquê se não conseguir lêr valores digitais..

"# You can request calibrated sensor values using the readCalibrated() method, which also takes an optional argument that lets you perform the read with the IR emitters turned off. Calibrated sensor values will always range from 0 to 1000, with 0 being as or more reflective (i.e. whiter) than the most reflective surface encountered during calibration, and 1000 being as or less reflective (i.e. blacker) than the least reflective surface encountered during calibration",

agora percebi que vou ter mesmo de utilizar a biblioteca da Pololu e utilizar os metodos de leitura que eles disponibilizam, pois a leitura destes sensores funciona de uma forma diferente "dos normais"!

agora mesmo assim tenho dúvidas,

http://www.pololu.com/docs/0J19/3 (http://www.pololu.com/docs/0J19/3)  eles aqui disponibilizam as funções necessárias para o array de sensores com leitura analógica e digital.. se calhar a minha dúvida provém por causa disso, pq eles neste exemplo misturam os exemplos para o uso de ambos os array´s

Código: [Seleccione]
# int i; 
#   for (i = 0; i < 250; i++)  // make the calibration take about 5 seconds 
#   { 
#     qtr.calibrate(); 
#     delay(20); 

aqui por exemplo, a que se refere o 250??

Agradeço a ajuda :)

Título: Re: Robot de Busca e Salvamento!
Enviado por: metRo_ em 07 de Março de 2010, 21:40
Código: [Seleccione]
# int i; 
#   for (i = 0; i < 250; i++)  // make the calibration take about 5 seconds 
#   { 
#     qtr.calibrate(); 
#     delay(20); 
aqui por exemplo, a que se refere o 250??
Agradeço a ajuda :)

delay(20) é um atraso de 20ms, 20ms*250=5s.
Título: Re: Robot de Busca e Salvamento!
Enviado por: senso em 07 de Março de 2010, 22:12
Se alimentas-te o circuito com 5v depois de teres o 3.3v bypass soldado podes muito bem ter queimado os led's todos...
O loop de 250 vezes serve para calibrar o circuito 250 vezes, ou melhor chama a função calibrate 250 vezes, deve ser para que fique mesmo bem feito
Título: Re: Robot de Busca e Salvamento!
Enviado por: fred gomes em 07 de Março de 2010, 22:18
mas mesmo assim não percebo..
pq o 250 vai ser multiplicado por 20?

assim de momento ainda tenho mais uma questão,   o compilador não me aceita a biblioteca  " #include <PololuQTRSensors.h>  "  , alguém sabe porquê?
Título: Re: Robot de Busca e Salvamento!
Enviado por: microbyte em 07 de Março de 2010, 22:24
mas mesmo assim não percebo..
pq o 250 vai ser multiplicado por 20?
A multiplicação foi apenas para perceberes o porquê de demorar 5 segundos (está no comentário da linha do for() ).
Um ciclo for, é uma repetição. Nesse caso, 250 repetições. Se cada uma demorar 20 ms, perfaz os 5 segundos.

assim de momento ainda tenho mais uma questão,   o compilador não me aceita a biblioteca  " #include <PololuQTRSensors.h>  "  , alguém sabe porquê?
Instalaste a biblioteca bem? Na pasta certa?
http://www.pololu.com/docs/0J19/2 (http://www.pololu.com/docs/0J19/2)
Título: Re: Robot de Busca e Salvamento!
Enviado por: senso em 07 de Março de 2010, 22:25
porque aquilo é um loop, ou seja um ciclo, logo tudo o que está dentro dele vai ser executado as vezes que o loop for feito, logo se dentro do loop tem um delay de 20ms, e como vai ser feito 250 vezes é só multiplicar.
Título: Re: Robot de Busca e Salvamento!
Enviado por: fred gomes em 07 de Março de 2010, 23:15
sim já percebi,
isso da biblioteca :-\ nem me lembrei, e como nunca tinha necessitado..
mas já a instalei..
amanha vou tentar começar a fazer um código utilizando a biblioteca da pololu.
dúvidas que vá tendo (que certamente as terei) colocarei aqui para que me possam ajudar :)
Obrigado pela vossa ajuda ;)
Título: Re: Robot de Busca e Salvamento!
Enviado por: VascoP em 08 de Março de 2010, 09:25
Onde está declarado o bot_before?

Código: [Seleccione]

  Serial.println (bot_before); // print na consola
  delay(200); // delay
 
Título: Re: Robot de Busca e Salvamento!
Enviado por: fred gomes em 08 de Março de 2010, 18:27
tinha um erro no código por distracção, no entanto já o corrigi ;)
obrigado por avisares..
Título: Re: Robot de Busca e Salvamento!
Enviado por: VascoP em 08 de Março de 2010, 20:34
Sempre ás ordens, notei que não tinhas declarado então resolvi ajudar! Boas programações!
Título: Re: Robot de Busca e Salvamento!
Enviado por: fred gomes em 09 de Março de 2010, 19:34
Bem, tenho aqui um código, ainda está inacabado (falta-lhe alguns promenores), mas dêm -me a vossa opinião sobre o controle PID (mais propiamente, é o que tenho menos certezas se esta bem), não calculei o erro manualmente, porque segundo o que li acho que este erro é  calculado automaticamente (penso que pela função "calibrate"), o código está bastante comentado..têm alguns erros acusados pelo comilador , mas a ideia pretendida acho que está bem explicita..

dêm opiniões sobre funções que acham que eu deveria usar e não usei, e outras que possam estar mal usadas ..

http://www.pololu.com/docs/0J18/14 (http://www.pololu.com/docs/0J18/14)
http://www.pololu.com/docs/0J19/3 (http://www.pololu.com/docs/0J19/3)

deixo aqui os links em que me centrei para a concretização deste código..

Citar

#include <PololuQTRSensors.h>

PololuQTRSensorsRC qtr((char[]) {9, 8, 7,6,5,4,3,2} , 8 );

void setup(){
  
  int i;
  for i = 0; i < 250; i++) // faz calibração durante 5s.
  {
    qtr.calibrate();
    delay(20);
  }
}

void loop(){
  unsigned int sensors [8];
  int posicao = qtr.readLine(sensors);// a  variará de 0 a 2000,
  if (sensors [6] > 750 && sensors [5] > 750){// aqui escolhi o sensor 5 e 6 para fazer
                                              // a calibração, pois apenas quando estes
                                              // estiverem sobre a linha preta, o erro será 0.
                                              
    return;
  }
  Serial.println (sensors [9,8,7,6,5,4,3,2]);
  delay(500);
  
  //Para calcular o erro da "posição da linha" eu irei fazer com que o erro seja 0
  // quando os sensores 6 e 5 estiverem na linha preta simultâneamente, caso contrário
  // irá existir uma margem de erro.
  //Esse erro irá variar de -1000 a 1000.
  
  int error = posiçao -1000;
  int motorspeed = KP * error + KD * (error-lastError);
  unsigned int sensor_valores[8];//variável onde será guardado os valores dos sensores.
  int vel_max = 130;
  int rmotorspeed = 0; //variavel onde é guardada a velocidade do motor R
  int lmotorspeed = 0;
  
  if (error <= -1000){
    rmotorspeed = (int)motorspeed;
    lmotorspeed = (int)vel_max;
    lastError = error;
  }
  else if{ (error >= 1000){
    rmotorspeed = (int)motorspeed;
    lmotorspeed = (int) vel_max;
    lastError = erro;
  }
  }
}


desde já agradeço a vossa ajuda, e peço desculpa por qualquer "besteira" que possa estar a cometer no código..

 ;)

Título: Re: Robot de Busca e Salvamento!
Enviado por: fred gomes em 10 de Março de 2010, 18:19
Olá mais uma vez..
após não ter obtido qualquer resposta sobre o meu post anterior tentei proceder à leitura dos sensores, e caso continue sem ter certezas de que a biblioteca da Pololu cálcula o erro automáticamente ( e como o faz) irei fazê-lo manualmente, com os valores obtidos..

tentei fazer a leitura dos sensores, utilizei o seguinte código:

Código: [Seleccione]
#include <PololuQTRSensors.h>

PololuQTRSensorsRC qtrrc((unsigned char[]) {2, 3, 4, 5, 6,7,8,9}, 8);


void setup()
{
Serial.begin(9600);
int i;
for (i = 0; i < 250; i++)
{
qtrrc.calibrate();
delay(20);
}
}

void loop()
{
unsigned int vsensores[8];
qtrrc.read(vsensores);
delay(50);

for (int i=0; i<8; i++){
Serial.println(vsensores[i]);
delay(500);

}
}

e os valores que obtenho são +/- assim: 2 2 2 2 2 4000 4000 2 2 2 2 ....
é muito estranho isto..

de seguida tentei lêr os valores utilizando o seguinte código:

Código: [Seleccione]
#include <PololuQTRSensors.h>

PololuQTRSensorsRC qtrrc((unsigned char[]) {2, 3, 4, 5, 6,7,8,9}, 8);


void setup()
{
Serial.begin(9600);
int i;
for (i = 0; i < 250; i++)
{
qtrrc.calibrate();
delay(20);
}
}
void loop(){
  int vsensores = 0;
  Serial.println(vsensores);
  delay(500);
}
void qtrrc_read(unsigned int *vsensores, unsigned char readMode){
 
 

 
  qtrrc.read(vsensores);
  delay(50);
  for (int i=0; i<8; i++){ 
  }
}


e nêm valores obtenho, neste último código procurei utilizar uma função fornecida pela biblioteca da pololu, podem vê-la no link em baixo..

http://www.pololu.com/docs/0J18/14 (http://www.pololu.com/docs/0J18/14)

alguém me consegue ajudar??


Título: Re: Robot de Busca e Salvamento!
Enviado por: microbyte em 10 de Março de 2010, 18:54
Então fred?

Vê o teu loop():
Código: [Seleccione]
void loop(){
  int vsensores = 0;
  Serial.println(vsensores);
  delay(500);
}

basicamente é repetir o seguinte: Meter a variável vsensores a 0, imprimir a variável vsensores e esperar 500 ms
É natural k só te apareçam zeros...

A função que lê o valor dos sensores não a utilizas, mas tens de utilizar...
Título: Re: Robot de Busca e Salvamento!
Enviado por: fred gomes em 10 de Março de 2010, 19:57
Código: [Seleccione]
#include <PololuQTRSensors.h>

PololuQTRSensorsRC qtrrc((unsigned char[]) {2, 3, 4, 5, 6,7,8,9}, 8);


void setup()
{
Serial.begin(9600);
int i;
for (i = 0; i < 250; i++)
{
qtrrc.calibrate();
delay(20);
}

void loop(){
}
void qtrrc_read(unsigned int *vsensores, unsigned char readMode){
 
  int val = 0;
  for (int i=0; i<8; i++){
    qtrrc.read(vsensores);
  }
  val = qtrrc.read(vsensores);
  Serial.println (val);
  delay(500);
}

pois, mas eu perciso duma variavel para guardar o valor lido e imprimi-lo,
alterei o código para isto, supostamente deveria dar, mas acusa me erro ao compilar não sei pq :-\
consegues ajudar -me ?
Título: Re: Robot de Busca e Salvamento!
Enviado por: senso em 10 de Março de 2010, 20:15
Código: [Seleccione]
#include <PololuQTRSensors.h>

PololuQTRSensorsRC qtrrc((unsigned char[]) {2, 3, 4, 5, 6,7,8,9}, 8);


void setup()
{
Serial.begin(9600);
int i;
for (i = 0; i < 250; i++)
{
qtrrc.calibrate();
delay(20);
}
}
void loop(){
}
void qtrrc_read(unsigned int *vsensores, unsigned char readMode){ //aqui estas a criar uma função que requer 2 parametros para ser chamada mas nunca a chamas no loop, logo isso é um erro
 
  int val_sensores = 0;
  for (int i=0; i<8; i++){
    qtrrc.read(vsensores); //aqui lês os sensores mas não armezenas os valores
  }
  val_sensores = qtrrc.read (vsensores); //aqui só les um sensor e passas isso para o pc via serial
  Serial.println (val_sensores);
  delay(500);
 
}

pois, mas eu perciso duma variavel para guardar o valor lido e imprimi-lo,
alterei o código para isto, supostamente deveria dar, mas acusa me erro ao compilar não sei pq :-\
consegues ajudar -me ?
lê os comentarios
Título: Re: Robot de Busca e Salvamento!
Enviado por: senso em 10 de Março de 2010, 20:24
Código: [Seleccione]
#include <PololuQTRSensors.h>

PololuQTRSensorsRC qtrrc((unsigned char[]) {2, 3, 4, 5, 6,7,8,9}, 8);


void setup() {

int i=0;
int valores[8]={0,0,0,0,0,0,0,0};

Serial.begin(9600);

for (i = 0; i < 250; i++) {
qtrrc.calibrate();
delay(20);
}
}

void loop(){
 
  for (int i=0; i<8; i++) {
    valores[i]=qtrrc.read(i);
  }

  for(int i=0; i<8; i++) {
  Serial.println (valores[i]);
  delay(500);
  }
}
Penso que assim deverá funcionar bem, experimenta
Título: Re: Robot de Busca e Salvamento!
Enviado por: fred gomes em 10 de Março de 2010, 20:32
acusa alguns erros estou a tentar corrigi-los,
no entanto penso que terei de definir obrigatoriamente a função que tenho nos meus códigos anteriores (para lêr o valor dos sensores),..

dá uma vista de olhos neste código:

Código: [Seleccione]
#include <PololuQTRSensors.h>

PololuQTRSensorsRC qtrrc((unsigned char[]) {2, 3, 4, 5, 6,7,8,9}, 8);


void setup()
{
Serial.begin(9600);
int i;
for (i = 0; i < 250; i++){
  qtrrc.calibrate();
  delay(20);
}
void loop(){
  qtrrc_read();
}
void qtrrc_read(unsigned int *vsensores, unsigned char readMode){
 
  int val = 0;
  for (int i=0; i<8; i++){
    qtrrc.read(vsensores);
  }
  val = qtrrc.read(vsensores);
  Serial.println (val);
  delay(500);
}

está parecido com o teu, mas estou a fazer tudo nessa função, e declarei essa função no void loop(){ , no entanto nao fiz nada com ela pq não necessito, e mesmo assim acusa me um erro :-\ diz que void loop{ é incompativel com void setup(){ (algo assim), sabes pq?

Ps: não consigo utilizar o código que me deixaste sem a função propia para lêr o valor dos sensores, a "expressão" "    qtrrc.read;" apenas por ser usada nessa função, pelo que percebi, e pelo erro que me acusa o compilador..
Título: Re: Robot de Busca e Salvamento!
Enviado por: senso em 10 de Março de 2010, 20:43
Continuas a chamar a função qtrrc_read sem lhe passar os parametros que defines na criação da função, onde estás a passar o *vsensores que é um ponteiro e o readMode?
Começa por dar outro nome á tua função, tipo ler porque como a libraria tem funções que começam com o nome qtrrc o compilador pode-se estar a trocar todo.

PololuQTRSensorsRC qtrrc((unsigned char[]) {2, 3, 4, 5, 6,7,8,9}, 8);

esta linha tem de estar dentro do setup, estás a criar um array de chars sem lhe dar nome e de resto não sei se estás a chamar bem a função.
outro erro é que não deves estar a criar esse bem esse método da polulu, mas nisso não tenho a certeza porque nunca trabalhei com essa libraria
Título: Re: Robot de Busca e Salvamento!
Enviado por: fred gomes em 10 de Março de 2010, 20:54

http://www.pololu.com/docs/0J19/3 (http://www.pololu.com/docs/0J19/3)

vê no exemplo desse código que a pololu disponibiliza, o "# PololuQTRSensorsRC qtr((char[]) {14, 15, 16}, 3);  " não está dentro do Setup(){, a declaração dos pinos é feita fora deste...

quanto à libraria ter determinadas funções e o compilador baralhá-las :-\ acho que isso não deve acontecer, pois para alguma coisa é necessário instalar a libraria que estou a usar..

quanto ao eu não dever estar a usar correctamente a libraria, acho que é isso que está acontecer, para não obter os valores desejados, dai pedir ajuda..

http://www.pololu.com/docs/0J18/14 (http://www.pololu.com/docs/0J18/14)  (funções fornecidas pela libraria)


Título: Re: Robot de Busca e Salvamento!
Enviado por: microbyte em 10 de Março de 2010, 21:00
Estás a complicar aquilo que é fácil... Não te metas no cálculo do erro da linha, quando esta informação já está disponível pela biblioteca... Não faz sentido.

Citar
#include <PololuQTRSensors.h>
PololuQTRSensorsRC qtr((char[]) {14, 15, 16}, 3);

void setup(){
  Serial.begin(9600);
  for (int i = 0; i < 250; i++){
    qtr.calibrate();
    delay(20);
  }
}

void loop()
{
  unsigned int sensors[3];
  int position = qtr.readLine(sensors);
  int error = position - 1000;
  Serial.println (error);
  delay(500);
}

Título: Re: Robot de Busca e Salvamento!
Enviado por: fred gomes em 10 de Março de 2010, 21:20
eu ja vi isso muitas vezes,
uma coisa que ainda não consegui perceber é pq eles dizem que error = -1000 ( no exemplo que eles dão apenas utilizam 3 sensores, pelo que percebi deverão estar tds em cima da linha) caso um sensor deixe de ver a linha o error é -1000 ou 1000, segundo o que percebi, só que isso é com 3 sensores, eu quero usar 8, e o error vai ter de variar de 0 a -1000 e de 0 a 1000, dai a minha confusão.

Para já estou a tentar lêr o valor dos sensores e nem isso estou a conseguir fazer :-\

Ps: eu fiz uma programação anterior que tinha o erro da linha calculado automaticamente, foi o que eu percebi aque aquilo fazia, a programação foi postada ontem e está um bocado mais atrás deste tópico.
Título: Re: Robot de Busca e Salvamento!
Enviado por: microbyte em 10 de Março de 2010, 21:38
eu ja vi isso muitas vezes,
uma coisa que ainda não consegui perceber é pq eles dizem que error = -1000 ( no exemplo que eles dão apenas utilizam 3 sensores, pelo que percebi deverão estar tds em cima da linha) caso um sensor deixe de ver a linha o error é -1000 ou 1000, segundo o que percebi, só que isso é com 3 sensores, eu quero usar 8, e o error vai ter de variar de 0 a -1000 e de 0 a 1000, dai a minha confusão.

Para já estou a tentar lêr o valor dos sensores e nem isso estou a conseguir fazer :-\

Ps: eu fiz uma programação anterior que tinha o erro da linha calculado automaticamente, foi o que eu percebi aque aquilo fazia, a programação foi postada ontem e está um bocado mais atrás deste tópico.

Eu não pus o código só para tu olhares para ele. Experimenta lá isso...
Para isso é que serve a biblioteca. É que qualquer que seja o nº de sensores, o erro vai sempre estar entre -1000 e 1000. É só uma questão de ajustares os valores.

Se queres MESMO MUITO ter os valores dos sensores, 1 a 1, tens acesso a isso no array sensors[] do código que te passei.

Sensor 1 -> sensors[0]
Sensor 2 -> sensors[1]
.
.
.


E por aí fora...
Título: Re: Robot de Busca e Salvamento!
Enviado por: fred gomes em 29 de Março de 2010, 19:34
Boas..

já consegui lêr o valor dos sensores, usando o seguinte código :

Código: [Seleccione]
#include <PololuQTRSensors.h>

    PololuQTRSensorsRC qtr((unsigned char[]) {9,8,7,6,5,4,3,2}, 8);

    void setup()
    {
Serial.begin(9600);
    }

    void loop()
    {
unsigned int readings[8];
qtr.read(readings);
Serial.print ("sensor1  ");
Serial.println(readings[0]);
delay(1000);
Serial.print ("sensor2  ");
Serial.println(readings[1]);
delay(1000);
Serial.print ("sensor3  ");
Serial.println(readings[2]);
delay(1000);
Serial.print ("sensor4  ");
Serial.println(readings[3]);
delay(1000);
Serial.print ("sensor5  ");
Serial.println(readings[4]);
delay(1000);
Serial.print ("sensor6  ");
Serial.println(readings[5]);
delay(1000);
Serial.print ("sensor7  ");
Serial.println(readings[6]);
delay(1000);
Serial.print ("sensor8  ");
Serial.println(readings[7]);
delay(1000);
    }

o valor varia de 0 a 4000.

...

fiz o seguinte código para calcular a velocidade dos motores (consoante o erro)..

Código: [Seleccione]
#include <PololuQTRSensors.h>

PololuQTRSensorsRC qtr((unsigned char[]) {9,8,7,6,5,4,3,2}, 8);
int motor_right = 10;
int motor_left = 11;

//variaveis auxiliares.

int ltarguetval = 0;// valor a desejar no motor left.
int rtarguetval = 0;// valor a desejar no motor right.
int lnowval = 0;    // valor actual no motor left.
int rnowval = 0;    // valor actual no motor right.

void setup(){
  Serial.begin(9600);

  pinMode (motor_right, OUTPUT);
  pinMode (motor_left, OUTPUT);

  int i;
  for (i = 0; i < 250; i++)
  {
    qtr.calibrate();
    delay(20);
  }
}


void loop(){
  unsigned int sensors [8];
  int position = qtr.readLine(sensors);
  int error = position -3500;
  int lastError = 0;
  int maxspeed = 150;
  double KP = 0.1;
  int KD = 5;
  int motorspeed = KP * error + KD * (error - lastError);
  lastError = error;

  Serial.println (position);
  delay(500);
 
  if(sensors[0] > 750 && sensors[1] > 750 && sensors[2] > 750 && sensors[3] > 750 && sensors[4] > 750 && sensors[5] > 750 && sensors[6] > 750 && sensors[7] > 750)
  {
    return;
  }
 
  if(error >-500 && error < 500){
   rtarguetval = (int)maxspeed;
   ltarguetval = (int) maxspeed;
   error = lastError;
 }
 else if (error > 500 ){
    rtarguetval = (int)motorspeed;
    ltarguetval = maxspeed;
    error = lastError;
  }
  else if ( error < -500){
    ltarguetval = (int)motorspeed;
    rtarguetval = maxspeed;
    error = lastError;
  }
  if(rtarguetval > rnowval){
    rnowval +=1;
  }else if (rtarguetval < rnowval){
    rnowval -=1;
  }
  if (ltarguetval > lnowval){
    lnowval +=1;
  }else if(ltarguetval < lnowval){
    lnowval -=1;
  }
}

e segundo este exemplo:  http://www.pololu.com/docs/0J19/3 (http://www.pololu.com/docs/0J19/3)

penso que deveria funcionar...
eu deveria lêr de "position" algo do tipo: -3500,-2500,-1500,-500,500,1500,2500,3500 " consoante o sensor que está sobre o preto...
mas o que leio é simplesmente o valor de 0, 1000...7000 consoante o sensor, tendo em conta o exemplo de código fornecido pela Pololu acho que não epseraria esses valores...

acontece me outra coisa, muito muito estranha... eu posso ter o Serial monitor aberto e a estarem me gerados numeros de 0 a 7000, mas se o fechar e voltar abrir já são gerados numeros diferentes, ou só zeros, ou outros numeros quaisquer que nem sei de onde vêem...

alguem me consegue ajudar?
Título: Re: Robot de Busca e Salvamento!
Enviado por: senso em 29 de Março de 2010, 20:39
Penso que isso é meio problema do serial monitor, porque isso acontece em quase todos os programas, deve perder a sincronização com o arduino se o fechares e voltares a abrir.
Título: Re: Robot de Busca e Salvamento!
Enviado por: fred gomes em 29 de Março de 2010, 20:51
mas é muito estrnaho isso, pq tenho de abrir uma data de vezes para voltar a dar os valores "correctos" (correctos para mim, pq são os que desejo) e assim nunca sei se estou a fazer bem ou mal..

e quanto aquele problema, de os valores gerados serem 0, 1000, ... 7000 em vez de -3500...3500, sabes o pq disso?
segundo a documentação da pololu penso que deveria fazer isso, mas talvez eu esteja a fazer alguma coisa mal..
Título: Re: Robot de Busca e Salvamento!
Enviado por: senso em 29 de Março de 2010, 23:01
Já viste se tens tudo bem ligado?
Já andas a martelar nessa dos valores errados a não sei quanto tempo...
Título: Re: Robot de Busca e Salvamento!
Enviado por: fred gomes em 29 de Março de 2010, 23:18
sim esta tudo bem ligado...
eu consigo ler os valores de sensor a sensor..por isso esta bem ligado...
pois isto esta complicado,..
eu tambem estive sem tempo , e so agora voltei a pegar nisto, mas se pelo menos ate ao fim da semana não conseguir resolver os problemas que tenho com estes sensores irei ter de optar por fazer o seguidor de linhas com outros sensores (uns "normais"), mas para já vou continuar a tentar..

deixei uma igm no forum da pololu com o meu codigo e problema..
vou esperar pela resposta deles..
Título: Re: Robot de Busca e Salvamento!
Enviado por: microbyte em 29 de Março de 2010, 23:27
Isso tem uma função calibrate(), se não me engano. Experimenta a usá-la...
Título: Re: Robot de Busca e Salvamento!
Enviado por: fred gomes em 29 de Março de 2010, 23:32
eu estou a usa-la aqui:

Código: [Seleccione]
int i;
  for (i = 0; i < 250; i++)
  {
    qtr.calibrate();
    delay(20);
  }
}

 eu acho que o codigo anterior que fiz devia funcionar.. pois o error deveria variar de -3500 a 3500, sempre de 1000 em 1000... como mostrei atras..
é estranho, mas a função readline tambem nao funciona em condições, as vezes dá outras não...não consigo perceber..
Título: Re: Robot de Busca e Salvamento!
Enviado por: microbyte em 29 de Março de 2010, 23:52
Usa-la dentro do setup(), que corre no arranque.
Experimenta, depois de voltares a abrir a janela do Serial, carregar no "reset".
Título: Re: Robot de Busca e Salvamento!
Enviado por: senso em 30 de Março de 2010, 00:28
Se os consegues ler, olha usa-os como se fossem sensores normais e mete a biblioteca da polulu no lixo lol
Título: Re: Robot de Busca e Salvamento!
Enviado por: microbyte em 30 de Março de 2010, 00:53
LOL, o rapaz tem insistido em fazer as coisas à mão, eu é que lhe disse para usar a bilbioteca da Pololu... Não digas já isso... :p
Título: Re: Robot de Busca e Salvamento!
Enviado por: senso em 30 de Março de 2010, 01:26
As vezes vale mais saber o que estamos a fazer do que usar uma caixa negra, as vezes não digo sempre e usar a caixa negra sempre simplifica o nosso código
Título: Re: Robot de Busca e Salvamento!
Enviado por: microbyte em 30 de Março de 2010, 03:00
As vezes vale mais saber o que estamos a fazer do que usar uma caixa negra, as vezes não digo sempre e usar a caixa negra sempre simplifica o nosso código
Pois, só que pelo que ele me mostrou, ainda não está muito há vontade na programação. Tem ainda algumas dúvidas para avançar a fazer tudo à mão, por isso é que recomendei.
Título: Re: Robot de Busca e Salvamento!
Enviado por: TigPT em 02 de Abril de 2010, 22:49
Testes ao sensor QTR-8RC:

Pololu QTR-8RC LEDs ON/OFF test (http://www.youtube.com/watch?v=ZQnrEd-IFV8#)
Título: Re: Robot de Busca e Salvamento!
Enviado por: TigPT em 02 de Abril de 2010, 23:03
Teste de linha:

Pololu QTR-8RC line detect test (http://www.youtube.com/watch?v=EkiSZsC876A#)

(desculpem a qualidade do vídeo mas só tenho o tlm para os fazer :S)
Título: Re: Robot de Busca e Salvamento!
Enviado por: metRo_ em 02 de Abril de 2010, 23:07
Posta o código, visto ser um exemplo simples pode ajudar muita gente :)
Título: Re: Robot de Busca e Salvamento!
Enviado por: TigPT em 02 de Abril de 2010, 23:08
Não há código.. só alimentei o sensor com 5v e liguei a saida de um dos sensores a uma resistência e um led.
Título: Re: Robot de Busca e Salvamento!
Enviado por: metRo_ em 02 de Abril de 2010, 23:31
pensei que tivesses a usar o Arduino.
Título: Re: Robot de Busca e Salvamento!
Enviado por: TigPT em 02 de Abril de 2010, 23:52
Pololu QTR-8RC line detect blink led (http://www.youtube.com/watch?v=097inGTElwo#)

Pisca número de vezes diferente dependendo do sensor que tem a pista em cima.

Código:
Código: [Seleccione]
#include <PololuQTRSensors.h>

PololuQTRSensorsRC qtr((unsigned char[]) {8, 9, 10, 1}, 4);

void setup()
{
  pinMode(13, OUTPUT);
  int i;
  for (i = 0; i < 250; i++)
  {
    qtr.calibrate();
    delay(20);
  }
}
void loop()
{
  unsigned int sensors[3];
  int number = 0;
  int position = qtr.readLine(sensors);
  if (sensors[0] > 750 && sensors[1] > 750 && sensors[2] > 750)
  {
    return;
  }
  if( sensors[0] > 750)
    number = 1;

  else if( sensors[1] > 750)
    number = 2;

  else if( sensors[2] > 750)
    number = 3;

  else if( sensors[3] > 750)
    number = 4;

  for(int i=0;i< number;i++){
    digitalWrite(13,HIGH);
    delay(250);
    digitalWrite(13,LOW);
    delay(250);
  }
  delay(1000);
}

Título: Re: Robot de Busca e Salvamento!
Enviado por: fred gomes em 03 de Abril de 2010, 12:58
Boas ..
Obrigado pelo exemplo que postaste Tiago.. :D

dizme uma coisa, aqui: "  if (sensors[0] > 750 && sensors[1] > 750 && sensors[2] > 750)" pq colocaste esses sensores? e não "  if (sensors[0] > 750 && sensors[1] > 750 && sensors[2] > 750 && sensor[3])" por exemplo..

outra coisa, podes colocar no teu código para imprimir o valor de "position" e dizer me que valores obtens sff?
Título: Re: Robot de Busca e Salvamento!
Enviado por: TigPT em 03 de Abril de 2010, 13:07
Eu estava a utilizar o template da pololu e não me preocupei com o caso dos 3 sensores (ou 4) estarem com linha preta.

Fiz uns testes com este código:

Código: [Seleccione]
#include <PololuQTRSensors.h>

// create an object for four QTR-xRC sensors on digital pins 0 and 9, and on analog
// inputs 1 and 3 (which are being used as digital inputs 15 and 17 in this case)
PololuQTRSensorsRC qtr((unsigned char[]) {
  8, 9, 10, 1}
, 4);

void setup()
{
  // optional: wait for some input from the user, such as a button press
  // then start calibration phase and move the sensors over both
  // reflectance extremes they will encounter in your application:
  Serial.begin(9600);
  pinMode(13, OUTPUT);
  int i;
  for (i = 0; i < 250; i++) // make the calibration take about 5 seconds
  {
    qtr.calibrate();
    delay(20);
  }
}
// optional: signal that the calibration phase is now over and wait for further
// input from the user, such as a button press

void loop()
{
  unsigned int sensors[3];
  int number = 0;
  // get calibrated sensor values returned in the sensors array, along with the line position
  // position will range from 0 to 2000, with 1000 corresponding to the line over the middle sensor
  int position = qtr.readLine(sensors);
  Serial.print("0: ");
  Serial.println(sensors[0]);
    Serial.print("1: ");
  Serial.println(sensors[1]);
    Serial.print("2: ");
  Serial.println(sensors[2]);
    Serial.print("3: ");
  Serial.println(sensors[3]);
 delay(2000);
  // if all three sensors see very low reflectance, take some appropriate action for this situation
  if (sensors[0] > 750 && sensors[1] > 750 && sensors[2] > 750)
  {
    // do something.  Maybe this means we're at the edge of a course or about to fall off a table,
    // in which case, we might want to stop moving, back up, and turn around.
    return;
  }
  if( sensors[0] > 750)
    number = 1;

  else if( sensors[1] > 750)
    number = 2;

  else if( sensors[2] > 750)
    number = 3;

  else if( sensors[3] > 750)
    number = 4;

  for(int i=0;i< number;i++){
    digitalWrite(13,HIGH);
    delay(250);
    digitalWrite(13,LOW);
    delay(250);
  }
  delay(1000);

  // set motor speeds using the two motor speed variables above
}


Leio entre 0 e 10 decimal quando linha branca, e entre 500~1000 quando linha preta.

Tenho que fazer testes com o sensor no chão pois sinto que estou a ter mts interferências da luz ambiente visto estar perto de uma janela e com a barra de sensores virada para cima.
Título: Re: Robot de Busca e Salvamento!
Enviado por: fred gomes em 03 de Abril de 2010, 13:15
eu vou experimentar também esse código e vou ver o valor de "position" que obtenho, é que eu com o meu (mostrado em cima num dos post´s) os valores de position variam muito, tanto me dá certo, de 0 a 7000, como me dá valores estranhissimos (ao reiniciar a janela do serial monitor), mais logo eu experimento , e depois digo qualquer coisa ;)
Título: Re: Robot de Busca e Salvamento!
Enviado por: fred gomes em 06 de Abril de 2010, 20:25
Boas.
já consegui obter o valor de error, (de -3500, a 3500) o erro que estava a cometer é que não estava a calibrar os sensores, após o reset ao arduino, daí ter dito que as vezes o position dava certo, e outras não (nos post´s anteriores disse isso), pois nas vezes que dava certo devia de estar a calibrar os sensores sem querer, lool. Os sensores são calibrados ao serem passados no preto e no branco, esse processo deve ser feito após o reset feito no arduino.. (Obrigado por meteres alertado sobre a calibração TigPT :) ).

agora deparo-me com outro problema, após ter conseguido obter o error como esperado, não consigo controlar as velocidades dos motores como pretendo, não sei se estou a usar algo de errado, ou as funções da Pololu possam estar erradas , pois as variaveis "KP", "KD", "int motorspeed" eu não faço ideia de como funcionam, são "informações escondidas" que a Pololu nos fornece, e nós limitamonos a copiar, sem saber ao certo o que estamos a fazer..

e o que eu queria que vissem é se acham que tenho algum erro no meu codigo (ou defino mal as velocidades dos motores), ou caso contrario, o erro é mesmo das variaveis que estou a usar..

o código é o seguinte:

Código: [Seleccione]
#include <PololuQTRSensors.h>

PololuQTRSensorsRC qtr((unsigned char[]) {9,8,7,6,5,4,3,2}, 8);
int motor_right = 10;
int motor_left = 11;

//variaveis auxiliares.

int ltarguetval = 0;// valor a desejar no motor left.
int rtarguetval = 0;// valor a desejar no motor right.
int lnowval = 0;    // valor actual no motor left.
int rnowval = 0;    // valor actual no motor right.

void setup(){
  Serial.begin(9600);

  pinMode (motor_right, OUTPUT);
  pinMode (motor_left, OUTPUT);

  int i;
  for (i = 0; i < 250; i++)
  {
    qtr.calibrate();
    delay(20);
  }
}


void loop(){
  unsigned int sensors [8];
  int position = qtr.readLine(sensors);
  int error = position -3500;
  int lastError = 0;
  double KP = 0.1;
  int KD = 5;
  int motorspeed = KP * error + KD * (error - lastError);
  lastError = error;

  Serial.println (error);
  delay(500);
 
 
  if(sensors[0] > 750 && sensors[1] > 750 && sensors[2] > 750 && sensors[3] > 750 && sensors[4] > 750 && sensors[5] > 750 && sensors[6] > 750 && sensors[7] > 750)
  {
    return;
  }
 
  if(error > -500 && error < 500){
   rtarguetval = 200;
   ltarguetval = 200;
   error = lastError;
 }
 else if (error > 500 ){
    rtarguetval = (int)motorspeed;
    ltarguetval = 200;
    error = lastError;
  }
  else if ( error < -500){
    ltarguetval = (int)motorspeed;
    rtarguetval = 200;
    error = lastError;
  }
  if(rtarguetval > rnowval){
    rnowval +=1;
  }else if (rtarguetval < rnowval){
    rnowval -=1;
  }
  if (ltarguetval > lnowval){
    lnowval +=1;
  }else if(ltarguetval < lnowval){
    lnowval -=1;
  }
  analogWrite (motor_right,rtarguetval);
  analogWrite(motor_left, ltarguetval);
}

experimentei fazer o print de motorspeed, e vejam os valores que obtive:

17850
17850
17850
12750
7650
2550
-2550
-7650
-17850
-17850
 os valores variam consoante o sensor que vê preto,
sinseramente, parece me que o erro esteja aqui, e se assim for o erro está nas funções fornecidas pela Pololu., acho eu...

deixo aqui o link que me baseei para fazer este código,

http://www.pololu.com/docs/0J19/3 (http://www.pololu.com/docs/0J19/3)

agradeçia que me facultassem opiniões , e soluções  para o meu problema..
Título: Re: Robot de Busca e Salvamento!
Enviado por: TigPT em 06 de Abril de 2010, 20:29
As funções da pololu estão feitas possivelmente para o 3pi ou o orangus ou como se chama.

Para te podermos ajudar posta que motores estas a utilizar, e como é que estão feitas as ligações dos mesmos ao arduino.
Título: Re: Robot de Busca e Salvamento!
Enviado por: fred gomes em 06 de Abril de 2010, 20:33
estou a usar motores DC, as ligações estão feitas atraves de uma ponte H (L293D), a saidas PWM do arduino..
Título: Re: Robot de Busca e Salvamento!
Enviado por: TigPT em 06 de Abril de 2010, 20:34
A que pins? GateA 1 e 2 e GateB 1 e 2.
Título: Re: Robot de Busca e Salvamento!
Enviado por: fred gomes em 06 de Abril de 2010, 20:36
não :-\
pinos 9 e 10 para o motor right e left respectivamente , so estou a usar um sentido..pois so pretendo que o robot ande numa direcção..
Título: Re: Robot de Busca e Salvamento!
Enviado por: TigPT em 06 de Abril de 2010, 20:43
Ok, e já vi que estás a utilizar analogWrite()

Vamos pensar como espirito crítico em vez de simplesmente martelar umas coisas.

Citar
analogWrite(pin, value)

Parameters

pin: the pin to write to.

value: the duty cycle: between 0 (always off) and 255 (always on).

Logo o valor que vamos meter em value vai ser entre 0 e 255.
Se queremos um valor entre 0 e 255 e que 0 é tudo desligado e 255 é tudo ligado, temos que nos if - elses gerar estes valores!

Para simpleficar vamos só ver se a linha está à esquerda ou direita, e só mais tarde pensamos em quão distante está já que isto depende até das distancias entre eixos e da distancia que a barra sensorial está do eixo ou até do tipo de motores e da alimentação que lhe estamos a dar.

Tens:
Código: [Seleccione]
else if (error > 500 ){
    rtarguetval = (int)motorspeed;
    ltarguetval = 200;
    error = lastError;
  }
  else if ( error < -500){
    ltarguetval = (int)motorspeed;
    rtarguetval = 200;
    error = lastError;
  }

Mas queres algo como:
 
Código: [Seleccione]
else if (error > 500 ){
//vira à esquerda
    rtarguetval = 0;
    ltarguetval = 255;
  }
  else if ( error < -500){
//vira à direita
    rtarguetval = 255;
    ltarguetval = 0;
  }

Não sei se o sentido está certo que depende de qual está ligado onde mas é esta a lógica.

Só depois de ele se mover aos S's por andar sempre a um lado e outro é k vale a pena então começar a complicar para melhorar o desempenho.

OK fred!?
Título: Re: Robot de Busca e Salvamento!
Enviado por: fred gomes em 06 de Abril de 2010, 20:48
certo!
posso usar esssa tua sugestão, mas fazendo assim, no fundo estou a usar dois sensores para controlar o robot, e nao 8, como o array têm, lool., assim não estarei a aporveitar bem as potêncialidades do array :P , mas acho que o melhor é fazer assim, ou algo do genero sem usar as variaveis que a pololu fornece..
Título: Re: Robot de Busca e Salvamento!
Enviado por: microbyte em 06 de Abril de 2010, 21:28
Usa-la dentro do setup(), que corre no arranque.
Experimenta, depois de voltares a abrir a janela do Serial, carregar no "reset".
Já te tinha alertado para a calibração... -.-' enfim...
Os KP, KD são constantes de PID. Se ainda não te deparaste com isto nenhuma vez, não avances por aí... ;)

Quanto ao erro, deves sim usá-lo para teres uma condução mais suave, mas deves primeiro entender as coisas simples para passares para as coisas mais complicadas :D

Vai postando aqui, que nós vamos ajudando...
Título: Re: Robot de Busca e Salvamento!
Enviado por: TigPT em 06 de Abril de 2010, 22:12
Eu disse para fazeres isso agora, e sim vai-se comportar como 2 sensores mas para depois alterares para mais complexo.

Se não sabes conduzir micromachines, não vais conduzir buragos ou carros reais.

Temos que começar a fazer sentido com as coisas por baixo e só depois aumentar a complexidade.

Como o microbyte disse, não nos vamos meter em derivação proporcional integral se não sabemos que os valores máximos de uma função de controlo de motores é de 0 a 255. e como os controlar.

Algumas das abordagens que faço, por vezes a criticar ou a picar, não são para te mostrar uma solução, mas para te ensinar a observar e a aprenderes como chegar às soluções para que não sejas como colegas meus de faculdade que quando algo não funciona, antes de pensar martelam.

Força com isso... vai postando novidades ;)
Título: Re: Robot de Busca e Salvamento!
Enviado por: fred gomes em 07 de Abril de 2010, 15:53
ja idealizei a tua sugestão TigPT, e funcionou..
usei o seguinte código:

Código: [Seleccione]
#include <PololuQTRSensors.h>

PololuQTRSensorsRC qtr((unsigned char[]) {9,8,7,6,5,4,3,2}, 8);
int motor_right = 10;
int motor_left = 11;

//variaveis auxiliares.

int ltarguetval = 0;// valor a desejar no motor left.
int rtarguetval = 0;// valor a desejar no motor right.

void setup(){
  Serial.begin(9600);

  pinMode (motor_right, OUTPUT);
  pinMode (motor_left, OUTPUT);

  int i;
  for (i = 0; i < 250; i++)
  {
    qtr.calibrate();
    delay(20);
  }
}


void loop(){
  unsigned int sensors [8];
  int position = qtr.readLine(sensors);
  int error = position -3500;
  int velmax= 255;

  Serial.println (error);
  delay(500);
 
 
  if(sensors[0] > 750 && sensors[1] > 750 && sensors[2] > 750 && sensors[3] > 750 && sensors[4] > 750 && sensors[5] > 750 && sensors[6] > 750 && sensors[7] > 750)
  {
    return;
   
  }
  if (error <= 500 && error >=-500){
    rtarguetval = velmax;
    ltarguetval = velmax;
  }
  else if (error > 500 ){
    rtarguetval = 0;
    ltarguetval = velmax;
  }
  else if ( error < -500){
    ltarguetval = 0;
    rtarguetval = velmax;
  }
  analogWrite (motor_right,rtarguetval);
  analogWrite(motor_left, ltarguetval);
}

agora, será que alguem me consegue explicar como posso converter os valores de motorspeed para valores de 0 a 255?

eu tinha pensado em algo do genero: 

Código: [Seleccione]
val = motorspeed;
val = map(val,17850,2550,255,0);

mas acho que isos não é possivel, e já expeirmentei e não funcionou...
pois eu quero converter os valores mais altos em valores proximos de 0, e valores mais baixos em valores proximos de 255.

http://www.pololu.com/docs/0J19/3 (http://www.pololu.com/docs/0J19/3)

neste código, dizme como posso fazer para nao ter valores abaixo de 0.

Código: [Seleccione]
# int m1Speed = M1 + motorSpeed; 
#   int m2Speed = M2 - motorSpeed; 
#   
#   // it might help to keep the speeds positive (this is optional) 
#   // note that you might want to add a similiar line to keep the speeds from exceeding 
#   // any maximum allowed value 
#   if (m1Speed < 0) 
#     m1Speed = 0; 
#   if (m2Speed < 0) 
#     m2Speed = 0; 

no entanto, acho que eu não posso fazer o mesmo para nao ter valores acima de 255, pois so irei obter valores 0 e 255 apenas!, alguem me pode ajudar a fazer esta conversão?
Título: Re: Robot de Busca e Salvamento!
Enviado por: TigPT em 07 de Abril de 2010, 16:22
Citar
map(value, fromLow, fromHigh, toLow, toHigh)

Em vez de:
Código: [Seleccione]
val = motorspeed;
val = map(val,17850,2550,255,0);

Se dizes que:
Citar
experimentei fazer o print de motorspeed, e vejam os valores que obtive:

17850
17850
17850
12750
7650
2550
-2550
-7650
-17850
-17850

O que queres é:
Código: [Seleccione]
val = map(motorspeed,-17850,17850,255,0);Embora isto vá fazer com que o robot quando tem a linha do meio só anda a metade da velocidade, gera o que pretendes.

para o outro motor fazes os valores ao contrário para que ande mais lento quando a linha está do seu lado:
Código: [Seleccione]
val = map(motorspeed,-17850,17850,0,255);
Título: Re: Robot de Busca e Salvamento!
Enviado por: fred gomes em 07 de Abril de 2010, 17:03
eu acho que te enganaste a fazer isso Tiago, eu fiz:

Código: [Seleccione]
val = map(motorspeed,17850,2550,0,255);
 val = map(motorspeed,-17850,-2550,0,255);


  Serial.println (val);
  delay(500);
porque eu quero que a velocidade seja de 0 a 255 num lado (de 17850 a 2550) e igual no lado oposto(de -17850, a -2550), para assim os motores andarem à maxima velocidade quando está o sensor no centro..

esse meu exemplo demonstrado em cima deveria estar correcto, , funciona bem no lado esquerdo, mas no direito nao funciona, continua a aumentar,
no entanto se eu fizer assim:

 
Código: [Seleccione]
val = map(motorspeed,17850,2550,0,255);

  Serial.println (val);
  delay(500);

funciona no lado direito bem mas no esquerdo não..
a solução que eu queria era colocar tipo, valor absoluto de 2550 e 17850, assim o - era ignorado.. entendem? ..
mas não estou a conseguir fazer isso, eu tentei colocar abs 17850 e abs 2550, mas aponta erro..
sabem me dizer como se faz isso?

Título: Re: Robot de Busca e Salvamento!
Enviado por: fred gomes em 07 de Abril de 2010, 22:08
também ja experimentei fazer isto:

Código: [Seleccione]
  if (motorspeed == -motorspeed){
    motorspeed == motorspeed;
   
  }
 
  val = map(motorspeed,2550,17850,255,0);

e não funciona, alguem me consegue ajudar?
Título: Re: Robot de Busca e Salvamento!
Enviado por: senso em 07 de Abril de 2010, 22:13
Essa condição nunca vai acontecer, pois se o valor for negativo, ao colocares o - fica positivo, e vice-versa, deves querer algo do género de :
Citar
  if (motorspeed < 0){
    motorspeed = abs(motorspeed); //o == é uma comparação e não uma atribuição de um valor num registo
   
  }
 
  val = map(motorspeed,2550,17850,255,0);
Título: Re: Robot de Busca e Salvamento!
Enviado por: fred gomes em 07 de Abril de 2010, 22:38
ahh nao sabia que isso ia acontecer..
assim como disseste já funciona:D, era isso que estava a perguntar ao bocado como fazia, eu estava a tentar fazê-lo de forma diferente ( a colocar o abs dentro do motor speed, lool,  e estava a complicar tudo..

amanha monto o circuito todo e texto e posto aqui novidades..

obrigado pela ajuda :)
Título: Re: Robot de Busca e Salvamento!
Enviado por: microbyte em 07 de Abril de 2010, 22:55
Eu diria que nem precisas da condição...
se fizeres abs(motorspeed) apenas, ficas sempre com valores positivos.
Título: Re: Robot de Busca e Salvamento!
Enviado por: fred gomes em 10 de Maio de 2010, 20:22
Boas.
ja consegui fazer os motores funcionarem numa breadboard( aumentarem /diminuirem a velocidade consoante o erro, e ja montei as placas tdas..

so que ao textar as placas os motores puxam demasiada corrente da fonte, acabando por sobreaquecer o circuito, pq isso acontece? na breadboard nao aconteceu, e tenho tudo bem colocado..

outra coisa, na breadboard ligava os motores /sensores  proograma parava cerca de 5 segundos para fazer a calibração e depois continuava, ali nao, esta sempre andar e sem respeitar qualquer codigo, tentei ler os valores  no pc  e nem os calibrar direito consigo, e o serial monitor demora mto mais tempo a responder do que quando tinha o circuito na breadboard, alguem me consegue ajudar?.. eu ja estou a ficar sem saber o que fazer.. e nao consigo mesmo entender o que possa estar acontecer.. após aquilo ter funcionado na breadboard pensei que ja tivesse tdos os problemas resolvidos , mas não! e não consigo perceber porquê..

Título: Re: Robot de Busca e Salvamento!
Enviado por: fred gomes em 10 de Maio de 2010, 20:42
outra coisa,
eu na alimentação uso uma bateria de 6Volts, 3.2A , alimento o breduino com 5 volts e a parte dos motores (ponte H) com os 6 volts..

tenho 4 pinos em paralelo, dois deles tem o regulador à sua frente e vao alimentar o breduino e sensores, e os outros dois estao em paralelo com os outros dois que contem a alimentação e vao ligar ao array dos motores..., acham que o problema pode ser dai? eu acho que não,mas nao sei nada:/
Título: Re: Robot de Busca e Salvamento!
Enviado por: microbyte em 11 de Maio de 2010, 13:01
Como é que estás a alimentar o Arduino? Com esses 6v? Ou meteste um regulador para 5v?
É que se estás a regular 6v para 5v, não vai funcionar...

Os reguladores para 5v funcionam normalmente de 7v para cima.
Título: Re: Robot de Busca e Salvamento!
Enviado por: fred gomes em 11 de Maio de 2010, 18:00
meti um regulador para 5 volts, (L7805 se nao me engano) e antes do regulador puxei dois fios para alimentar a ponte H..

na breadboard funcionou tdo bem, mas agora não, ..

eu jánao consigo ler o erro dos sensores em condições, dá bem em alguns sensores e noutros não:/, se calhar tenho a placa dos sensores estragada...

 :-\
Título: Re: Robot de Busca e Salvamento!
Enviado por: fred gomes em 11 de Maio de 2010, 18:54
nao funcionam, estao a calcular o erro normalmente mas dois sensores não funcionam, não apontam o erro como deve ser, devem estar danificados, ou então não sei..
Título: Re: Robot de Busca e Salvamento!
Enviado por: fred gomes em 14 de Maio de 2010, 22:19
Boas..
como os sensores da pololu parece que se estragaram (estragando se um sensor vai o array todo á vida), decidi fazer uma nova programação,com um array de 5 sensores "normais" efectuando uma leitura digital..,

baseei-me neste tópico para fazer a programação: http://lusorobotica.com/index.php?topic=1841.0 (http://lusorobotica.com/index.php?topic=1841.0) , e desde já agradeço ao microbyte  que me esclareceu algumas dúvidas  sobre o mesmo código elaborado por ele.. :)

o erro nao me varia de 0.0, e gostava que vissem a programação e me ajudassem a descobrir o porquê disso acontecer.., aida não coloquei uma possibilidade para dois sensores verem preto (isso so acontecerá num possivel cruzamento, partindo do principio que o robot esta sempre dentro da pista, mas para já o meu problema não me parece ser esse, pois ja experimentei colocar so um sensor sobre o preto e o erro é sempre o mesmo (0.0).

Código: [Seleccione]
/* variaveis de utilizadas*/

const int nsensores = 5;
const int sensor[] = {3,4,5,6,7};
const int motor_right = 10;
const int motor_left = 11;

/* variaveis auxiliares*/
 
int senval[] = {0,0,0,0,0};
int vel_right = 0;
int vel_left = 0;
int maxvel = 200;
double errorval = 0.0;
boolean stop = false;

void setup(){
  Serial.begin(9600);
  pinMode (motor_right, OUTPUT);
  pinMode (motor_left, OUTPUT);
  pinMode (3, INPUT);
  pinMode (4, INPUT);
  pinMode (5, INPUT);
  pinMode (6, INPUT);
  pinMode (7, INPUT);
  digitalWrite (3, HIGH);
  digitalWrite (4, HIGH);
  digitalWrite (5, HIGH);
  digitalWrite (6, HIGH);
  digitalWrite (7, HIGH);
}
void loop(){
 
 
  //1º lemos o valor dos sensores
  readALLsensores();
  for (int i = 0; i < nsensores; i++){    //este loop não está aqui a fazer nada
  }
   
  if(errorval < 0.0){
    vel_left = (int)(maxvel*(1-fabs(errorval)));
    vel_right = (int)(maxvel);
  }
  else if(errorval > 0.0){
    vel_left = (int)(maxvel);
    vel_right = (int)(maxvel*(1-errorval));
  }
  else{
    vel_left = (int)(maxvel);
    vel_right = (int)(maxvel);
  }
  //Fazer actuar os motores:
  analogWrite(motor_right,vel_right);
  analogWrite(motor_left, vel_left);
 
  delay(10);
  Serial.println(errorval);
  delay(500);
 
}

//FUNÇOES:
void readALLsensores(){
  for (int i=0; i < nsensores; i++)
  {
    senval[i] = digitalRead (sensor[i]);
  }
}

// escolher o sensor que esta sobre a linha
int bestsensor(int senval[])
{
  int best = 0;
  for (int i=0; i < nsensores; i++)
  {
    if(senval[i] == 1){
      best = i;     
    }
  }
  return best;
}
double error(int senval[])
{
  int best = bestsensor (senval);
  double lineError(int senVal[]);
 
  double error = 0.0;
  errorval = error;
 
  if (best== 0){
    error = -1.0;
  }
  else if(best== 1){
    error = -0.5;
  }
  else if( best == 2){
    error = 0.0;
  }
  else if(best == 3){
    error = 0.5;
  }
  else if(best == 4){
    error = 1.0;
  }
  return error;
}

se me conseguissem ajudar a descobrir qual o meu erro agradeçia :)

Título: Re: Robot de Busca e Salvamento!
Enviado por: nunosilvarocha em 14 de Maio de 2010, 22:30
e umas fotos da evolução do projecto??
acho que ficava bem!!
Título: Re: Robot de Busca e Salvamento!
Enviado por: senso em 14 de Maio de 2010, 23:37
Código: [Seleccione]
/* variaveis de utilizadas*/

const int nsensores = 5;
const int sensor[] = {2,3,4,5,6};
const int motor_right = 10;
const int motor_left = 11;

/* variaveis auxiliares*/
 
int senval[] = {0,0,0,0,0};
int vel_right = 0;
int vel_left = 0;
int maxvel = 200;
double errorval = 0.0;
boolean stop = false;

void setup(){
  Serial.begin(9600);
  pinMode (motor_right, OUTPUT);
  pinMode (motor_left, OUTPUT);
  for(i = 0; i < nsensores;i++){   //Não devia ser antes pinMode(sensor[i],INPUT) ? acho que o maior erro está aqui
    digitalWrite(sensor[i],HIGH);
}
void loop(){
 
 
  //1º lemos o valor dos sensores
  readALLsensores();
  for (int i = 0; i < nsensores; i++){    //este loop não está aqui a fazer nada
  }
   
  if(errorval < 0.0){
    vel_left = (int)(maxvel*(1-fabs(errorval)));
    vel_right = (int)(maxvel);
  }
  else if(errorval > 0.0){
    vel_left = (int)(maxvel);
    vel_right = (int)(maxvel*(1-errorval));
  }
  else{
    vel_left = (int)(maxvel);
    vel_right = (int)(maxvel);
  }
  //Fazer actuar os motores:
  analogWrite(motor_right,vel_right);
  analogWrite(motor_left, vel_left);
 
  delay(10);
  Serial.println(errorval);
  delay(500);
 
}

//FUNÇOES:
void readALLsensores(){
  for (int i=0; i < nsensores; i++)
  {
    senval[i] = digitalRead(sensor[i]);
  }
}

// escolher o sensor que esta sobre a linha
int bestsensor(int senval[])
{
  int best = 0;
  for (int i=0; i < nsensores; i++)
  {
    if(senval[i] == 1){
      best = i;     
    }
  }
  return best;
}
double error(int senval[])
{
  int best = bestsensor (senval);
  double lineError(int senVal[]);
 
  double error = 0.0;
  errorval = error;
 
  if (best== 3){
    error = -1.0;
  }
  else if(best== 4){
    error = -0.5;
  }
  else if( best == 5){
    error = 0.0;
  }
  else if(best == 6){
    error = 0.5;
  }
  else if(best == 7){
    error = 1.0;
  }
  return error;
}

Acho que o teu problema está logo no meu primeiro comentário ;)
Título: Re: Robot de Busca e Salvamento!
Enviado por: OxyGen em 14 de Maio de 2010, 23:41
Concordo com o senso... Esqueceste-te de definir os estados dos pinos, se entradas ou se são saídas... quanto ao ciclo for, abres e fechas as chavetas logo a seguir, logo estas a ocupar tempo do controlador desnecessariamente.
Título: Re: Robot de Busca e Salvamento!
Enviado por: senso em 14 de Maio de 2010, 23:43
Não ocupa nada porque o gcc é suficientemente inteligente para ver que aquele ciclo não faz nada e optimiza-o para fora do código, o maior erros de newbies em avr-gcc é tentar fazer ciclos de delays e depois dizem que não funcionam, o compilador vê que não são uteis para nada, logo fora que é peso
Título: Re: Robot de Busca e Salvamento!
Enviado por: fred gomes em 15 de Maio de 2010, 13:03
eu ciriei esse cilco for porque não consigo fazer " digitalWrite(sensor[],HIGH), quanto ao pinMode(sensor[],INPUT) esqueçime de o fazer, foi um erro.

mas mesmo para fazer isso tenho de fazer um ciclo for dentro do detup(){, se não o compilador aponta-me erro, sabem me dizer como o posso fazer sem recorrer ao ciclo for??

quanto ás fotos, ainda so tenho as placas finais montadas, mas o projecto em si ainda nao tem forma, necessito que o a parte electronica funcione (programação mais propiamente) antes de começar a montar tudo..

quando tiver estes problemas resolvidos e o projecto ja começe a ganhar forma posto fotos..
Título: Re: Robot de Busca e Salvamento!
Enviado por: senso em 15 de Maio de 2010, 13:53
Fazer digitalWrite(sensor[],HIGH) onde?
No setup, para que queres meter os sensores com o valor lógico 1(5v) se eles são sensores vão mandar sinais, não és tu que os mandas a eles, estás sujeito a queimar algum ou fazer um curto-circuito, quanto ao teres que fazer um for, é normal que d? erro, porque tens de dizer ao pinMode qual o numero do pin, se lhe passas um array ele não sabe o que fazer e dá erro.
Se não queres um for faz assim:
Código: [Seleccione]
pinMode(2,INPUT);
pinMode(3,INPUT);
pinMode(4,INPUT);
pinMode(5,INPUT);
pinMode(6,INPUT);

para o ciclo for, tens outro erro que me passou ao lado:

Código: [Seleccione]
for(i = 0; i < nsensores;i++){   //Não devia ser antes pinMode(sensor,INPUT) ? acho que o maior erro está aqui
    digitalWrite(sensor[i],HIGH); //tambem faltava o [i], que é o indice do array
}

Parece que tens alguns problemas em trabalhar com arrays.
Se configuras um pino como entrada e depois o metes a HIGH, activas o pull-up nesse pino, logo isso tambem te pode trazer problemas nas leituras, se é uma entrada, não tentes mais escreves no registo de saida,porque se é para entrar dados não é para tentares fazer saida de dados.
Título: Re: Robot de Busca e Salvamento!
Enviado por: fred gomes em 15 de Maio de 2010, 14:45
e é mesmo isso que eu pretendo, ao colocar os sensores a HIGH estou a colocar um pullup no colector do fototransistor, não necessitando assim de o colocar no circuito, e poupando assim 5 resistências.

Eu já experimentei e textei com "esses pullup´s" efectuados, e as leituras funcionam bem,

no entanto não consigo deixar de obter um erro diferente de 0.0 não sei porquê :-\ e era aí que queria que me ajudassem.,

Ps: em cima deichei o código já alterado.
Título: Re: Robot de Busca e Salvamento!
Enviado por: amando96 em 15 de Maio de 2010, 15:02
O sensor da sharp não precisa de resistencia.
Título: Re: Robot de Busca e Salvamento!
Enviado por: fred gomes em 15 de Maio de 2010, 15:06
eu estou a usar estes sensores: http://loja.lusorobotica.com/64-optical-detector-phototransistor.html (http://loja.lusorobotica.com/64-optical-detector-phototransistor.html) , precisam dum pullup no colector para funcionarem.
Título: Re: Robot de Busca e Salvamento!
Enviado por: senso em 15 de Maio de 2010, 21:11
Não estarás a confundir uma resistência em série com a linha de saida do sensor e um pull-up, é que assim o sensor se não mandar muita corrente, o arduino vai sempre ler 1 em todos e por isso não te muda o erro porque para o arduino está sempre tudo a 1, não ligues os pull-ups e volta a experimentar.
É que no datasheet não referem nada sobre pull-ups, mas tambem só li na diagonal
Título: Re: Robot de Busca e Salvamento!
Enviado por: fred gomes em 15 de Maio de 2010, 21:17
isso esta correcto senso, o problema não é daí.
eu se experimentar obter o valor dos sensores com este código:

Código: [Seleccione]
int sensor1 = 3;
int sensor2 = 4;
int sensor3 = 5;
int sensor4 = 6;
int sensor5 = 7;

void setup(){
  Serial.begin(9600);
  digitalWrite(sensor1, HIGH);
  digitalWrite(sensor2,HIGH);
  digitalWrite(sensor3,HIGH);
  digitalWrite(sensor4,HIGH);
  digitalWrite(sensor5,HIGH);
}

void loop(){
  Serial.println(digitalRead(sensor1));
  Serial.println(digitalRead(sensor2));
  Serial.println(digitalRead(sensor3));
  Serial.println(digitalRead(sensor4));
  Serial.println(digitalRead(sensor5));
  Serial.println("----");
  delay(2000);
}

obtenho tudo na perfeição..
o meu problema esta mesmo em programação no código anterior, mas não sei em quê..

eu tambem queria fazer print do bestsensor, mas não consigo chamar a função bestsensor no loop(){, o compilador aponta erro :-\
Título: Re: Robot de Busca e Salvamento!
Enviado por: fred gomes em 16 de Maio de 2010, 10:08
também experimentei este código:

Código: [Seleccione]
int sensor1 = 2;
int sensor2 = 3;
int sensor3 = 4;
int sensor4 = 5;
int sensor5 = 6;
double errorval = 0.0;

void setup(){
  Serial.begin(9600);
  digitalWrite(sensor1, HIGH);
  digitalWrite(sensor2,HIGH);
  digitalWrite(sensor3,HIGH);
  digitalWrite(sensor4,HIGH);
  digitalWrite(sensor5,HIGH);
}

void loop(){
 
  if(digitalRead(sensor1 == 1)){
    errorval = 1.0;
  }
  else if (digitalRead(sensor2 == 1)){
    errorval = 0.5;
  }
  else if (digitalRead(sensor3 == 1)){
    errorval = 0.0;
  }
  else if (digitalRead(sensor4 == 1)){
    errorval = -0.5;
  }
  else if(digitalRead (sensor5 == 1)){
    errorval = -1.0;
  }
  Serial.println(errorval);
  delay(500);
}
 

e o errorval não me varia de 1.0, não consigo mesmo perceber porque isto acontece :-\ , se alguem me conseguir ajudar agradeçia, deixo aqui também o meu codigo "base" que o errorval também não varia não sei porqquê.. :-\

Código: [Seleccione]
/* variaveis de utilizadas*/

const int nsensores = 5;
const int sensor[] = {2,3,4,5,6};
const int motor_right = 10;
const int motor_left = 11;

/* variaveis auxiliares*/
 
int senval[] = {0,0,0,0,0};
int vel_right = 0;
int vel_left = 0;
int maxvel = 200;
double errorval = 0.0;
boolean stop = false;

void setup(){
  Serial.begin(9600);
  pinMode (motor_right, OUTPUT);
  pinMode (motor_left, OUTPUT);
  pinMode (0, INPUT);
  pinMode (1, INPUT);
  pinMode (2, INPUT);
  pinMode (3, INPUT);
  pinMode (4, INPUT);
  digitalWrite (0, HIGH);
  digitalWrite (1, HIGH);
  digitalWrite (2, HIGH);
  digitalWrite (3, HIGH);
  digitalWrite (4, HIGH);
}
void loop(){
 
  //1º lemos o valor dos sensores
  readALLsensores();
 
  if(errorval < 0.0){
    vel_left = (int)(maxvel*(1-fabs(errorval)));
    vel_right = (int)(maxvel);
  }
  else if(errorval > 0.0){
    vel_left = (int)(maxvel);
    vel_right = (int)(maxvel*(1-errorval));
  }
  else{
    vel_left = (int)(maxvel);
    vel_right = (int)(maxvel);
  }
  //Fazer actuar os motores:
  analogWrite(motor_right,vel_right);
  analogWrite(motor_left, vel_left);
 
  delay(10);
  Serial.println(errorval);
  delay(500);
 
}

//FUNÇOES:
void readALLsensores(){
  for (int i=0; i < nsensores; i++)
  {
    senval[i] = digitalRead (sensor[i]);
  }
}

// escolher o sensor que esta sobre a linha
int bestsensor(int senval[])
{
  int best = 0;
  for (int i=0; i < nsensores; i++)
  {
    if(senval[i] == 1){
      best = i;     
    }
  }
  return best;
}
double error(int senval[])
{
  int best = bestsensor (senval);
  double lineError(int senVal[]);
 
  double error = 0.0;
  errorval = error;
 
  if (best== 0){
    error = -1.0;
  }
  else if(best== 1){
    error = -0.5;
  }
  else if( best == 2){
    error = 0.0;
  }
  else if(best == 3){
    error = 0.5;
  }
  else if(best == 4){
    error = 1.0;
  }
  return error;
}

desde já agradeço as ajudas;)
Título: Re: Robot de Busca e Salvamento!
Enviado por: microbyte em 16 de Maio de 2010, 22:03
também experimentei este código:

Código: [Seleccione]
int sensor1 = 2;
int sensor2 = 3;
int sensor3 = 4;
int sensor4 = 5;
int sensor5 = 6;
double errorval = 0.0;

void setup(){
  Serial.begin(9600);
  digitalWrite(sensor1, HIGH);
  digitalWrite(sensor2,HIGH);
  digitalWrite(sensor3,HIGH);
  digitalWrite(sensor4,HIGH);
  digitalWrite(sensor5,HIGH);
}

void loop(){
 
  if(digitalRead(sensor1 == 1)){
    errorval = 1.0;
  }
  else if (digitalRead(sensor2 == 1)){
    errorval = 0.5;
  }
  else if (digitalRead(sensor3 == 1)){
    errorval = 0.0;
  }
  else if (digitalRead(sensor4 == 1)){
    errorval = -0.5;
  }
  else if(digitalRead (sensor5 == 1)){
    errorval = -1.0;
  }
  Serial.println(errorval);
  delay(500);
}
 

e o errorval não me varia de 1.0, não consigo mesmo perceber porque isto acontece :-\ , se alguem me conseguir ajudar agradeçia, deixo aqui também o meu codigo "base" que o errorval também não varia não sei porqquê.. :-\

Código: [Seleccione]
/* variaveis de utilizadas*/

const int nsensores = 5;
const int sensor[] = {2,3,4,5,6};
const int motor_right = 10;
const int motor_left = 11;

/* variaveis auxiliares*/
 
int senval[] = {0,0,0,0,0};
int vel_right = 0;
int vel_left = 0;
int maxvel = 200;
double errorval = 0.0;
boolean stop = false;

void setup(){
  Serial.begin(9600);
  pinMode (motor_right, OUTPUT);
  pinMode (motor_left, OUTPUT);
  pinMode (0, INPUT);
  pinMode (1, INPUT);
  pinMode (2, INPUT);
  pinMode (3, INPUT);
  pinMode (4, INPUT);
  digitalWrite (0, HIGH);
  digitalWrite (1, HIGH);
  digitalWrite (2, HIGH);
  digitalWrite (3, HIGH);
  digitalWrite (4, HIGH);
}
void loop(){
 
  //1º lemos o valor dos sensores
  readALLsensores();
 
  if(errorval < 0.0){
    vel_left = (int)(maxvel*(1-fabs(errorval)));
    vel_right = (int)(maxvel);
  }
  else if(errorval > 0.0){
    vel_left = (int)(maxvel);
    vel_right = (int)(maxvel*(1-errorval));
  }
  else{
    vel_left = (int)(maxvel);
    vel_right = (int)(maxvel);
  }
  //Fazer actuar os motores:
  analogWrite(motor_right,vel_right);
  analogWrite(motor_left, vel_left);
 
  delay(10);
  Serial.println(errorval);
  delay(500);
 
}

//FUNÇOES:
void readALLsensores(){
  for (int i=0; i < nsensores; i++)
  {
    senval[i] = digitalRead (sensor[i]);
  }
}

// escolher o sensor que esta sobre a linha
int bestsensor(int senval[])
{
  int best = 0;
  for (int i=0; i < nsensores; i++)
  {
    if(senval[i] == 1){
      best = i;     
    }
  }
  return best;
}
double error(int senval[])
{
  int best = bestsensor (senval);
  double lineError(int senVal[]);
 
  double error = 0.0;
  errorval = error;
 
  if (best== 0){
    error = -1.0;
  }
  else if(best== 1){
    error = -0.5;
  }
  else if( best == 2){
    error = 0.0;
  }
  else if(best == 3){
    error = 0.5;
  }
  else if(best == 4){
    error = 1.0;
  }
  return error;
}

desde já agradeço as ajudas;)


Por exemplo, aqui:
if(digitalRead(sensor1 == 1))

estás a meter uma condição no argumento da funcao... ou seja, primeiro o Arduino vai ver se a variável "sensor1" é igual a "1", depois mete esse resultado (TRUE/FALSE) no argumento do digitalRead();

O que tu queres fazer é o digitalRead() do "sensor1" e depois comparar com "1", ou seja:
if(digitalRead(sensor1) == 1){

Talvez por isto, o primeiro if seja sempre TRUE e por isso recebes sempre erro = 1.0
Título: Re: Robot de Busca e Salvamento!
Enviado por: senso em 16 de Maio de 2010, 23:36
Tens outro erro, na função error estás a criar uma tabela senval nova e não a que tem o valor dos teus sensores, e mais outra coisa:
Código: [Seleccione]
double error(int senval[])
{
  int best = bestsensor (senval);
  double lineError(int senVal[]);
 
  double error = 0.0;
  errorval = error;
 
  if (best== 0){
    error = -1.0;
  }
  else if(best== 1){
    error = -0.5;
  }
  else if( best == 2){
    error = 0.0;
  }
  else if(best == 3){
    error = 0.5;
  }
  else if(best == 4){
    error = 1.0;
  }
  return error;
}
O teu indice dos best== não é 1,2,3,4 mas sim 2,3,4,5,6.
Título: Re: Robot de Busca e Salvamento!
Enviado por: OxyGen em 16 de Maio de 2010, 23:38
Correcto!
Título: Re: Robot de Busca e Salvamento!
Enviado por: microbyte em 17 de Maio de 2010, 00:39
Sim... Se espreitaram o código do meu XMasRoBot verão que muitas funções são retiradas de lá. Não me estou a gabar, muito menos a queixar, se eu as disponibilizei é para as usarem à vontade. Mas muitas vezes o pessoal limita-se ao Copy/paste e nem percebe o que está a fazer...

Vai dando notícias fred...

PS: ET na vanguarda xD
Título: Re: Robot de Busca e Salvamento!
Enviado por: fred gomes em 17 de Maio de 2010, 00:53
sim, o microbyte tem razão no que disse, eu deixei mais atras também que segui o tutorial dele para fazer este código..

o problema não me parece ser disso dos sensores , acho que se define mesmo pela ordem que eu fiz (0,1, etc), e já experimentei alterar mas mesmo assim não funciona..

quanto ao código anterior, o erro era esse que disseste microbyte, ja funciona.. estou agora a tentar que funcione este..

segundo o que disseste anteriormente , eu acho que o meu erro esta aqui:

Código: [Seleccione]
    if(senval[i] == 1){
      best = i;     
    }
  }

mas experimentei fazer :
Código: [Seleccione]
senval[i] == digitalRead (sensor[i]);
    if (senval[i] = 1){
      best = i;
e mesmo assim não dá..
Título: Re: Robot de Busca e Salvamento!
Enviado por: microbyte em 17 de Maio de 2010, 01:04
É assim... Não te podes esquecer que no meu caso, tinha os sensores ligados ao conversor analógico.
E eu achava o "best" - o sensor mais próximo da linha - como o que tinha o valor mais "preto"... Espero que isto esteja claro para ti.

Quando passas para uma abordagem digital, passas a ter 0 e 1 apenas, não podes comparar com algo entre 0 e 1023.
Vais ter de encontrar outra forma de encontrar o "erro"... Com 5 sensores, podes ter estas situações, EXEMPLOS:
01110 -> o best seria o 3 -> erro 0.0
00100 -> o best é o 3 -> erro 0.0
10000 -> o best é o 1 -> erro -1.0
11000 -> a linha estará no meio das linhas -> o erro estará algures no meio dos dois -0.75
11110 -> pode ser o 2 ou o 3, aqui tu é que decides também ->
11111 -> deves ter especial atenção a esta situação

As situações ideais são aquelas em que só um deles está a 1, mas pode acontecer facilmente que mais do que um "veja" a linha e tu tens de pensar numa forma de contornar essas situações e pensar em todas elas...

Uma coisa que deves fazer é no papel primeiro e só depois passares para a programação, porque só consegues fazer um programa se souberes exactamente a solução para o problema que está à tua frente.

Espero ter-te dado algumas dicas.
Título: Re: Robot de Busca e Salvamento!
Enviado por: fred gomes em 17 de Maio de 2010, 01:12
eu pensei nisso, mas estava a contar que apenas um sensor visse a linha (so nos cruzamentos é que mais que 1 poderia ver a linha (tendo a linha pouca expessura), e para resolver isso estava a pensar em algo do tipo " se mais que um sensor tiver o valor 1 mais de 200 ms { robot para), ainda não sei bem como o programar, não sei se um AND de 1 com 1 basta, mas acho que não pq tenho 5 sensores..

mas a minha forma de pensar era essa, daí so ter colocado assim..
mas eu ja percebi o que quiseste dizer,
dizme so uma coisa, eu para fazer o print de errorval não vou necessitar de chamar a função de error no loop()??

algo do tipo:

Código: [Seleccione]
void loop(){
 
 
  //1º lemos o valor dos sensores
  readALLsensores();
  for (int i = 0; i < nsensores; i++){    //este loop não está aqui a fazer nada
  }
  double error();
   
  if(errorval < 0.0){
    vel_left = (int)(maxvel*(1-fabs(errorval)));
    vel_right = (int)(maxvel);

etc.
Título: Re: Robot de Busca e Salvamento!
Enviado por: senso em 17 de Maio de 2010, 17:38
Código: [Seleccione]
senval[i] == digitalRead (sensor[i]);
    if (senval[i] = 1)   //mais um erro aqui, para ser uma comparação é com == assim estás a atribuir o valor 1 á variavel e não a comparar com 1{
      best = i;
Título: Re: Robot de Busca e Salvamento!
Enviado por: fred gomes em 17 de Maio de 2010, 19:26
ja alterei o código,mas aponta me alguns erros que não consigo corrigir..

Código: [Seleccione]
´/* variaveis de utilizadas*/

const int nsensores = 5;
const int sensor[] = {2,3,4,5,6};
const int motor_right = 10;
const int motor_left = 11;

/* variaveis auxiliares*/
 
int senval[] = {0,0,0,0,0};
int vel_right = 0;
int vel_left = 0;
int maxvel = 200;
double errorval = 0.0;
boolean stop = false;

void setup(){
  Serial.begin(9600);
  pinMode (motor_right, OUTPUT);
  pinMode (motor_left, OUTPUT);
  pinMode (0, INPUT);
  pinMode (1, INPUT);
  pinMode (2, INPUT);
  pinMode (3, INPUT);
  pinMode (4, INPUT);
  digitalWrite (0, HIGH);
  digitalWrite (1, HIGH);
  digitalWrite (2, HIGH);
  digitalWrite (3, HIGH);
  digitalWrite (4, HIGH);
}
void loop(){
 
  //1º lemos o valor dos sensores
  readALLsensores();
 
  if(errorval < 0.0){
    vel_left = (int)(maxvel*(1-fabs(errorval)));
    vel_right = (int)(maxvel);
  }
  else if(errorval > 0.0){
    vel_left = (int)(maxvel);
    vel_right = (int)(maxvel*(1-errorval));
  }
  else{
    vel_left = (int)(maxvel);
    vel_right = (int)(maxvel);
  }
  //Fazer actuar os motores:
  analogWrite(motor_right,vel_right);
  analogWrite(motor_left, vel_left);
 
  delay(10);
  Serial.println(errorval);
  delay(500);
 
}

//FUNÇOES:
void readALLsensores(){
  for (int i=0; i < nsensores; i++)
  {
    senval[i] = digitalRead (sensor[i]);
  }
}

// escolher o sensor que esta sobre a linha
int bestsensor(int senval[])
{
  int best = 0;
  for (int i=0; i < nsensores; i++)
  {
    if(senval) == 00100){
      best = 2;
    }
    else if (senval) == 01110){
      best = 2;
    else if (senval) == 11000){
      best = 0 && best = 1;
    }
    else if (senval) == 00011){
      best = 3 && best = 4;
    }
    else if (senval) == 10000){
      best = 0;
    }
    else if (senval) == 00001){
      best = 4;
    }
    else if (senval) == 01100){
      best = 1 && best = 2;
    }
    else if (senval) == 00110){
      best = 2 && best = 3;
    }
    else if (senval) == 01000){
      best = 1;
    }
    else if (senval) == 00010){
      best = 3;
    }
  }
}
double error(int senval[])
{
  int best = bestsensor (senval);
  double lineError(int senVal[]);
 
  double error = 0.0;
  errorval = error;
 
  if (best == 0){
    error = -1.0;
  }
  else if (best == 0 && 1){
    error = -0.75;
  }
  else if (best == 1){
    error = -0.5;
  }
  else if (best == 1 && 2){
    error = -0.25;
  }
  else if (best == 2){
    error = 0.0;
  }
  else if (best == 2 && 3){
    error = 0.25;
  }
  else if (best = 3){
    error = 0.5;
  }
  else if (best = 3 && 4){
    error = 0.75;
  }
  else if (best = 4){
    error = 1.0:
  }
  return error;
}

aqui:

Código: [Seleccione]
bestsensor(int senval[])
{
  int best = 0;
  for (int i=0; i < nsensores; i++)
  {
    if(senval) == 00100){
      best = 2;
porque me é apontado ume rro em função de intbestsensor(intsenval[])?,

também me é apontado um erro por ter isto

Código: [Seleccione]
if(senval) == 00100) , e não consigo perceber de onde vêem esses erros, alguem me consegue explicar isso para que eu os possa corrigir?

Título: Re: Robot de Busca e Salvamento!
Enviado por: Tyran em 17 de Maio de 2010, 19:44
Falta-te um
Código: [Seleccione]
return best;
na função.

E esse if não tem os parêntesis bem, deveria ser
Código: [Seleccione]
if (senval == 00100)

E já agora, é mesmo esse valor em decimal ou queres em binário? Se for em binário tens de usar a nomenclatura 0b ficando 0b00100, pelo menos em C standard...
Título: Re: Robot de Busca e Salvamento!
Enviado por: fred gomes em 17 de Maio de 2010, 19:58
não, eu não quero em linguagem nenhuma, tenho o senval que vai memorizar o valor digital de todos os sensores,  se calhar falta me uma virgula entre cada algarismo..

eu ja posto novidades..
Título: Re: Robot de Busca e Salvamento!
Enviado por: senso em 17 de Maio de 2010, 20:08
Estás a programar em C, logo convem saberes como é que se programa, certo?
Tens muitos muito problemas mais ou menos básicos, tais como distinguir numeros em base 10, de binários e assim e quando te digo isto não é para criticar pois ninguem nasce ensinado, é mesmo para ires procurar saber mais para melhorares os teus programas porque se meteres 00100 em vez de 0b00100, o compilador não te dá erro mas o teu programa tambem nunca funciona, estás a perceber?
Título: Re: Robot de Busca e Salvamento!
Enviado por: fred gomes em 17 de Maio de 2010, 21:50
sim senso, tens razão.. eu ainda tenho algumas dificuldades básicas que estou a tentar corrigir..

eu ainda tenho algumas duvidas, tais como:

eu tenho :
Código: [Seleccione]
int senval[] = {0,0,0,0,0};
eu posso fazer
Código: [Seleccione]
if (senval) == 0b00000 , não deveria ser antes :
Código: [Seleccione]
if (senval) == (0,0,0,0,0) , a minha duvida no fundo é se o compilador vai ler o senval como um número binário..

ja alterei o meu código , no entanto não consigo corrigir os meus erros, talvez por causa dessas duvidas..

Código: [Seleccione]
/* variaveis de utilizadas*/

const int nsensores = 5;
const int sensor[] = {2,3,4,5,6};
const int motor_right = 10;
const int motor_left = 11;

/* variaveis auxiliares*/
 
int senval[] = {0,0,0,0,0};
int vel_right = 0;
int vel_left = 0;
int maxvel = 200;
double errorval = 0.0;
boolean stop = false;

void setup(){
  Serial.begin(9600);
  pinMode (motor_right, OUTPUT);
  pinMode (motor_left, OUTPUT);
  pinMode (0, INPUT);
  pinMode (1, INPUT);
  pinMode (2, INPUT);
  pinMode (3, INPUT);
  pinMode (4, INPUT);
  digitalWrite (0, HIGH);
  digitalWrite (1, HIGH);
  digitalWrite (2, HIGH);
  digitalWrite (3, HIGH);
  digitalWrite (4, HIGH);
}
void loop(){
 
  // 1º chamamos a função que cácula o erro;
 
  double LineError();
 
  if(errorval < 0.0){
    vel_left = (int)(maxvel*(1-fabs(errorval)));
    vel_right = (int)(maxvel);
  }
  else if(errorval > 0.0){
    vel_left = (int)(maxvel);
    vel_right = (int)(maxvel*(1-errorval));
  }
  else{
    vel_left = (int)(maxvel);
    vel_right = (int)(maxvel);
  }
  //Fazer actuar os motores:
  analogWrite(motor_right,vel_right);
  analogWrite(motor_left, vel_left);
 
  delay(10);
 
  Serial.println(errorval);
  delay(500);
 
}
 
// escolher o sensor que esta sobre a linha

double LineError(senval[])
{
  double error = 0.0;
  for (int i=0; i < nsensores; i++){
   
    senval[i] = digitalRead (sensor[i]);
  }
  if (senval) == 0b10000){
    error = -1.0;
  }
  else if (senval) == 0b11000){
    error = -0.75;
  }
  else if (senval) == 0b01000){
    error = -0.5;
  }
  else if (senval) == 0b01100){
    error = -0.25;
  }
  else if(senval) == 0b00100 || 0b01110){
    error = 0.0;
  }
  else if (senval) == 0b00110){
    error = 0.25;
  }
  else if(senval) == 0b00010){
    error = 0.5;
  }
  else if (senval) == 0b00011){
    error = 0.75;
  }
  else if (senval) == 0b00001){
    error = 1.0;
  }
  return error;
  error = errorval;
}


agradeçia a vossa ajuda e as vossas criticas também, eu não  as levo a mal, mas mais como um "abre olhos" , as criticas  fazem bem para podermos corrigi-las e aprender com elas..
Título: Re: Robot de Busca e Salvamento!
Enviado por: senso em 17 de Maio de 2010, 22:16
Então, ora vamos lá começar pelo mais simples:
Código: [Seleccione]
if(senval) ==0b00001){
bla bla bla}
Isto está errado, porque para começar abres só um parêntese, mas fechas dois, só ai tens logo um erro no compilador, tens de fazer assim:
Código: [Seleccione]
if (senval == 0b00001){
bla bla bla}
Isto já está correcto do ponto de vista do compilador, mas tens mais erros, para começar o senval é um array, ou seja uma lista de numeros, e se queres ler essa lista, tens de ler só um numero de cada vez e para isso usas o indice, que é o que fica entre os [ ]
dai quando les os sensores dentro do loop for, fazer senval, em que i é o indice em que vais ler/escrever no array, logo ao fazeres senval == 0b00001 é outro erro pois o compilador não sabe o que fazer com isso.
Se não te importas mostra aqui o código completo de onde copias-te essa função se faz favor, não tem mal em copiar, pois é uma maneira de se aprender, mas mostra aqui, como te disse, retira o int senval[] do argumento da função porque já tens uma tabela senval que crias-te no inicio do programa.
Se souberes ingles aconselho a ler :
http://www.smileymicros.com/ (http://www.smileymicros.com/)
Andas com a página para baixo e do teu lado direito tem uma barra com o nome "Smiley's Workshop", saca esses ficheiros e começa a ler, são para outra plataforma, mas as bases de C que te são dadas são muito boas.
Isto aqui é uma tentativa de meter a tua função a funcionar,já foi compilado e compila sem erros, testa lá isto a ver se dá, já agora, antes de ligares os motores ao arduino, liga antes led's aos pinos onde vais ligar os motores, assim se tiveres um erro na ligação dos mesmos, pelo menos sabes que o teu código funciona:
Código: [Seleccione]
/* variaveis de utilizadas*/

const int nsensores = 5;
const int sensor[] = {2,3,4,5,6};
const int motor_right = 10;
const int motor_left = 11;

/* variaveis auxiliares*/
 
int senval[] = {0,0,0,0,0};
int vel_right = 0;
int vel_left = 0;
int maxvel = 200;
double errorval = 0.0;
boolean stop = false;

void setup(){
  Serial.begin(9600);
  pinMode (motor_right, OUTPUT);
  pinMode (motor_left, OUTPUT);
  pinMode (2, INPUT); //dizes que os teus sensores estão em 2,3,4,5,6 e depois usas os pinos 0,1,2,3,4?
  pinMode (3, INPUT); //ao usares o pino 0 e 1 que são usados para a ligação serial, estás a afectar essa mesma
  pinMode (4, INPUT); //comunicação assim como os valores lidos pelo sensor
  pinMode (5, INPUT);
  pinMode (6, INPUT);
  digitalWrite (2, HIGH);
  digitalWrite (3, HIGH);
  digitalWrite (4, HIGH);
  digitalWrite (5, HIGH);
  digitalWrite (6, HIGH);
}
void loop(){
 errorval = LineError(); //nunca estavas a chamar a função, logo como é que o loop ia saber o valor do error?

  if(errorval < 0.0){
    vel_left = (int)(maxvel*(1-fabs(errorval)));
    vel_right = (int)(maxvel);
  }
  else if(errorval > 0.0){
    vel_left = (int)(maxvel);
    vel_right = (int)(maxvel*(1-errorval));
  }
  else{
    vel_left = (int)(maxvel);
    vel_right = (int)(maxvel);
  }
  //Fazer actuar os motores:
  analogWrite(motor_right,vel_right);
  analogWrite(motor_left, vel_left);
 
  delay(10);
 
  Serial.println(errorval);
  delay(500); //acho que este valor de delay devia ser mais pequeno, pois meio segundo com o arduino a não fazer nada é muito tempo
}
 
// escolher o sensor que esta sobre a linha

double LineError()
{
  double error = 0.0;
  for (int i=0; i < nsensores; i++){
   
    senval[i] = digitalRead (sensor[i]);
  }
  unsigned int valorsensor=senval[0]+senval[1]<<1+senval[2]<<2+senval[3]<<3+senval[4]<<4; //o que isto faz é juntar os valores do array senval num numero só
//assim já podes fazer as comparações nos if's
  if (valorsensor== 0b10000){
    error = -1.0;
  }
  else if (valorsensor == 0b11000){
    error = -0.75;
  }
  else if (valorsensor == 0b01000){
    error = -0.5;
  }
  else if (valorsensor == 0b01100){
    error = -0.25;
  }
  else if(valorsensor == (0b00100 || 0b01110)){
    error = 0.0;
  }
  else if (valorsensor == 0b00110){
    error = 0.25;
  }
  else if (valorsensor == 0b00010){
    error = 0.5;
  }
  else if (valorsensor == 0b00011){
    error = 0.75;
  }
  else if (valorsensor == 0b00001){
    error = 1.0;
  }

  return error;
}
Título: Re: Robot de Busca e Salvamento!
Enviado por: fred gomes em 17 de Maio de 2010, 22:31
muito obrigado por responderes senso, e obrigado pelo link que me mandaste, amanha vou começar a lê-lo e a tentar perceber melhor a linguagem C++.

tenho ainda algumas questões a fazer em relação ao código que postaste,

para chamar a função não devo fazer apenas "LineError();" ?? , é que no código que mostraste fizestes " Errorval = LineError();" e também experimentei no compilador e nesse fragmento é acusado erro..
 --
 a outra questão é aqui:

Código: [Seleccione]
unsigned int valorsensor=senval[0]+senval[1]<<1+senval[2]<<2+senval[3]<<3+senval[4]<<4;
isto nunca tinha visto em qualquer outro código, é a 1ª vez que vejo algo deste genero.. e não percebo.., não sei se te enganaste ou é mesmo assim..

não deveria ser assim:
Código: [Seleccione]
unsigned int valorsensor=senval[0]<<0+senval[1]<<1+senval[2]<<2+senval[3]<<3+senval[4]<<4;

digo isto pela lógica, se estou errado, pq no 1º termo dos sensores escreveste sem o sinal "<<" ??

PS: quanto ao código, vi na programação do XmasRobot, do microbyte ( http://lusorobotica.com/index.php?topic=1841.0 (http://lusorobotica.com/index.php?topic=1841.0) ).
Título: Re: Robot de Busca e Salvamento!
Enviado por: microbyte em 17 de Maio de 2010, 22:33
o "<<" é um operador e serve para fazer operações em binário.
Desloca os bits todos x casas para a esquerda (ao fazeres <<0 nao deslocas nada)

Isto está tudo no site do Arduino.

E quanto à chamada da função dar erro... Já tentaste ler qual é o erro?
Título: Re: Robot de Busca e Salvamento!
Enviado por: senso em 17 de Maio de 2010, 22:42
Não dá erro que eu já compilei, não é preciso fazer <<0 porque o << é um shift left, ou seja faz o numero andar para a esquerda, fazer <<0 é mandar andar o numero 0 vezes para a esquerda, logo não é preciso.
Sim, para chamares uma função que tenha um return no fim, ou seja como o teu LineError, quando a chamas tens de guardar o que ela manda no return numa variavel, dai fazer Errorval=LineError.
Eu compilei esse código que ai meti, faz o upload dele para o teu arduino e ve se funciona como queres ou não, altera as tuas ligações para ficarem correctas em relação ao novo código.
Título: Re: Robot de Busca e Salvamento!
Enviado por: fred gomes em 17 de Maio de 2010, 22:43
o error continua a ser sempre 0.0,
mas eu chamei a função apenas assim:

Código: [Seleccione]
LineError();
e no fim de calcular o error na função LineError coloquei
Código: [Seleccione]
errorval = error;
Ps : no meu compilador dá me erro como colocaste "o chamamento" da função Senso.
Título: Re: Robot de Busca e Salvamento!
Enviado por: senso em 17 de Maio de 2010, 22:47
Isso não funciona assim, pois a variavel que usas na função LineError não é conhecida dentro da função loop, copias-te o código TODO?
É que aqui compila sem qualquer erro.
Aqui está um printscreen dele a compilar sem problemas:
(https://lusorobotica.com/proxy.php?request=http%3A%2F%2Fimg62.imageshack.us%2Fimg62%2F4246%2Fsemttuloiy.jpg&hash=16af77d164c3da84797323ad8ca21bd30c7d6b6d)
Título: Re: Robot de Busca e Salvamento!
Enviado por: fred gomes em 17 de Maio de 2010, 22:55
já não dá erro.
reiniciei o programa do arduino e deixou de dar.. mas o error não varia de 0.0, já experimentei com o outro código a ver se a leitura dos sensores estava a ser bem efectuada e esta tudo correcto..
Título: Re: Robot de Busca e Salvamento!
Enviado por: microbyte em 17 de Maio de 2010, 22:58
Agora é uma questão de debug, ver o que ele está a receber dos sensores, com PRINT(), ver quais são os IF() que estão passar, e os que não passam... etc...
Título: Re: Robot de Busca e Salvamento!
Enviado por: senso em 17 de Maio de 2010, 22:59
Código: [Seleccione]
int sensor1 = 3;
int sensor2 = 4;
int sensor3 = 5;
int sensor4 = 6;
int sensor5 = 7;

void setup(){
  Serial.begin(9600);
  digitalWrite(sensor1, HIGH);
  digitalWrite(sensor2,HIGH);
  digitalWrite(sensor3,HIGH);
  digitalWrite(sensor4,HIGH);
  digitalWrite(sensor5,HIGH);
}

void loop(){
  Serial.println(digitalRead(sensor1));
  Serial.println(digitalRead(sensor2));
  Serial.println(digitalRead(sensor3));
  Serial.println(digitalRead(sensor4));
  Serial.println(digitalRead(sensor5));
  Serial.println("----");
  delay(2000);
Com este código funciona?
Porque é que neste tens os sensores nos pinos 3,4,5,6,7 quando no outro tens nos pinos 2,3,4,5,6 ?
E antes tinhas 0,1,2,3,4 ?
Tens de te decidir rapaz, altera lá os pinos no código para serem sempre os mesmo e mete as ligações de acordo com os pinos que decidires usar e volta a tentar.
Título: Re: Robot de Busca e Salvamento!
Enviado por: senso em 17 de Maio de 2010, 22:59
Agora é uma questão de debug, ver o que ele está a receber dos sensores, com PRINT(), ver quais são os IF() que estão passar, e os que não passam... etc...
Penso que é mais questão de ele ainda não ter decidido que pinos quer usar, vê a minha outra mensagem lol
Título: Re: Robot de Busca e Salvamento!
Enviado por: microbyte em 17 de Maio de 2010, 23:02
Pois, já estou a ver...
É que isto de andar a alternar entre programas nunca dá nada de jeito, acabamos por nos perder nas coisas mais elementares, como é a declaração dos pinos que vamos usar.

Mais uma vez, ele tirou o código do meu, que foi uma abordagem analógica, por isso os pinos iam do 0 ao 4, mas 0 a 4 nos analógicos. Nos pinos digitais, só podemos usar a partir do 2...

Altera lá isso fred, e faz alguns prints e vê se está tudo ok.
Título: Re: Robot de Busca e Salvamento!
Enviado por: senso em 17 de Maio de 2010, 23:04
Pois, é que já aqui vai uma misturada de todos os tamanhos, mas vamos lá ver se o rapaz consegue meter isto a funcionar bem.
Com tanto pessoal de Aveiro aqui no fórum temos é de fazer um Arduino Hack-day lol
Título: Re: Robot de Busca e Salvamento!
Enviado por: microbyte em 17 de Maio de 2010, 23:06
OffT: Era uma ideia engraçada... Porque não?
Título: Re: Robot de Busca e Salvamento!
Enviado por: fred gomes em 17 de Maio de 2010, 23:10
não dá :-\
o problema esta no valorsensor, os valores que ele me fornece não são zeros e uns..
Título: Re: Robot de Busca e Salvamento!
Enviado por: senso em 17 de Maio de 2010, 23:11
Somos pelo menos uns 4, e isto de estar em pessoa para tirar duvidas e fazer algo de funcional é sempre outra coisa que estar no pc.
E com 3 na UA até devia dar para fazer uma boa equipa para o micro-rato, que para o ano queria participar e tal.
Pois não, ele vai fornecer mais que zeros e uns para comparar com aqueles numeros em binário nos if's
Título: Re: Robot de Busca e Salvamento!
Enviado por: microbyte em 17 de Maio de 2010, 23:15
não dá :-\
o problema esta no valorsensor, os valores que ele me fornece não são zeros e uns..
Fred... Antes de te preocupares com o valorsensor, preocupa-te com aquilo que tens no array senval...

Mete isto no loop() -> para debug apenas! não vai funcionar por causa disto...
Código: [Seleccione]
for (int i=0; i < nsensores; i++){
   print(senval[i]);
}
println();
Título: Re: Robot de Busca e Salvamento!
Enviado por: fred gomes em 17 de Maio de 2010, 23:24
não consigo meter essa função no loop pq dá me erro, mas fiz o print do senval, e acho estranho..

tipo, ele lê bem os sensores, mas quand acaba de ler os 5 sensores imprime um valor (consoante o nº o sensor que esta a ver preto) , imprime 2048, 1024 e 512 :s , porque isso acontece?
Título: Re: Robot de Busca e Salvamento!
Enviado por: microbyte em 17 de Maio de 2010, 23:32
Mas que erro é que da????
É que é fácil dizer que dá erro, mas lê-lo e tentar corrigi-lo também não é difícil...

Isso é o mais normal do mundo, pois essa é a base do código binário.
Lê sobre sistemas de numeração, código binário e perceberás.

Pelo que disseste, já percebi que estás a ler bem os sensores (pelo menos os últimos)... Mas gostava que metesses o código que te enviei no loop para perceberes se à partida os valores sobre os quais estás a trabalhar estão correctos, pois se vamos corrigir o que está para a frente, corremos o risco de ter já uma propagação do erro.

Dica: print() e println() são funções da classe Serial
Título: Re: Robot de Busca e Salvamento!
Enviado por: fred gomes em 17 de Maio de 2010, 23:38
Se fizer como disseste , no loop, o senval dá me sempre 0,

e tipo, quando acaba de lêr os 5 sensores (print (linha horizontal), coloca um 0 em baixo (linha vertical) e volta a ler os 5 sensores em linha horizontal..

não sei se percebeste, assim:

00000
0
00000 , etc.
Título: Re: Robot de Busca e Salvamento!
Enviado por: senso em 17 de Maio de 2010, 23:45
Posta aqui o código, sem código é o mesmo que ir buscar a bola de cristal para adivinhar, os valores 2048, 1024,512, são os valores de binário convertido para decimal, mas são valores um bocado altos só para 5bits de binário, mostra ai o teu código actual todo sff.
Título: Re: Robot de Busca e Salvamento!
Enviado por: fred gomes em 17 de Maio de 2010, 23:48
Código: [Seleccione]
/* variaveis de utilizadas*/

const int nsensores = 5;
const int sensor[] = {2,3,4,5,6};
const int motor_right = 10;
const int motor_left = 11;

/* variaveis auxiliares*/
 
int senval[] = {0,0,0,0,0};
int vel_right = 0;
int vel_left = 0;
int maxvel = 200;
double errorval = 0.0;
boolean stop = false;

void setup(){
  Serial.begin(9600);
  pinMode (motor_right, OUTPUT);
  pinMode (motor_left, OUTPUT);
  pinMode (2, INPUT);     
  pinMode (3, INPUT);     
  pinMode (4, INPUT);     
  pinMode (5, INPUT);
  pinMode (6, INPUT);
  digitalWrite (2, HIGH);
  digitalWrite (3, HIGH);
  digitalWrite (4, HIGH);
  digitalWrite (5, HIGH);
  digitalWrite (6, HIGH);
}
void loop(){
  for (int i=0; i < nsensores; i++){
   Serial.print(senval[i]);
}
Serial.println();
 
 
 errorval = LineError();   
  if(errorval < 0.0){
    vel_left = (int)(maxvel*(1-fabs(errorval)));
    vel_right = (int)(maxvel);
  }
  else if(errorval > 0.0){
    vel_left = (int)(maxvel);
    vel_right = (int)(maxvel*(1-errorval));
  }
  else{
    vel_left = (int)(maxvel);
    vel_right = (int)(maxvel);
  }
  //Fazer actuar os motores:
  analogWrite(motor_right,vel_right);
  analogWrite(motor_left, vel_left);
 
  delay(10);
 

}
 
// escolher o sensor que esta sobre a linha

double LineError()
{
  double error = 0.0;
  for (int i=5; i < nsensores; i++){
   
    senval[i] = digitalRead (sensor[i]);
    Serial.println (senval[i]);
    delay(500);
  }
  unsigned int valorsensor=senval[2]+senval[3]<<3+senval[4]<<4+senval[5]<<5+senval[6]<<6;   //o que isto faz é juntar os valores do array senval num numero só                                 //assim já podes fazer as comparações nos if's
  if (valorsensor== 0b10000){
    error = -1.0;
  }
  else if (valorsensor == 0b11000){
    error = -0.75;
  }
  else if (valorsensor == 0b01000){
    error = -0.5;
  }
  else if (valorsensor == 0b01100){
    error = -0.25;
  }
  else if(valorsensor == (0b00100 || 0b01110)){
    error = 0.0;
  }
  else if (valorsensor == 0b00110){
    error = 0.25;
  }
  else if (valorsensor == 0b00010){
    error = 0.5;
  }
  else if (valorsensor == 0b00011){
    error = 0.75;
  }
  else if (valorsensor == 0b00001){
    error = 1.0;
  }
  Serial.println(valorsensor);
  delay(200);

  return error;
}
Título: Re: Robot de Busca e Salvamento!
Enviado por: microbyte em 17 de Maio de 2010, 23:52
Pronto, assim já temos onde pegar... Então é o seguinte...
Isso está a imprimir duas linhas, porque tens duas coisas a imprimir...
os 5 zeros são da parte do código que eu te passei...
o outro zero deve ser de outro println() que tenhas para lá... ( ?? Serial.println(errorval); ?? )

Bom...
Se tens uma linha perto dos sensores, algo se passa na leitura. Porque pelo menos 1 dos bits devia estar a 1.
Se tens os bits todos a 0, é normal que o erro dê sempre, 0.
Sabes porque? Porque dentro da função a primeira coisa que fazes é pôr a variável temporária a 0.0 e depois os if's que tens falham todos: não tens nenhum if para a situação em que eles estão todos a 0.

Não estou a dizer que está mal, estou só a explicar porque é que estás a obter sempre erro = 0.

Algo se passa com a ligação aos sensores... Pois nenhum deles está pelos vistos a retornar 1.

E tens demasiados prints, depois não sabes o que é o quê.
Título: Re: Robot de Busca e Salvamento!
Enviado por: microbyte em 17 de Maio de 2010, 23:57
/* variaveis de utilizadas*/

const int nsensores = 5;
const int sensor[] = {2,3,4,5,6};
const int motor_right = 10;
const int motor_left = 11;

/* variaveis auxiliares*/
 
int senval[] = {0,0,0,0,0};
int vel_right = 0;
int vel_left = 0;
int maxvel = 200;
double errorval = 0.0;
boolean stop = false;

void setup(){
  Serial.begin(9600);
  pinMode (motor_right, OUTPUT);
  pinMode (motor_left, OUTPUT);
  pinMode (2, INPUT);     
  pinMode (3, INPUT);     
  pinMode (4, INPUT);     
  pinMode (5, INPUT);
  pinMode (6, INPUT);
  digitalWrite (2, HIGH);
  digitalWrite (3, HIGH);
  digitalWrite (4, HIGH);
  digitalWrite (5, HIGH);
  digitalWrite (6, HIGH);
}
void loop(){
  for (int i=0; i < nsensores; i++){
   Serial.print(senval);
}
Serial.println();
 
 
 errorval = LineError();   
  if(errorval < 0.0){
    vel_left = (int)(maxvel*(1-fabs(errorval)));
    vel_right = (int)(maxvel);
  }
  else if(errorval > 0.0){
    vel_left = (int)(maxvel);
    vel_right = (int)(maxvel*(1-errorval));
  }
  else{
    vel_left = (int)(maxvel);
    vel_right = (int)(maxvel);
  }
  //Fazer actuar os motores:
  analogWrite(motor_right,vel_right);
  analogWrite(motor_left, vel_left);
 
  delay(10);
 

}
 
// escolher o sensor que esta sobre a linha

double LineError()
{
  double error = 0.0;
  for (int i=5; i < nsensores; i++){
   
    senval = digitalRead (sensor);
    Serial.println (senval); <- está a mais... pois vamos imprimir todos os valores no loop()... tira
    delay(500); <- este delay aqui está a fazer o quê? qual é o objectivo?
  }
  unsigned int valorsensor=senval[2]+senval[3]<<3+senval[4]<<4+senval[5]<<5+senval[6]<<6; <- o teu array senval tem 5 posições, ou seja, os indices vao do 0 ao 4, nao é do 2 ao 6... Isto é uma asneira grave e percebe-se que ainda não entendeste o que estás a fazer.
  if (valorsensor== 0b10000){
    error = -1.0;
  }
  else if (valorsensor == 0b11000){
    error = -0.75;
  }
  else if (valorsensor == 0b01000){
    error = -0.5;
  }
  else if (valorsensor == 0b01100){
    error = -0.25;
  }
  else if(valorsensor == (0b00100 || 0b01110)){ <- Não sei se podes fazer isto
    error = 0.0;
  }
  else if (valorsensor == 0b00110){
    error = 0.25;
  }
  else if (valorsensor == 0b00010){
    error = 0.5;
  }
  else if (valorsensor == 0b00011){
    error = 0.75;
  }
  else if (valorsensor == 0b00001){
    error = 1.0;
  }
  Serial.println(valorsensor); <- este print só vai confundir
  delay(200); <- também não percebo porque é que tens outro delay dentro da função... isto é delay em cima de delay

  return error;
}
Título: Re: Robot de Busca e Salvamento!
Enviado por: senso em 18 de Maio de 2010, 00:01
Experimenta este código e tira ai umas fotos ao teu circuito se faz favor ;)
Este código foi compilado e não dá erros ;)

Código: [Seleccione]
/* variaveis de utilizadas*/

const int nsensores = 5;
const int sensor[] = {2,3,4,5,6};
const int motor_right = 10;
const int motor_left = 11;

/* variaveis auxiliares*/
 
int senval[] = {0,0,0,0,0};
int vel_right = 0;
int vel_left = 0;
int maxvel = 200;
double errorval = 0.0;
boolean stop = false;

void setup(){
  Serial.begin(9600);
  pinMode (motor_right, OUTPUT);
  pinMode (motor_left, OUTPUT);
  pinMode (2, INPUT);     
  pinMode (3, INPUT);     
  pinMode (4, INPUT);     
  pinMode (5, INPUT);
  pinMode (6, INPUT);
  digitalWrite (2, HIGH);
  digitalWrite (3, HIGH);
  digitalWrite (4, HIGH);
  digitalWrite (5, HIGH);
  digitalWrite (6, HIGH);
}
void loop(){
  //estavas a imprimir uma tabela que está a 0 e que não é preenchida nesta função, logo não é preciso para nada
 
 
 errorval = LineError();   
  if(errorval < 0.0){
    vel_left = (int)(maxvel*(1-fabs(errorval)));
    vel_right = (int)(maxvel);
  }
  else if(errorval > 0.0){
    vel_left = (int)(maxvel);
    vel_right = (int)(maxvel*(1-errorval));
  }
  else{
    vel_left = (int)(maxvel);
    vel_right = (int)(maxvel);
  }
  //Fazer actuar os motores:
  analogWrite(motor_right,vel_right);
  analogWrite(motor_left, vel_left);
 
  delay(1000);    //mudei para 1000 para te mandar a leitura dos sensores de 1 em 1segundo, e mesmo assim deve ser muito rápdio
 

}
 
// escolher o sensor que esta sobre a linha

double LineError()
{
  double error = 0.0;

  for (int i=5; i < nsensores; i++){
   
    senval[i] = digitalRead (sensor[i]);
  }
Serial.println("Valor do array senval:");
for(int j=0; j<nsensores; j++){
Serial.print(senval[j]);
}

//convem que só imprimas os valores depois de os teres lidos todos, porque a função print é um bocado lenta e pode interferir na leitura
  unsigned int valorsensor=senval[2]+senval[3]<<3+senval[4]<<4+senval[5]<<5+senval[6]<<6;   //o que isto faz é juntar os valores do array senval num numero só                                 //assim já podes fazer as comparações nos if's
  if (valorsensor== 0b10000){
    error = -1.0;
  }
  else if (valorsensor == 0b11000){
    error = -0.75;
  }
  else if (valorsensor == 0b01000){
    error = -0.5;
  }
  else if (valorsensor == 0b01100){
    error = -0.25;
  }
  else if(valorsensor == (0b00100 || 0b01110)){
    error = 0.0;
  }
  else if (valorsensor == 0b00110){
    error = 0.25;
  }
  else if (valorsensor == 0b00010){
    error = 0.5;
  }
  else if (valorsensor == 0b00011){
    error = 0.75;
  }
  else if (valorsensor == 0b00001){
    error = 1.0;
  }
  Serial.println();    //imprime uma linha em branco
  Serial.println("Valor do erro val:");
  Serial.println(valorsensor);

  return error;
}

Título: Re: Robot de Busca e Salvamento!
Enviado por: fred gomes em 18 de Maio de 2010, 00:05
o valor do array dá-me sempre 0 em tdos os sensores , mas seu eu usar aquele meu outro código, vejo que o problema não é da sligaçoes dos sensores, pq nesse consigo lêr os valores de forma correcta..

eu também acho que o valor que me deveria dar devia ser só uns, e não zeros, uma vez que tenho todos os sensores a HIGH

Título: Re: Robot de Busca e Salvamento!
Enviado por: microbyte em 18 de Maio de 2010, 00:05
Senso lê a correcção que fiz, penso que o teu também não irá funcionar, por causa dos indices do array senval e os shifts, aquilo vai para ali uma confusão pegada...

unsigned int valorsensor=senval[4]+senval[3]<<1+senval[2]<<2+senval[1]<<3+senval[0]<<4;

Tenta com este...
Título: Re: Robot de Busca e Salvamento!
Enviado por: senso em 18 de Maio de 2010, 00:07
Nem reparei que ele tinha alterado aquilo.
Nem percebo porque..

if(valorsensor == (0b00100 || 0b01110))
Pois, isto tem de ser antes assim:
if((valorsensor==0b00100) || (0b01110)));
Título: Re: Robot de Busca e Salvamento!
Enviado por: microbyte em 18 de Maio de 2010, 00:12
Eu até percebo... Foi por causa da correcção que fizeste aos índices... E então toca a alterar todos...  ;D
Estou convicto que se leres um pouco sobre arrays não vais perder nada e vais perceber melhor o que estás a fazer.

Uma vez que são só 5, podes guardar isso em 5 variáveis independentes para não te criar confusão.
Título: Re: Robot de Busca e Salvamento!
Enviado por: fred gomes em 18 de Maio de 2010, 00:18
pronto já dá..
erro tão básico :-X , tenho de tomar mais atenção no que faço..

o código que tenho é este:

Código: [Seleccione]
/* variaveis de utilizadas*/

const int nsensores = 5;
const int sensor[] = {2,3,4,5,6};
const int motor_right = 10;
const int motor_left = 11;

/* variaveis auxiliares*/
 
int senval[] = {0,0,0,0,0};
int vel_right = 0;
int vel_left = 0;
int maxvel = 200;
double errorval = 0.0;
boolean stop = false;

void setup(){
  Serial.begin(9600);
  pinMode (motor_right, OUTPUT);
  pinMode (motor_left, OUTPUT);
  pinMode (2, INPUT);     
  pinMode (3, INPUT);     
  pinMode (4, INPUT);     
  pinMode (5, INPUT);
  pinMode (6, INPUT);
  digitalWrite (2, HIGH);
  digitalWrite (3, HIGH);
  digitalWrite (4, HIGH);
  digitalWrite (5, HIGH);
  digitalWrite (6, HIGH);
}
void loop(){
  for (int i=0; i < nsensores; i++){
   Serial.print(senval);
}
Serial.println();
 
 
 errorval = LineError();   
  if(errorval < 0.0){
    vel_left = (int)(maxvel*(1-fabs(errorval)));
    vel_right = (int)(maxvel);
  }
  else if(errorval > 0.0){
    vel_left = (int)(maxvel);
    vel_right = (int)(maxvel*(1-errorval));
  }
  else{
    vel_left = (int)(maxvel);
    vel_right = (int)(maxvel);
  }
  //Fazer actuar os motores:
  analogWrite(motor_right,vel_right);
  analogWrite(motor_left, vel_left);
 
  delay(10);
 

}
 
// escolher o sensor que esta sobre a linha

double LineError()
{
  double error = 0.0;
  for (int i=5; i < nsensores; i++){
   
    senval = digitalRead (sensor);
  }
  unsigned int valorsensor=senval[0]+senval[1]<<1+senval[2]<<2+senval[3]<<3+senval[4]<<4;
  if (valorsensor== 0b10000){
    error = -1.0;
  }
  else if (valorsensor == 0b11000){
    error = -0.75;
  }
  else if (valorsensor == 0b01000){
    error = -0.5;
  }
  else if (valorsensor == 0b01100){
    error = -0.25;
  }
  else if((valorsensor == (0b00100)||(0b01110))){
    error = 0.0;
  }
  else if (valorsensor == 0b00110){
    error = 0.25;
  }
  else if (valorsensor == 0b00010){
    error = 0.5;
  }
  else if (valorsensor == 0b00011){
    error = 0.75;
  }
  else if (valorsensor == 0b00001){
    error = 1.0;
  }

  return error;
}

antes de proceguir, expliquem-me uma coisa sff, aquele , serial.print(); faz o quê exactamente?

Ps: o erro está logo no inicio do loop, nao estava a fazer o digitalRead dos sensores..
Título: Re: Robot de Busca e Salvamento!
Enviado por: senso em 18 de Maio de 2010, 00:27
O serial.println();?
Esse imprime uma linha para que não fiques com os numeros todos seguidos numa linha e depois não sabes qual é qual.
Já agora, troca:
if(valorsensor == (0b00100 || 0b01110))

por:
if((valorsensor == 0b00100) || (valorsensor == 0b01110)))
Título: Re: Robot de Busca e Salvamento!
Enviado por: microbyte em 18 de Maio de 2010, 00:27
Oh fred... Vê lá se o que tens no for foi o que eu disse...

E pelos vistos também mexeste no for dentro da função...
Assim torna-se muito difícil ajudar-te. Mexes em 500 coisas ao mesmo tempo, pões o que está mal, bem, e o que está bem, mal... Assim nunca mais vais ter isso a funcionar...
Título: Re: Robot de Busca e Salvamento!
Enviado por: senso em 18 de Maio de 2010, 00:48
Uma pessoa da-lhe um código compilado para ele testar e está sempre a trocar tudo, assim não dá...
Amanha é outro dia lol
Título: Re: Robot de Busca e Salvamento!
Enviado por: fred gomes em 18 de Maio de 2010, 18:56
eu ontem tinha me enganado a copiar o código, o código é este:

Código: [Seleccione]
/* variaveis de utilizadas*/

const int nsensores = 5;
const int sensor[] = {2,3,4,5,6};
const int motor_right = 10;
const int motor_left = 11;

/* variaveis auxiliares*/
 
int senval[] = {0,0,0,0,0};
int vel_right = 0;
int vel_left = 0;
int maxvel = 200;
double errorval = 0.0;
boolean stop = false;

void setup(){
  Serial.begin(9600);
  pinMode (motor_right, OUTPUT);
  pinMode (motor_left, OUTPUT);
  pinMode (2, INPUT);     
  pinMode (3, INPUT);     
  pinMode (4, INPUT);     
  pinMode (5, INPUT);
  pinMode (6, INPUT);
  digitalWrite (2, HIGH);
  digitalWrite (3, HIGH);
  digitalWrite (4, HIGH);
  digitalWrite (5, HIGH);
  digitalWrite (6, HIGH);
}
void loop(){
  for (int i = 0; i < nsensores; i++){
    senval[i] = digitalRead(sensor[i]);
    Serial.print(senval[i]);
}
Serial.println();
 
 
 errorval = LineError();   
  if(errorval < 0.0){
    vel_left = (int)(maxvel*(1-fabs(errorval)));
    vel_right = (int)(maxvel);
  }
  else if(errorval > 0.0){
    vel_left = (int)(maxvel);
    vel_right = (int)(maxvel*(1-errorval));
  }
  else{
    vel_left = (int)(maxvel);
    vel_right = (int)(maxvel);
  }
  //Fazer actuar os motores:
  analogWrite(motor_right,vel_right);
  analogWrite(motor_left, vel_left);
 
  delay(10);
 

}
 
// escolher o sensor que esta sobre a linha

double LineError()
{
  double error = 0.0;
  for (int i=5; i < nsensores; i++){
   
    senval[i] = digitalRead (sensor[i]);
  }
  unsigned int valorsensor=senval[0]+senval[1]<<1+senval[2]<<2+senval[3]<<3+senval[4]<<4; 
  if (valorsensor== 0b10000){
    error = -1.0;
  }
  else if (valorsensor == 0b11000){
    error = -0.75;
  }
  else if (valorsensor == 0b01000){
    error = -0.5;
  }
  else if (valorsensor == 0b01100){
    error = -0.25;
  }
  else if((valorsensor==0b00100) || (0b01110)){
    error = 0.0;
  }
  else if (valorsensor == 0b00110){
    error = 0.25;
  }
  else if (valorsensor == 0b00010){
    error = 0.5;
  }
  else if (valorsensor == 0b00011){
    error = 0.75;
  }
  else if (valorsensor == 0b00001){
    error = 1.0;
  }
  return error;
}
, e consigo lêr o senval em condições..

agora se eu fizer o print de valorsensor o valor que obtenho é sempre 0 :s , pq o valorsensor não varia?
Título: Re: Robot de Busca e Salvamento!
Enviado por: microbyte em 18 de Maio de 2010, 19:11
Tens de nos dizer que valores recebeste do array...
E onde no código puseste o print do valorsensor?
Título: Re: Robot de Busca e Salvamento!
Enviado por: fred gomes em 18 de Maio de 2010, 20:12
sim, quando um o/os sensores vêem preto dá me o valor 1, quando branco 0, ..

o print do valor sensor coloquei  a seguir á instrução que calcula o valor sensor..

estou a usar este codigo:

Código: [Seleccione]
/* variaveis de utilizadas*/

const int nsensores = 5;
const int sensor[] = {2,3,4,5,6};
const int motor_right = 10;
const int motor_left = 11;

/* variaveis auxiliares*/
 
int senval[] = {0,0,0,0,0};
int vel_right = 0;
int vel_left = 0;
int maxvel = 200;
double errorval = 0.0;
boolean stop = false;

void setup(){
  Serial.begin(9600);
  pinMode (motor_right, OUTPUT);
  pinMode (motor_left, OUTPUT);
  pinMode (2, INPUT);     
  pinMode (3, INPUT);     
  pinMode (4, INPUT);     
  pinMode (5, INPUT);
  pinMode (6, INPUT);
  digitalWrite (2, HIGH);
  digitalWrite (3, HIGH);
  digitalWrite (4, HIGH);
  digitalWrite (5, HIGH);
  digitalWrite (6, HIGH);
}
void loop(){
  for (int i = 0; i < nsensores;i++){
    senval[i] = digitalRead (sensor[i]);
    Serial.println("senval");
    Serial.println(senval[i]);
  }
  Serial.println();
 
 errorval = LineError();   

 
  if(errorval < 0.0){
    vel_left = (int)(maxvel*(1-fabs(errorval)));
    vel_right = (int)(maxvel);
  }
  else if(errorval > 0.0){
    vel_left = (int)(maxvel);
    vel_right = (int)(maxvel*(1-errorval));
  }
  else{
    vel_left = (int)(maxvel);
    vel_right = (int)(maxvel);
  }
  //Fazer actuar os motores:
  analogWrite(motor_right,vel_right);
  analogWrite(motor_left, vel_left);
 
  delay(10);
 

}
 
// escolher o sensor que esta sobre a linha

double LineError()
{
  double error = 0.0;
  int valorsensor = 0;
  for (int i=0; i < nsensores; i++){
   
    senval[i] = digitalRead (sensor[i]);
  }
  valorsensor = senval[0]+senval[1]<<1+senval[2]<<2+senval[3]<<3+senval[4]<<4;
  Serial.println ("valor do sensor");
  Serial.println(valorsensor);
  delay(3000);

  if (valorsensor== 0b10000){
    error = -1.0;
  }
  else if (valorsensor == 0b11000){
    error = -0.75;
  }
  else if (valorsensor == 0b01000){
    error = -0.5;
  }
  else if (valorsensor == 0b01100){
    error = -0.25;
  }
  else if((valorsensor==0b00100) || (0b01110)){
    error = 0.0;
  }
  else if (valorsensor == 0b00110){
    error = 0.25;
  }
  else if (valorsensor == 0b00010){
    error = 0.5;
  }
  else if (valorsensor == 0b00011){
    error = 0.75;
  }
  else if (valorsensor == 0b00001){
    error = 1.0;
  }
  return error;
}

quando o sensor 1 e 2 vêem preto (não em simultãneo), obtenho o valor 1024,
se o 1 e 2 virem preto em simultãneo obtenho 2048,

quando sensor 3 vê preto obtenho o valor 0,
quando sensor 4 vê preto obtenho 0,

quando sensor 3 e 4 vêem preto, valor  0 ,

quando sensor 5 , valor 0,

se 3 sensores do meio vêem preto (01110) , valor 4096,

se todos vêem preto, valor 16384,
se todos vêem branco, valor 0.

não sei se esta informação que postei é útil,
eu obtenho valores fixos (fiáveis) , mas não sei como trabalhar com eles, pois eu peço um número binário.. e estes números não correspondem ao valor décimal do binário em questão..

conseguem me ajudar?



Título: Re: Robot de Busca e Salvamento!
Enviado por: senso em 18 de Maio de 2010, 20:21
Normal que o erro dê 0, tu estás a fazer o print depois de leres os sensores, mas antes de correr pelos if's, logo a variavel tem o valor que lhe dás ao inicio da função, que é zero, faz antes assim:
Código: [Seleccione]
/* variaveis de utilizadas*/

const int nsensores = 5;
const int sensor[] = {2,3,4,5,6};
const int motor_right = 10;
const int motor_left = 11;

/* variaveis auxiliares*/
 
int senval[] = {0,0,0,0,0};
int vel_right = 0;
int vel_left = 0;
int maxvel = 200;
double errorval = 0.0;
boolean stop = false;

void setup(){
  Serial.begin(9600);
  pinMode (motor_right, OUTPUT);
  pinMode (motor_left, OUTPUT);
  pinMode (2, INPUT);     
  pinMode (3, INPUT);     
  pinMode (4, INPUT);     
  pinMode (5, INPUT);
  pinMode (6, INPUT);
  digitalWrite (2, HIGH);
  digitalWrite (3, HIGH);
  digitalWrite (4, HIGH);
  digitalWrite (5, HIGH);
  digitalWrite (6, HIGH);
}
void loop(){
  for (int i = 0; i < nsensores;i++){
    senval[i] = digitalRead (sensor[i]);
    Serial.println("senval");
    Serial.println(senval[i]);
  }
  Serial.println();
 
 errorval = LineError();

   Serial.println ("valor do erro: ");
  Serial.println(erroval);
  delay(3000);
 
  if(errorval < 0.0){
    vel_left = (int)(maxvel*(1-fabs(errorval)));
    vel_right = (int)(maxvel);
  }
  else if(errorval > 0.0){
    vel_left = (int)(maxvel);
    vel_right = (int)(maxvel*(1-errorval));
  }
  else{
    vel_left = (int)(maxvel);
    vel_right = (int)(maxvel);
  }
  //Fazer actuar os motores:
  analogWrite(motor_right,vel_right);
  analogWrite(motor_left, vel_left);
 
  delay(10);
 

}
 
// escolher o sensor que esta sobre a linha

double LineError()
{
  double error = 0.0;
  int valorsensor = 0;
  for (int i=0; i < nsensores; i++){
   
    senval[i] = digitalRead (sensor[i]);
  }
  valorsensor = senval[0]+senval[1]<<1+senval[2]<<2+senval[3]<<3+senval[4]<<4;

  if (valorsensor== 0b10000){
    error = -1.0;
  }
  else if (valorsensor == 0b11000){
    error = -0.75;
  }
  else if (valorsensor == 0b01000){
    error = -0.5;
  }
  else if (valorsensor == 0b01100){
    error = -0.25;
  }
  else if((valorsensor==0b00100) || (0b01110)){
    error = 0.0;
  }
  else if (valorsensor == 0b00110){
    error = 0.25;
  }
  else if (valorsensor == 0b00010){
    error = 0.5;
  }
  else if (valorsensor == 0b00011){
    error = 0.75;
  }
  else if (valorsensor == 0b00001){
    error = 1.0;
  }
  return error;
}
Título: Re: Robot de Busca e Salvamento!
Enviado por: fred gomes em 18 de Maio de 2010, 20:27
dá te erro a compilar?
a mim dá.. diz que errorval não esta na função.. mas esta a ser chamado..

mas se colocar o print de errorval aqui:

Código: [Seleccione]
analogWrite(motor_right,vel_right);
  analogWrite(motor_left, vel_left);
 
  delay(10);
  Serial.println ("valor do erro: ");
  Serial.println(errorval);
  delay(3000)
já não dá erro..

o errorval nunca me sai do 0.0:s
Título: Re: Robot de Busca e Salvamento!
Enviado por: senso em 18 de Maio de 2010, 20:34
Não compilei, pois não sei então, hoje não posso ajudar muito mais que estou cheio de sono, boa sorte ai com o debug disso ;)
Título: Re: Robot de Busca e Salvamento!
Enviado por: microbyte em 18 de Maio de 2010, 20:40
Vamos com calma.
Senso, primeiro queria perceber se os sensores estavam a funcionar... OK!
Depois, fizémos prints do array para saber os valores... OK!

Agora, precisamos de saber se aquele "valorsensor" está bem calculado.
Código: [Seleccione]
  valorsensor = senval[0]+senval[1]<<1+senval[2]<<2+senval[3]<<3+senval[4]<<4;
  Serial.println ("valor do sensor");
  Serial.println(valorsensor);

Fizeste bem em por isto... Se dizes que está mal, vamos tentar outra coisa:
Código: [Seleccione]
  valorsensor = (senval[0]) | (senval[1]<<1) | (senval[2]<<2) | (senval[3]<<3) | (senval[4]<<4);
  Serial.println ("valor do sensor");
  Serial.println(valorsensor);

Se não der, vais tentar substituir o "|" por "+".
Dizes depois o resultado de cada uma das experiências. Mas deixa claro de que experiência é que estás a falar...
Título: Re: Robot de Busca e Salvamento!
Enviado por: fred gomes em 18 de Maio de 2010, 20:41
ok,

mas eu acho que o erro esta no valorsensor , pois não consigo obtr valores de apenas zeros e uns,

eu tinha pensado em fazer algo do tipo :
Código: [Seleccione]
int senval[] = {0,0,0,0,0};
valorsensor = senval;
if(senval) = (0,0,0,0,0;){ "não sei se está correcto, pois não sei bem como o fazer, dai estar a perguntar, era uma forma de tirar os números binários que acho que é o que está a perturbar a leitura de error."

depois quando tiveres mais disponivel responde, eu não deverei conseguir resolver o meu problema sozinho.. estou a procurar ajuda em outros foruns também (arduino.cc) , mas as respostas demoram e não esclarecem logo à 1ª ,
enquanto não resolvo este problema vou começar a trabalhar na construção do projecto..

obrigado pela ajuda senso, e microbyte também.. têem ajudado muito, e tenho vos tomado muito tempo..
Título: Re: Robot de Busca e Salvamento!
Enviado por: fred gomes em 18 de Maio de 2010, 20:45
agora sim :D
está me a dar o valor de senval em décimal..

Ps: o que faz o "|"?
Título: Re: Robot de Busca e Salvamento!
Enviado por: TigPT em 18 de Maio de 2010, 20:46
Ps: o que faz o "|"?
Operação OR: http://pt.wikipedia.org/wiki/%C3%81lgebra_booleana (http://pt.wikipedia.org/wiki/%C3%81lgebra_booleana)

PS - OR bit a bit... que OR de uma condição ou outra é
Código: [Seleccione]
||
Título: Re: Robot de Busca e Salvamento!
Enviado por: fred gomes em 18 de Maio de 2010, 20:49
eu sei que "||" é operação OR, aqui, se é, não percebo, pq ele faz:

valorsensor = (senval[0]) | (senval[1]<<1) | (senval[2]<<2) | (senval[3]<<3) | (senval[4]<<4);
e não está a fazer um OR, mas sim a "juntar" todos os algarismos.. por isso perguntei.,.
Título: Re: Robot de Busca e Salvamento!
Enviado por: TigPT em 18 de Maio de 2010, 20:50
Está a jutar todos os algarismos com OR bit a bit e não de OR lógico.
Título: Re: Robot de Busca e Salvamento!
Enviado por: fred gomes em 18 de Maio de 2010, 20:52
desculpa a massada,
mas não queria dizer que percebi e decorar e no fundo não perceber..

qual a diferença entre o OR de bit a bit e o OR lógico?
Título: Re: Robot de Busca e Salvamento!
Enviado por: fred gomes em 18 de Maio de 2010, 22:40
já funciona ;D

Código: [Seleccione]
/* variaveis de utilizadas*/

const int nsensores = 5;
const int sensor[] = {2,3,4,5,6};
const int motor_right = 10;
const int motor_left = 11;

/* variaveis auxiliares*/

int senval[] = {0,0,0,0,0};
int vel_right = 0;
int vel_left = 0;
int maxvel = 200;
double errorval = 0.0;
boolean stop = false;

void setup(){
  Serial.begin(9600);
  pinMode (motor_right, OUTPUT);
  pinMode (motor_left, OUTPUT);
  pinMode (2, INPUT);
  pinMode (3, INPUT);
  pinMode (4, INPUT);
  pinMode (5, INPUT);
  pinMode (6, INPUT);
  digitalWrite (2, HIGH);
  digitalWrite (3, HIGH);
  digitalWrite (4, HIGH);
  digitalWrite (5, HIGH);
  digitalWrite (6, HIGH);
}
void loop(){
 errorval = LineError();



  if(errorval < 0.0){
    vel_left = (int)(maxvel*(1-fabs(errorval)));
    vel_right = (int)(maxvel);
  }
  else if(errorval > 0.0){
    vel_left = (int)(maxvel);
    vel_right = (int)(maxvel*(1-errorval));
  }
  else{
    vel_left = (int)(maxvel);
    vel_right = (int)(maxvel);
  }
  //Fazer actuar os motores:
  analogWrite(motor_right,vel_right);
  analogWrite(motor_left, vel_left);

  delay(200);
  Serial.println(errorval);

}

// escolher o sensor que esta sobre a linha

double LineError()
{
  double error = 0.0;
  int valorsensor = 0;
  for (int i=0; i < nsensores; i++){

    senval[i] = digitalRead (sensor[i]);
  }
  valorsensor = (senval[0]) | (senval[1]<<1) | (senval[2]<<2) | (senval[3]<<3) | (senval[4]<<4);
  Serial.println ("valor do sensor");
  Serial.println(valorsensor);
  delay(500);


  if (valorsensor== 0b10000){
    valorsensor == 16;
    error = -1.0;
  }
  else if (valorsensor == 0b11000){
    valorsensor == 24;
    error = -0.75;
  }
  else if (valorsensor == 0b01000){
    valorsensor == 8;
    error = -0.5;
  }
  else if (valorsensor == 0b01100){
    valorsensor == 12;
    error = -0.25;
  }
  else if((valorsensor==0b00100) || (valorsensor=0b01110)){
    valorsensor == 4 ||14;
    error = 0.0;
  }
  else if (valorsensor == 0b00110){
    valorsensor == 6;
    error = 0.25;
  }
  else if (valorsensor == 0b00010){
    valorsensor == 2;
    error = 0.5;
  }
  else if (valorsensor == 0b00011){
    valorsensor == 3;
    error = 0.75;
  }
  else if (valorsensor == 0b00001){
    valorsensor == 1;
    error = 1.0;

  }
  return error;
}

muito obrigado microbyte e senso, este código é mais vosso que meu :P , obrigado mesmo pela ajuda..

mal tenha tempo vou lêr o documento de linguagem C que me enviaste senso , para melhorar alguns aspectos que já não devia errar, e vou deixando aqui novidades acerca do meu projecto.., espero colocar aqui fotos brevemente com o robot já a seguir a linha  :)

Ps: depois alguem que me esclareca só aquela minha questão anterior sff..
Título: Re: Robot de Busca e Salvamento!
Enviado por: TigPT em 18 de Maio de 2010, 22:53
2 || 1 = true
2 | 1 = 3 porque 2 em binário é b10 e 1 é b1, logo (2 | 1) = b11 = 3
Título: Re: Robot de Busca e Salvamento!
Enviado por: microbyte em 19 de Maio de 2010, 13:16
Fico feliz por teres conseguido pôr o código a funcionar. Mas mais que isso, é fundamental que percebas o que tens no código que estás a usar...
Por isso, deixo aqui para futura referência, o que espero que seja o esclarecimento à tua dúvida.

Penso que as dúvidas se prendem com esta linha de código:
Código: [Seleccione]
valorsensor = (senval[0]) | (senval[1]<<1) | (senval[2]<<2) | (senval[3]<<3) | (senval[4]<<4);
Primeiro - operador "<<" (left shift)
O que este operador faz é deslocar para a esquerda os bits N vezes, sendo que N é indicado a seguir ao operador.
Exemplos:
Imagina que tens o seguinte código em binário (base 2):
000001

Se fizeres 000001<<2 vais deslocar todos os bits 2 casas para a esquerda. Ficará 000100.
Ora nós fazemos este deslocamento um N (nº de vezes que deslocamos) diferente para cada valor armazenado dos sensores.

fazemos deslocar:
O valor do sensor 0, 0 vezes;
O valor do sensor 1, 1 vez;
O valor do sensor 2, 2 vezes;
O valor do sensor 3, 3 vezes;
O valor do sensor 4, 4 vezes;

Imagina o seguinte: tens todos os sensores a '1' = b1 = b01 = b00000000000001
Vamos entao fazer os deslocamentos:
sensor 0, 0 vezes => b00001
sensor 1, 1 vezes => b00010
sensor 2, 2 vezes => b00100
sensor 3, 3 vezes => b01000
sensor 4, 4 vezes => b10000

O que tu queres fazer é ter um código do tipo bABCDE, em que cada letra corresponde ao valor de cada um dos sensores.
Ora, se reparares, nos códigos acima, tens 5 "casas" e o valor de cada sensor está associado a uma "casa" diferente.
O que falta agora é juntar... Para isso usamos o operador "|" (bitwise OR)

Segundo - operador "|" (bitwise OR)
O que ele faz agora é juntar estes códigos binários num só - bit a bit, ou seja, não é uma soma... Ele compara cada bit e faz o OR desses dois bits.
Exemplo:
b00101 | b10110 = b10111
Porquê? Vamos meter a conta ao alto:
Código: [Seleccione]
00101
10110
-----
10111

Ora, tens de olhar para esta conta, por casas... Começas na casa da direita, e comparas o de cima com o de baixo... Se pelo menos um deles tiver '1', o resultado é '1', senao é '0'... E passas para a proxima "casa".

Ora, já deves estar a ver quando usas este operador com os resultados dos shifts.
Retomemos o exemplo em que tens todos os sensores a '1'.

Estes foram os resultados dos shifts, e no fundo, o resultado do operador "|" de todos eles:
Código: [Seleccione]
00001
00010
00100
01000
10000
-----
11111

Falando em termos de código, tens este valor na variável "valorsensor". E testas esta situação específica com o if:
Código: [Seleccione]
if( valorsensor == 0b11111 )
Título: Re: Robot de Busca e Salvamento!
Enviado por: fred gomes em 19 de Maio de 2010, 18:39
Muito obrigado pelos esclarecimentos..

percebi tudo, a diferença de usar o "|" e o somador é que se por exemplo, tivesse (o que é impossivel),
Código: [Seleccione]
0001
0001
, o "|" iria dar 0001, mas com o somador daria, 00010. certo?..

muito obrigado pelas explicações :)
Título: Re: Robot de Busca e Salvamento!
Enviado por: TigPT em 19 de Maio de 2010, 18:42
Correcto!

Tens o somador... é o "+".
Código: [Seleccione]
b01010 +
b01001 =
b10011

já o or é o "|":
Código: [Seleccione]
b01010 |
b01001 =
b01011

Título: Re: Robot de Busca e Salvamento!
Enviado por: fred gomes em 19 de Maio de 2010, 19:03
sim, eu já percebi :)
muito obrigado..
Título: Re: Robot de Busca e Salvamento!
Enviado por: fred gomes em 20 de Maio de 2010, 22:19
Boas..
ainda tenho um problema que não consigo resolver, não acho que seja dificil, mas não o estou a conseguir resolver..

o quando tenho senval == 0b00001 (por exemplo) , tenho o robot a fazer uma curva apertada, mas se senval passar para 0b00000 o error vai passar a ser 0.0 e o robot vai girar com os dois motores á máxima velocidade e vai perder a linha,

para resolver isso fiz isto:

Código: [Seleccione]
else if (valorsensor == 0b00001){
    error = 1.0;
    lasterror = error;
  }
  else if (valorsensor == 0b00000){
    error = lasterror;
  }
  return error;
mas não funciona, não sei porquê, simplesmente a leitura não altera..

mas se fizer assim:

Código: [Seleccione]
else if (valorsensor == 0b00001){
    error = 1.0;
    lasterror = error;
  }
  else if (valorsensor == 0b00000){
if(lasterror < 0){
error = -1.0;
    error = lasterror;
else if[ (lasterror > 0){
error = 1.0;
lasterror = error;
}
  }
  return error;
o erro simplesmente é sempre 0.0,

não percebo pq as duas tentativas não funcionam.. :-\

Título: Re: Robot de Busca e Salvamento!
Enviado por: RicardoSantos em 20 de Maio de 2010, 23:10
O código é o mesmo não? Qual a diferença?

Edit: Se quiseres vai ao IRC que tento resolver-te o problema...
Cumps
Título: Re: Robot de Busca e Salvamento!
Enviado por: fred gomes em 20 de Maio de 2010, 23:17
enganei me a copiar o código, já corrigi.
Título: Re: Robot de Busca e Salvamento!
Enviado por: senso em 20 de Maio de 2010, 23:17
Porque tu no inicio da tua função lineError tens error=0, não te esqueças, logo quando entras na função o error passa a 0
Título: Re: Robot de Busca e Salvamento!
Enviado por: fred gomes em 17 de Junho de 2010, 15:49
Boas.
Venho mostrar-vos como está a ficar o projecto:

(https://lusorobotica.com/proxy.php?request=http%3A%2F%2Fimg267.imageshack.us%2Fimg267%2F2207%2Fdsc01316o.th.jpg&hash=4ae73a2b4b7b5ac2210107a05fe8aa61dff8e430) (http://img267.imageshack.us/i/dsc01316o.jpg/) (https://lusorobotica.com/proxy.php?request=http%3A%2F%2Fimg5.imageshack.us%2Fimg5%2F43%2Fdsc01315pe.th.jpg&hash=5208eb7083456d3d2c4b8240befdfcb738119739) (http://img5.imageshack.us/i/dsc01315pe.jpg/)


a parte do seguidor de linhas está +/- concluida, ainda tenho um problema com o atrito das rodas (que é pouco) por resolver, e outro problema, que o breaduino me bloqueia de vez em quando, ficando o led verde aceso de forma permanente, alguêm alguma vez teve um problema deste tipo? se tiverem algsuguma estão do que poderá provocar isto, e alguma solução para resolver este problema afradeçia :)

em baixo deixo também a programação para quêm quiser vêr..

Código: [Seleccione]
/* variaveis de utilizadas*/

const int nsensores = 5;
const int sensor[] = {2,3,4,5,6};
const int motor_right = 10;
const int motor_left = 11;
int led_pin = 13;


/* variaveis auxiliares*/

int senval[] = {0,0,0,0,0};
int vel_right = 0;
int vel_left = 0;
int maxvel = 150;
double errorval = 0.0;
double lasterror = 0.0;
boolean SCstop = false;
boolean SCstart = false;

void setup(){
  Serial.begin(9600);
  pinMode (motor_right, OUTPUT);
  pinMode (motor_left, OUTPUT);
  pinMode (2, INPUT);
  pinMode (3, INPUT);
  pinMode (4, INPUT);
  pinMode (5, INPUT);
  pinMode (6, INPUT);
  digitalWrite (2, HIGH);
  digitalWrite (3, HIGH);
  digitalWrite (4, HIGH);
  digitalWrite (5, HIGH);
  digitalWrite (6, HIGH);
}
void loop(){
 errorval = LineError();
 sensor_de_cores();

 if(SCstart){
   if(errorval < 0.0){
    vel_left = (int)(maxvel*(1-fabs(errorval)));
    vel_right = (int)(maxvel);
  }
  else if(errorval > 0.0){
    vel_left = (int)(maxvel);
    vel_right = (int)(maxvel*(1-errorval));
  }
  else{
    vel_left = (int)(maxvel);
    vel_right = (int)(maxvel);
  }
  //Fazer actuar os motores:
  analogWrite(motor_right,vel_right);
  analogWrite(motor_left, vel_left);
 
  if (errorval == 0){
    SCstop = false;
  }
  else{
    SCstop = true;
  }
  if (SCstop){
    digitalWrite(led_pin,HIGH);
    delay(170);
    digitalWrite(led_pin,LOW);
    delay(170);
    digitalWrite(led_pin,HIGH);
    delay(170);
    digitalWrite(led_pin,LOW);
    delay(170);
    digitalWrite(led_pin,HIGH);
    delay(170);
    digitalWrite(led_pin,LOW);
    delay(170);
  }
  Serial.println(errorval);
  delay(100);
 }
}


// escolher o sensor que esta sobre a linha

double LineError()
{
  double error = 0.0;
  int valorsensor = 0;
 
  for (int i=0; i < nsensores; i++){

    senval[i] = digitalRead (sensor[i]);
  }

  valorsensor = (senval[0]) | (senval[1]<<1) | (senval[2]<<2) | (senval[3]<<3) | (senval[4]<<4);
 
 
  switch (valorsensor){
    case 0b10000:
    error = -1.0; break;
    case 0b11000:
    error = -0.75; break;
    case 0b01000:
    error = -0.5; break;
    case 0b01100:
    error = -0.25; break;
    case 0b00100:
    case 0b01110:
    error = 0.0; break;
    case 0b00110:
    error = 0.25; break;
    case 0b00010:
    error = 0.5; break;
    case 0b00011:
    error = 0.75; break;
    case 0b00001:
    error = 1.0; break;
    case 0b00000:
    if(error == 0)
    error = lasterror;
    break;
    }
    lasterror = error;
    return error;


void sensor_de_cores(){
 
  int ldr_green = 0;
  int ldr_red = 1;
  int valor_green = 0;
  int valor_red = 0;
 
  valor_green = analogRead(ldr_green);
  valor_red = analogRead( ldr_red);
 
  // Detectar a cor verde;
 
  if (valor_green >=450 && valor_green <=650
  && valor_red >=550 && valor_red <=700){
    SCstart = false;
  }
 
  // Detectar a cor vermelha;
 
  else if (valor_red >=500 && valor_red <= 670
  && valor_green >650){
    SCstart = false;
    delay(10000);
    SCstart = true;
  }
  else{
    SCstart = true;
  }
}
   

espero resover rapidamente este problema do atrito e do bloqueio do breaduino para poder vos mostrar um video inicial do projecto :)
Título: Re: Robot de Busca e Salvamento!
Enviado por: TigPT em 20 de Junho de 2010, 17:30
A montagem está a ficar com muito bom aspecto, contudo não é fácil ajudar-te em relação a esse problema com tão pouca informação.

Do que vejo na primeira foto.. vai ai uma grande confusão de soldaduras e fios.. possivelmente a fonte do problema.

Já montaste tudo numa breadboard para tentar perceber o que se está a passar?
Título: Re: Robot de Busca e Salvamento!
Enviado por: amando96 em 20 de Junho de 2010, 19:26
Nunca me aconteceu isso do breaduino, poderá ter a ver com o cristal, e os seus condensadores, tens tudo bem montado? condensadores no regulador de tensão etc?
Título: Re: Robot de Busca e Salvamento!
Enviado por: senso em 20 de Junho de 2010, 22:16
Não tens um unico condensador de decoupling pelo que me parece nas fotos, logo quando os motores ligam e desligam é ruido até mais não na alimentação do atmega e ele não gosta muito disso.
Título: Re: Robot de Busca e Salvamento!
Enviado por: fred gomes em 20 de Junho de 2010, 23:04
senso desculpa.. o que é um condensador de doupling e para que serve? achas que é isso?..
eu nao descobri o problema e optei por montar de novo o breaduino (opção mais facil), ainda não acabei pq hoje estive a estudar para o exame de matematica de amanha, mas amanha acabo e digo se volta acontecer..

no entanto amanha depois de fazer o exame passava na loja de electronica e comprava um condensador de doupling (não deve ser caro), mas dizme expecificamente o que é isso e para que serve, nunca tinha ouvisto isso antes..
Título: Re: Robot de Busca e Salvamento!
Enviado por: TigPT em 20 de Junho de 2010, 23:06
Outro teste que podes fazer que o senso me fez lembrar, é de utilizar 2 fontes de alimentação. Uma pilha de 9V com o regulador de 5V para alimentar a parte lógica, e a alimentação que já tens para os motores. (com o gnd em comum claro) Assim os picos dos motores não afectam a parte lógica.
Título: Re: Robot de Busca e Salvamento!
Enviado por: fred gomes em 20 de Junho de 2010, 23:13
isso vai me trazer alguns problemas  de planificação do projecto... tenho ate dia 30 para o finalizar..
eu acho que os motores nunca afectam a parte logica, estou a alimentar a parte logica com 5 volts( usando um regulador) e os motores com 6 volts..

Ps: quer dizer , a parte logica naquela placa por acaso estava alimentada com 6 volts, pq o regulador estava danificado e como de 6 para 5 a diferença é pouca eu não me dei ao trabalho de o mudar (também pq nao tinha outro), mas acham que podesse ser isso que estava a bloquear o micro?, se for isso, acho que neste novo micro isso já nao vai acontecer..

Título: Re: Robot de Busca e Salvamento!
Enviado por: TigPT em 20 de Junho de 2010, 23:15
Quando os motores arrancam, mandam um pico que pode descer a tensão aos 3V, o suficiente para dar reset à parte lógica.

Aconteceu-me isso com este projecto: Plataforma de Desenvolvimento 4x4 (http://lusorobotica.com/index.php?topic=2300.0)
Título: Re: Robot de Busca e Salvamento!
Enviado por: senso em 20 de Junho de 2010, 23:18
O atmega não deve gostar muito de 6V, penso que a voltagem máxima são de 5.5V
Um condensador de decoupling é um condensador que se coloca o mais próximo possivel das patas do integrado e ligado entre os 5v e a massa que serve para filtrar ruido de alta frequência que possa ser injectado nas linhas de alimentação e que provocam o mau funcionamento do componente em questão, para além de que ajuda a filtrar o ruido em geral introduzido pelo regulador de tensão e pelo próprio micro-controlador.
Devias ter por ai uns condensador de 100uF se não me engano entre o Vcc e o Gnd o kit do breaduino até trás um se não me engano.
Título: Re: Robot de Busca e Salvamento!
Enviado por: fred gomes em 20 de Junho de 2010, 23:22
sim já sei o que é..
nao reconheçia pelo nome..
eu estou a usar, 2 condensadores de 10 mF , como sugere este tutorial. http://itp.nyu.edu/physcomp/Tutorials/ArduinoBreadboard (http://itp.nyu.edu/physcomp/Tutorials/ArduinoBreadboard)
se calhar o problema era mesmo do regulador, faz algum sentido.. pq tinha  o robot a seguir muito descansadinho a pista, e a dado momento o led verde (do pino 19) bloqueava (ficava sempre aceso) e op programa parava de correr..
Título: Re: Robot de Busca e Salvamento!
Enviado por: senso em 20 de Junho de 2010, 23:28
Mas deves ter um mais pequeno junto aos pinos, assim como deves usar um condensador antes do regulador maior que o que está depois do regulador, nem devem ser iguais porque isso pode trazer-te problemas.
Título: Re: Robot de Busca e Salvamento!
Enviado por: fred gomes em 20 de Junho de 2010, 23:37
então achas que deva colocar um de 100 mF antes do regulador? e depois coloco um de 10 mF e outro ainda mais pequeno? dizme mais ou menos de quanto sff, para amanha comprar quando for à loja
Título: Re: Robot de Busca e Salvamento!
Enviado por: senso em 20 de Junho de 2010, 23:56
Credo, isso são valores monstruosos, regra geral usa-se 6800uF antes e 1000 ou 2000 depois e 100nF nos pernos do micro
Título: Re: Robot de Busca e Salvamento!
Enviado por: AcidDagger em 20 de Junho de 2010, 23:57
são uF e nao mF
Título: Re: Robot de Busca e Salvamento!
Enviado por: fred gomes em 21 de Junho de 2010, 00:07
lool, coloquei a letra errada, e nao em lembrei que tambem existem os millis :p

6700 micro? eu so estou a usar 10  :o
mas já percebi o que devo usar, o amanha compro um de 100 nF e vejo o que tem lá perto dos 1000 uF
obrigado pela ajuda :)
Título: Re: Robot de Busca e Salvamento!
Enviado por: fred gomes em 01 de Julho de 2010, 18:42
Boas mais uma vez..

ja reparei todos os erros que tinha, corrigi os erros de contactos por simpatia (fiz a nova placa, com o condensador de 100mF atras do regulador e de 100nF à frente do regulador) e a leitura do array de 5 sensores não têm qualquer problema),

agora continuo com o mesmo erro :s o breaduino a dado momento deixa de correr o programa :s, so o corre bem quando ligo( ou faço reset), depois deixa de correr e o robot deixa de seguir a linha..

alguém sabe pq isto acontece? tenho quase a certeza que está tudo bem montado, verifiquei todas as ligações mais que uma vez,
agora não entendo pq me acontece isto, caso seja ruído dos motores, como posso anular esse ruído?,

Ps: quando o breaduino está a correr o programa, o led verde do pino 19 está sempre a piscar, quando ele para de correr o programa (ou pelo menos os motores deixam de responder à programação) o led do pino 19 apaga, não voltando a piscar. Experimentei desligar a alimentação dos motores e colocar o carrinho sobre a linha para vêr se o led também parava de piscar, e pára, talvez não seja por ruído dos motores (afirmo isso com base nesta experiência que fiz),

alguém é capaz de me ajudar?
já estou a ficar sem saber o que fazer e até terça tinha de ter o projecto concluído, por incrivel que pareca a parte que estou a ter mais dificuldades e não a estou a conseguir resolver é esta, a locomoção do robot..que também é das mais importantes se não a mais importante.., mas aparêntemente parece a mais fácil..

preciso mesmo de ajuda.
agradeçia sugestões para resolver o meu problema..
Título: Re: Robot de Busca e Salvamento!
Enviado por: senso em 01 de Julho de 2010, 18:44
Podes mostrar o teu actual programa, o que me ocorre é ficares sem ram e os registos ficam todos trocados.
Título: Re: Robot de Busca e Salvamento!
Enviado por: fred gomes em 01 de Julho de 2010, 18:46
Código: [Seleccione]
/* variaveis de utilizadas*/

const int nsensores = 5;
const int sensor[] = {2,3,4,5,6};
const int motor_right = 10;
const int motor_left = 9;
int led_pin = 13;


/* variaveis auxiliares*/

int senval[] = {0,0,0,0,0};
int vel_right = 0;
int vel_left = 0;
int maxvel = 150;
double errorval = 0.0;
double lasterror = 0.0;
boolean SCstop = false;
boolean SCstart = false;

void setup(){
  Serial.begin(9600);
  pinMode (motor_right, OUTPUT);
  pinMode (motor_left, OUTPUT);
  pinMode (2, INPUT);
  pinMode (3, INPUT);
  pinMode (4, INPUT);
  pinMode (5, INPUT);
  pinMode (6, INPUT);
  digitalWrite (2, HIGH);
  digitalWrite (3, HIGH);
  digitalWrite (4, HIGH);
  digitalWrite (5, HIGH);
  digitalWrite (6, HIGH);
}
void loop(){
 errorval = LineError();
 sensor_de_cores();

 if(SCstart){
   if(errorval < 0.0){
    vel_left = (int)(maxvel*(1-fabs(errorval)));
    vel_right = (int)(maxvel);
  }
  else if(errorval > 0.0){
    vel_left = (int)(maxvel);
    vel_right = (int)(maxvel*(1-errorval));
  }
  else{
    vel_left = (int)(maxvel);
    vel_right = (int)(maxvel);
  }
  //Fazer actuar os motores:
  analogWrite(motor_right,vel_right);
  analogWrite(motor_left, vel_left);
 
  if (errorval == 0){
    SCstop = false;
  }
  else{
    SCstop = true;
  }
  if (SCstop){
    digitalWrite(led_pin,HIGH);
    delay(170);
    digitalWrite(led_pin,LOW);
    delay(170);
    digitalWrite(led_pin,HIGH);
    delay(170);
    digitalWrite(led_pin,LOW);
    delay(170);
    digitalWrite(led_pin,HIGH);
    delay(170);
    digitalWrite(led_pin,LOW);
    delay(170);
  }
 }
}


// escolher o sensor que esta sobre a linha

double LineError()
{
  double error = 0.0;
  int valorsensor = 0;
 
  for (int i=0; i < nsensores; i++){

    senval[i] = digitalRead (sensor[i]);
  }

  valorsensor = (senval[0]) | (senval[1]<<1) | (senval[2]<<2) | (senval[3]<<3) | (senval[4]<<4);
 
  switch (valorsensor){
    case 0b10000:
    error = -1.0; break;
    case 0b11000:
    error = -0.75; break;
    case 0b01000:
    error = -0.5; break;
    case 0b01100:
    error = -0.25; break;
    case 0b00100:
    case 0b01110:
    error = 0.0; break;
    case 0b00110:
    error = 0.25; break;
    case 0b00010:
    error = 0.5; break;
    case 0b00011:
    error = 0.75; break;
    case 0b00001:
    error = 1.0; break;
    case 0b00000:
    if(error == 0)
    error = lasterror;
    break;
    }
    lasterror = error;
    return error;


void sensor_de_cores(){
 
  int ldr_green = 0;
  int ldr_red = 1;
  int valor_green = 0;
  int valor_red = 0;
 
  valor_green = analogRead(ldr_green);
  valor_red = analogRead( ldr_red);
 
  // Detectar a cor verde;
 
  if (valor_green >=450 && valor_green <=650
  && valor_red >=550 && valor_red <=700){
    SCstart = false;
  }
 
  // Detectar a cor vermelha;
 
  else if (valor_red >=500 && valor_red <= 670
  && valor_green >650){
    SCstart = false;
    delay(10000);
    SCstart = true;
  }
  else{
    SCstart = true;
  }
}
   

porque fico sem ram?,como posso corrigir isso?
Título: Re: Robot de Busca e Salvamento!
Enviado por: senso em 01 de Julho de 2010, 19:07
Usando muitas variaveis, loops, chamadas de funções recursivas, quase tudo o que fazes no programa que mete variaveis á mistura usa ram, porque o processador só tem 32 registos e muitos só podem ser usados para certas operações, dai ser preciso usar a ram para guardar as tuas variaveis, assim á primeira vista nem sequer estás a usar comunicações serial, um problema que eu vejo no ide do arduino é não mostrar a ram usada pelo nosso programa.
Título: Re: Robot de Busca e Salvamento!
Enviado por: metRo_ em 01 de Julho de 2010, 19:12
Que bibliotecas é que estás a chamar? Eu não estive a ver o código mas pelo tamanho não me parece que ficasse sem ram.

Código: [Seleccione]
/* variaveis de utilizadas*/

const int nsensores = 5;
const int sensor[] = {2,3,4,5,6};
const int motor_right = 10;
const int motor_left = 9;
int led_pin = 13;


/* variaveis auxiliares*/

int senval[] = {0,0,0,0,0};
int vel_right = 0;
int vel_left = 0;
int maxvel = 150;
double errorval = 0.0;
double lasterror = 0.0;
boolean SCstop = false;
boolean SCstart = false;

void setup(){
  Serial.begin(9600);
  pinMode (motor_right, OUTPUT);
  pinMode (motor_left, OUTPUT);
  pinMode (2, INPUT);
  pinMode (3, INPUT);
  pinMode (4, INPUT);
  pinMode (5, INPUT);
  pinMode (6, INPUT);
  digitalWrite (2, HIGH);
  digitalWrite (3, HIGH);
  digitalWrite (4, HIGH);
  digitalWrite (5, HIGH);
  digitalWrite (6, HIGH);
}
void loop(){
 errorval = LineError();
 sensor_de_cores();

 if(SCstart){
   if(errorval < 0.0){
    vel_left = (int)(maxvel*(1-fabs(errorval)));
    vel_right = (int)(maxvel);
  }
  else if(errorval > 0.0){
    vel_left = (int)(maxvel);
    vel_right = (int)(maxvel*(1-errorval));
  }
  else{
    vel_left = (int)(maxvel);
    vel_right = (int)(maxvel);
  }
  //Fazer actuar os motores:
  analogWrite(motor_right,vel_right);
  analogWrite(motor_left, vel_left);
 
  if (errorval == 0){
    SCstop = false;
  }
  else{
    SCstop = true;
  }
  if (SCstop){
    digitalWrite(led_pin,HIGH);
    delay(170);
    digitalWrite(led_pin,LOW);
    delay(170);
    digitalWrite(led_pin,HIGH);
    delay(170);
    digitalWrite(led_pin,LOW);
    delay(170);
    digitalWrite(led_pin,HIGH);
    delay(170);
    digitalWrite(led_pin,LOW);
    delay(170);
  }
 }
}


// escolher o sensor que esta sobre a linha

double LineError()
{
  double error = 0.0;
  int valorsensor = 0;
 
  for (int i=0; i < nsensores; i++){

    senval[i] = digitalRead (sensor[i]);
  }

  valorsensor = (senval[0]) | (senval[1]<<1) | (senval[2]<<2) | (senval[3]<<3) | (senval[4]<<4);
 
  switch (valorsensor){
    case 0b10000:
    error = -1.0; break;
    case 0b11000:
    error = -0.75; break;
    case 0b01000:
    error = -0.5; break;
    case 0b01100:
    error = -0.25; break;
    case 0b00100:
    case 0b01110:
    error = 0.0; break;
    case 0b00110:
    error = 0.25; break;
    case 0b00010:
    error = 0.5; break;
    case 0b00011:
    error = 0.75; break;
    case 0b00001:
    error = 1.0; break;
    case 0b00000:
    if(error == 0)
    error = lasterror;
    break;
    }
    lasterror = error;
    return error;


void sensor_de_cores(){
 
  int ldr_green = 0;
  int ldr_red = 1;
  int valor_green = 0;
  int valor_red = 0;
 
  valor_green = analogRead(ldr_green);
  valor_red = analogRead( ldr_red);
 
  // Detectar a cor verde;
 
  if (valor_green >=450 && valor_green <=650
  && valor_red >=550 && valor_red <=700){
    SCstart = false;
  }
 
  // Detectar a cor vermelha;
 
  else if (valor_red >=500 && valor_red <= 670
  && valor_green >650){
    SCstart = false;
    delay(10000);
    SCstart = true;
  }
  else{
    SCstart = true;
  }
}
   

porque fico sem ram?,como posso corrigir isso?
Título: Re: Robot de Busca e Salvamento!
Enviado por: fred gomes em 01 de Julho de 2010, 19:15
sim eu apaguei-as pq pensava que o problema era disso..

também já apaguei este fragmento :
Código: [Seleccione]
if (errorval == 0){
    SCstop = false;
  }
  else{
    SCstop = true;
  }
  if (SCstop){
    digitalWrite(led_pin,HIGH);
    delay(170);
    digitalWrite(led_pin,LOW);
    delay(170);
    digitalWrite(led_pin,HIGH);
    delay(170);
    digitalWrite(led_pin,LOW);
    delay(170);
    digitalWrite(led_pin,HIGH);
    delay(170);
    digitalWrite(led_pin,LOW);
    delay(170);

a pensar que o problema era daqui, mas não, agora ele nem responde, o programa... vou fazer a leitura dos sensores para o pc mais uma vez só para ter a certeza que o problema não é daí...

eu não estou a usar nenhuma biblioteca,

Título: Re: Robot de Busca e Salvamento!
Enviado por: fred gomes em 01 de Julho de 2010, 19:26
a leitura dos sensores não têm qualquer problema, já confirmei..

não consigo mesmo imaginar de onde possa vir o err
Título: Re: Robot de Busca e Salvamento!
Enviado por: senso em 01 de Julho de 2010, 19:31
Acontece mesmo sem os motores ligados?
É estranho.
Título: Re: Robot de Busca e Salvamento!
Enviado por: fred gomes em 01 de Julho de 2010, 19:34
sim,
dizme uma coisa, é normal o led verde (do pino 19) estar sempre a piscar quando um programa está a ser corrido?
ele não devia piscar apenas quando fazia reset ou colocava o programa dentro do atmega?
Título: Re: Robot de Busca e Salvamento!
Enviado por: senso em 01 de Julho de 2010, 19:39
Led no pino 19?
Explica melhor.
Título: Re: Robot de Busca e Salvamento!
Enviado por: fred gomes em 01 de Julho de 2010, 19:43
http://itp.nyu.edu/physcomp/uploads/arduino_pinmap.png (http://itp.nyu.edu/physcomp/uploads/arduino_pinmap.png)

o led que fica no pino 19 do atmega, ao fazer reset esse pino pisca (acende e volta apagar uma vez apenas), mas o que me estava acontecer é que quando reparava que o programa estava a ser corrido(ou pelo menos os motores respeitavam a programação) esse led estava a piscar constantemente, e quando deixava de piscar os motores deixavam de responder à programação (ou o programa deixava de ser corrido, nao sei).
Título: Re: Robot de Busca e Salvamento!
Enviado por: senso em 01 de Julho de 2010, 19:50
  if (SCstop){
    digitalWrite(led_pin,HIGH);
    delay(170);
    digitalWrite(led_pin,LOW);
    delay(170);
    digitalWrite(led_pin,HIGH);
    delay(170);
    digitalWrite(led_pin,LOW);
    delay(170);
    digitalWrite(led_pin,HIGH);
    delay(170);
    digitalWrite(led_pin,LOW);
    delay(170);

Estas a faze-lo piscar aqui, é normal que pisque.
Título: Re: Robot de Busca e Salvamento!
Enviado por: fred gomes em 01 de Julho de 2010, 19:53
não.. isso era um led que eu tinha declarado no pino 13, eu já apaguei essa função pq estava a pensar que o problema era daí (subcarregar o programa, pensei eu), o led a que me refiro é o que esta no pino 19 do atmega.

http://itp.nyu.edu/physcomp/Tutorials/ArduinoBreadboard (http://itp.nyu.edu/physcomp/Tutorials/ArduinoBreadboard)

podes ver nesse tutorial, é o led verde a que me refiro.
Título: Re: Robot de Busca e Salvamento!
Enviado por: amando96 em 01 de Julho de 2010, 20:02
Deve estar a resetar constantemente.

e pino 19 do atmega = pino 13 do arduino.
Título: Re: Robot de Busca e Salvamento!
Enviado por: fred gomes em 01 de Julho de 2010, 20:15
mas estou a fazer reset constantemente porquê? como corrigo isso?
achas que se tira-se esse led verde do pino 19 (não sei se posso) e oocupasse esse pino com outra saida/entrada qualquer isso parava de acontecer?

acho um bocado absurdo o que acabei de dizer, mas já não sei o que faça nem pq aquilo acontece, só quero que o programa seja corrido na normalidade...
Título: Re: Robot de Busca e Salvamento!
Enviado por: amando96 em 01 de Julho de 2010, 20:17
Isso acontece quando não há power suficiente, tens as baterias todas bem carregadas?

Tens o power does motores separado do do resto?
Título: Re: Robot de Busca e Salvamento!
Enviado por: fred gomes em 01 de Julho de 2010, 20:19
http://lusorobotica.com/index.php?topic=522.0 (http://lusorobotica.com/index.php?topic=522.0)

na foto do breaduino do guibot esse led está sempre aceso  :-X isso acho que não é suposto acontecer, penso que ele ao estar aceso o pino 1 (reset) do atmega esta sempre a 1, logo está-se sempre a fazer reset, acho eu...

ele também fala lá de um condensador de 100 mF entre os pinos 7 e 8 e eu não o coloquei, mas também duvido que o problema venha daí.
Título: Re: Robot de Busca e Salvamento!
Enviado por: fred gomes em 01 de Julho de 2010, 20:21
a bateria jánao deve estar no seu melhor, já nao a carrego á muito tempo.. mas também duvido que o problema venha da bateria, o led vermelho (de alimentação) acende bem (com muita luminosidade).
Título: Re: Robot de Busca e Salvamento!
Enviado por: senso em 01 de Julho de 2010, 20:23
Tu podes usar o pino para o que quiseres, simplesmente na placa do arduino o led está lá porque assim sabes que o bootloader está a funcionar bem e quando a placa é feita metem o blinky no atmega e como já têm lá o led sabem logo se a placa está bem feita e o atmega está bom olhando para o led.
Digital 13 = pino 19 do pdip do atmega.

E esse led está antes ou depois de algum regulador?
Ou a bateria dá os 5v certinhos ao atmega, e depois uma coisa é a bateria tem 10 ou 20mA para um led outra é ter 150 ou 200mA para o atmega.
Título: Re: Robot de Busca e Salvamento!
Enviado por: amando96 em 01 de Julho de 2010, 20:23
Esperimenta, é o mais certo ser da bateria, mete um consensador no power tambem, de 100uF
Título: Re: Robot de Busca e Salvamento!
Enviado por: fred gomes em 01 de Julho de 2010, 20:34
está depois de um regulador (7805),
eu estou a usar um condensador de 100mF antes do regulador amando96,

vou colocar a bateria a carregar e mais daqui a pouco volto entao a experimentar.

Ps: tenho apenas uma coisa que não consigo perceber, o led do pino 19 (pino digital 13) funciona como outro pino qualquer?, se sim, pq ao colocar o pino 1 do atmega (pino de reset) a HIGH, o pino digital 13 passa a 1?.. consequentemente também não percebo pq esse led estava a piscar enquanto o programa corria , nao sei se é suposto acontecer ou pode ser problema de mau funcionamento do atmega por questoes de ter pouca bateria..

outra coisa que me está a meter alguma confusão é que o guibot na foto dele tem o led verde dele aceso, isso a mim nunca me acontece, apenas se estiver a declará-lo no programa ou o pino de reset a HIGH.
Título: Re: Robot de Busca e Salvamento!
Enviado por: senso em 01 de Julho de 2010, 20:52
Código: [Seleccione]
  if (SCstop){
    digitalWrite(led_pin,HIGH);
    delay(170);
    digitalWrite(led_pin,LOW);
    delay(170);
    digitalWrite(led_pin,HIGH);
    delay(170);
    digitalWrite(led_pin,LOW);
    delay(170);
    digitalWrite(led_pin,HIGH);
    delay(170);
    digitalWrite(led_pin,LOW);
    delay(170);

Isto está no teu programa e faz o led piscar.
Se mudares led pin para outra saida digital e lá ligares o led, o led vai piscar á mesma, estar no 13 ou no 1 é a mesma coisa, está lá para teres logo um led para brincar quando compras a placa do arduino.
Sem saber o código do guibot não sabes para que está ele a usar o led, pode ser para sinalizar que o programa está a correr ou a funcionar bem.
Quando fazes reset o processador fica num estado indefinido, não sei como ficam as saidas durante o processo de reset.
Não tem nada a ver com a bateria carregada ou não porque o atmega não sabe nada sobre a bateria.
Lê o datasheet do regulador e usa os valores recomendados, podes ter o regulador a oscilar, que tambem é uma possibilidade bem real.
Título: Re: Robot de Busca e Salvamento!
Enviado por: fred gomes em 01 de Julho de 2010, 21:22
ahh certo, ja percebi,,.. eu tinha isso declarado no 13 porque tinha textado antes o programa no arduino e estava a usar o pino 13 do arduino. Mas já percebi, esse led nao tem a função que eu pensava ter, é apenas um led como outro qualquer..

é certo que o atmega nao sabe se a bateria está carregada, mas como disseste mais atrás ( e eu acho que faz sentido), o atmega pode nao ter corrente suficiente para correr o programa (eu acho pouco provavel que seja isso, no entanto já coloquei o a bateria a carregar).

Quanto ao regulador de tensão, estou a usar um condensador de 100 nF á frente do regulador e de 100uF atrás..

consultei o dataheet, apenas encontrei informação de um condensador de 0.1 uF á frente do regulador,

o mesmo podemos observar nesta imagem:

http://freedatasheets.com/blog/uploaded_images/7805datasheet-730100.gif (http://freedatasheets.com/blog/uploaded_images/7805datasheet-730100.gif)

não me parece que o problema seja do regulador, ou se for, não sei o que fazer para o resolver, pois acho que estou a utilizar os condensadores certos.
Título: Re: Robot de Busca e Salvamento!
Enviado por: senso em 01 de Julho de 2010, 22:11
Deves ter sempre um condensador maior á entrada que o condensador da saida.
Título: Re: Robot de Busca e Salvamento!
Enviado por: fred gomes em 02 de Julho de 2010, 11:33
Bom dia..

já descobri qual era o problema que tinha, era problema de programação, na parte da leitura do sensor de cores , nao tenho ainda o sensor de cores ligado e isso estava a programação dele estava a causar o mau funcionamento do robot.

esse erro está corrigido..
agora disponho desta porgramação:

Código: [Seleccione]
/* variaveis de utilizadas*/

const int nsensores = 5;
const int sensor[] = {2,3,4,5,6};
const int motor_right = 10;
const int motor_left = 9;
int led_pin = 13;


/* variaveis auxiliares*/

int senval[] = {0,0,0,0,0};
int vel_right = 0;
int vel_left = 0;
int maxvel = 160;
double errorval = 0.0;
double lasterror = 0.0;
boolean SCstop = false;
boolean SCstart = false;

void setup(){
  Serial.begin(9600);
  pinMode (motor_right, OUTPUT);
  pinMode (motor_left, OUTPUT);
  pinMode (2, INPUT);
  pinMode (3, INPUT);
  pinMode (4, INPUT);
  pinMode (5, INPUT);
  pinMode (6, INPUT);
  digitalWrite (2, HIGH);
  digitalWrite (3, HIGH);
  digitalWrite (4, HIGH);
  digitalWrite (5, HIGH);
  digitalWrite (6, HIGH);
}
void loop(){
 errorval = LineError();
 
   if(errorval < 0.0){
    vel_left = (int)(maxvel*(1-fabs(errorval)));
    vel_right = (int)(maxvel);
  }
  else if(errorval > 0.0){
    vel_left = (int)(maxvel);
    vel_right = (int)(maxvel*(1-errorval));
  }
  else{
    vel_left = (int)(maxvel);
    vel_right = (int)(maxvel);
  }
  //Fazer actuar os motores:
  analogWrite(motor_right,vel_right);
  analogWrite(motor_left, vel_left);
}


// escolher o sensor que esta sobre a linha

double LineError()
{
  double error = 0.0;
  int valorsensor = 0;
 
  for (int i=0; i < nsensores; i++){

    senval[i] = digitalRead (sensor[i]);
  }

  valorsensor = (senval[0]) | (senval[1]<<1) | (senval[2]<<2) | (senval[3]<<3) | (senval[4]<<4);
 
  switch (valorsensor){
    case 0b10000:
    error = -1.0; break;
    case 0b11000:
    error = -0.75; break;
    case 0b01000:
    error = -0.5; break;
    case 0b01100:
    error = -0.25; break;
    case 0b00100:
    case 0b01110:
    error = 0.0; break;
    case 0b00110:
    error = 0.25; break;
    case 0b00010:
    error = 0.5; break;
    case 0b00011:
    error = 0.75; break;
    case 0b00001:
    error = 1.0; break;
    case 0b00000:
    if(error == 0)
    error = lasterror;
    break;
    }
    lasterror = error;
    return error;



   

e o breaduino está-me constantemente a fazer reset, quando vai duma ponta do sensor para o centro faz reset, e os motores andam aos solavancos (pq tenho programado para eles andarem a 160, e ao fazer reset eles por momentos passam para 255(valor máximo))

quase de certeza que o erro é da programação também, mas devido aos meus conheçimentos ainda limitados de programação, nao consigo perceber pq isso acontece,

alguem me consegue ajudar?
Título: Re: Robot de Busca e Salvamento!
Enviado por: fred gomes em 02 de Julho de 2010, 14:49
afinal o problema nao me parece que seja do programa. eu já nao digo nada que faça sentido, já nem sei o que faça..

agora parece me que os motores puxam demasiada corrente ao micro, cada vez que experimento aparece me um problema diferente, estou farto de perder tanto tempo e nunca resolver nada.. ja subsitui a ponte H, vi se as ligações estavam correctas, e por mais que me esforçe, nao consigo perceber pq o comportamento dele..

se alguém tiver alguma sugestão agradeçia..
já acho que o mais provavel é nao conseguir acabar o projecto a tempo :-\
Título: Re: Robot de Busca e Salvamento!
Enviado por: senso em 02 de Julho de 2010, 15:03
Testa o robot ligado a um transformador retificado que te dê a mesma voltagem que as tuas pilhas/baterias, assim ficas logo a saber se é problema de falta de corrente ou não.
Solda condensadores de decoupling nos motores, o guibot explicou isso algures aqui no fórum
Título: Re: Robot de Busca e Salvamento!
Enviado por: fred gomes em 02 de Julho de 2010, 15:17
um dosa motores nao anda,  (mas ja ligeui directamente á bateria para ver se está a funcionar e está), eu vou fazer novamente a placa da H bridge e vou lhe trocar os pinos onde estava a fazer actuar os motores..

tentei procurar informação sobre o condensador de doubling mas nao encontrei nada, (nao queria perder muito tempo a procurar isso),

eu vou alimentar a ponte H e antes de puxar a alimentação para os pinos que vao alimentar os motores achas que deva colocar um condensador? so aqui tenho de 100 uF, achas suficiente?

muito obrigado pela vossa ajuda.
Título: Re: Robot de Busca e Salvamento!
Enviado por: fred gomes em 02 de Julho de 2010, 19:03
já fiz a nova placa e agora tenho a certeza que esta tudo bem montado..
quando alimento os motores o led vermelho (de alimentação ) fica com menos luminosidade, ao clicar no reset o led verde nao acende (sinal que o atmega que o programa nao esta a correr por nao ter corrente suficiente no atmega) e os motores giram á maxima velocidade, sem respeitar a velocidade maxima que eu peço (acho normal acontecer uma vez que o atmega nao está a correr o programa).

coloquei a bateria a carregar (ontem já tinha colocado mas ficou apenas 1h e tal, e eu nao faço ideia do tempo que ela demora a carregar, mas se calhar demora umas 7h, ou perto disso).

quando tiver a certeza que a bateria tenho bateria suficiente volto a experimentar, e deixo aqui as novidades, so espero que seja desta... :)
Título: Re: Robot de Busca e Salvamento!
Enviado por: fred gomes em 06 de Julho de 2010, 22:24
Boas mais uma vez,
já resolvi os problemas que tinha, vim mostrar-vos um video do bichinho a seguir a linha e algumas fotos :P
Quero também agradeçer a ajuda que todos me têm dado, o vosso apoio têm sido incansável  :). Espero não só continuar  aprender coisas novas nesta comunidade, mas também vir ajudar membros que venham a precisar, assim como vocês me têm ajudado a mim. :)

Fotos:
(https://lusorobotica.com/proxy.php?request=http%3A%2F%2Fimg444.imageshack.us%2Fimg444%2F4978%2Fdsc01936af.th.jpg&hash=06e8aa8709eb9f0d72eb45fa905ecb3b99b7a28b) (http://img444.imageshack.us/i/dsc01936af.jpg/)
(https://lusorobotica.com/proxy.php?request=http%3A%2F%2Fimg143.imageshack.us%2Fimg143%2F863%2Fdsc01938cw.th.jpg&hash=ea736584e12385471786bb3a034d60e0a61d3224) (http://img143.imageshack.us/i/dsc01938cw.jpg/)
(https://lusorobotica.com/proxy.php?request=http%3A%2F%2Fimg20.imageshack.us%2Fimg20%2F4912%2Fdsc01937sr.th.jpg&hash=fd71cc9f81530cd58de852e77f20817cf6171dd7) (http://img20.imageshack.us/i/dsc01937sr.jpg/)
Uploaded with ImageShack.us (http://imageshack.us)

http://img444.imageshack.us/i/dsc01936af.jpg/ (http://img444.imageshack.us/i/dsc01936af.jpg/)
http://img143.imageshack.us/i/dsc01938cw.jpg/ (http://img143.imageshack.us/i/dsc01938cw.jpg/)
http://img20.imageshack.us/i/dsc01937sr.jpg/ (http://img20.imageshack.us/i/dsc01937sr.jpg/)

Video:

MOV01947.MPG (http://www.youtube.com/watch?v=UVSaQ99vDn0#)

ainda tenho um problema com a falta de peso em cima do robot, para que assim ele ganhe mais tracção ao solo, talvez lhe venha a colocar um pedaço de metal (ou algo pesado) junto dos motores, depois vejo isso quando tiver tudo terminado..

Irei postando novas actualizações do procto.
Espero que gostem, e mais uma vez, obrigado por toda a ajuda que me têm prestado  :)
Título: Re: Robot de Busca e Salvamento!
Enviado por: metRo_ em 06 de Julho de 2010, 22:41
Aquilo de lado é a bateria? É que parece ser algo bastante pesado e isso pode fazer com que o robot tenha mais tendência para aquele lado.
Título: Re: Robot de Busca e Salvamento!
Enviado por: fred gomes em 06 de Julho de 2010, 22:48
sim é a bateria,
pois, talvez a devesse ter colocado ao centro, mas acho que ela nao interfere na movimentação do robot, ele precisa é de mais peso sobre os motores..se colocar um bocado de metal isso resolve-se (já experimentei com outros objectos).
Título: Re: Robot de Busca e Salvamento!
Enviado por: senso em 06 de Julho de 2010, 23:03
Se vais meter peso, mete peso util, mete-lhe mais uma pilhas ou outra bateria igual, e tenta meter a bateria no centro do robot ou por cima dos motores então
Título: Re: Robot de Busca e Salvamento!
Enviado por: fred gomes em 06 de Julho de 2010, 23:21
mas eu não vou precisar de usar outra bateria,não faz muito sentido colocá-la lá,
e mudar a bateria de sítio também não me dá muito geito, uma vez que tenho de fazer uma placa de acrílico nova,
o projecto ainda não está acabado, ainda faltam duas placas e o display, no entanto se colocar alguma coisa a fazer peso vai ser um bocado de chumbo (para nao ser muito grande) , e procuro colocá-lo de forma a nao se preceber que a sua função é simplesmente fazer peso.
Título: Re: Robot de Busca e Salvamento!
Enviado por: amando96 em 06 de Julho de 2010, 23:30
Devia ter posto a bateria mais perto dos motores, e mais central, quanto é que ela pesa?
Título: Re: Robot de Busca e Salvamento!
Enviado por: microbyte em 07 de Julho de 2010, 00:20
Para além da questão da má colocação da bateria, aproveito para dar uma dica...
Os sensores encontram-se à frente do robot, enquanto os motores estão atrás... O que acontece é que uma mudança pequena de velocidade nos motores provocará um maior deslocamento nos sensores...

Não sei se estás a perceber, é como o eixo de uma bicicleta... Neste caso o teu eixo é um ponto algures no meio dos motores (se os puseres a rodar em sentidos contrários). Os pontos que estão junto ao pneu da roda da bicicleta têm uma maior velocidade linear que os pontos que estão mais perto do eixo das rodas.

A essa velocidade não há grandes problemas, mas se partíssemos para uma abordagem em termos de eficiência, eu poria os sensores o mais junto dos motores possível.
Título: Re: Robot de Busca e Salvamento!
Enviado por: fred gomes em 07 de Julho de 2010, 10:21
Não sei bem quanto pesa, deve pesar prai umas 200 gramas..

A bateria também coloquei de lado porque não conseguia colocar ao centro por falta de espaço.., no ponto de vista estético acho que a bateria até fica bem ali, e desde que esse peso seja compensado  (não é o peso da bateria que etá a interferir no mau funcionamento mas sim a falta de peso junto dos motores) desde que a bateria nao provoque o mau funcionamento do robot devido ao local onde se situa acho que não há qualquer problema (também nao tinha/tenho espaço para a colocar em outro lado..).

Obrigado pelas dicas microbyte, vou ver se ainda é possivel alterar,vou tentar colocar os sensores cny70 mais atraz, e vou puxar o sensor de cores mais para a frente (para o sitio dos sensores cny70..

depois posto aqui novidades.


Título: Re: Robot de Busca e Salvamento!
Enviado por: fred gomes em 10 de Julho de 2010, 12:20
Boas...
Voltei a deparar-me com os problemas :-\

eu tenho a pista montada numa sala, faço as experiências com os LDR´s para detectar uma cor, apago a luz (para ver se a luminosidade natural afecta os valores dos mesmos, e os valores so variam uma ou duas unidades ( escala de 0 a 1023 é optimo, erro quase nulo),
tenho o problema resolvido, aparentemente...

se passado um tempo voltar a fazer essas mediçoes os valores variaram todos (digo isso de ontem à noite para hoje por exemplo), variam umas 100 unidades, e já tenho de alterar a programação, alguém sabe pq isso acontece? é que se continuar assim eu antes de apresentar o projecto ao júri vou ter de andar la com o arduino a alterar os valores dos LDR´s, pois não posso confiar... se alguem me souber dar uma sugestão para corrigir este problema agradeçia...

outro problema...

se colocar o codigo para seguir apenas a linha, ele segue na perfeição...
mas se colocar o codigo para detectar as cores (ainda so detecta a cor vermelha), ele para os 10 segundos e arranca ao detectar a cor vermelha, mas o codigo de seguir a linha nao é respeitado (ou seja, irá perder-se),

o código é o seguinte:

Código: [Seleccione]
/* variaveis de utilizadas*/

const int nsensores = 5;
const int sensor[] = {2,3,4,5,6};
const int motor_right = 10;
const int motor_left = 9;
int led_pin = 11;


/* variaveis auxiliares*/

int senval[] = {0,0,0,0,0};
int vel_right = 0;
int vel_left = 0;
int maxvel = 150;
double errorval = 0.0;
double lasterror = 0.0;
boolean SCstop = false;
boolean SCstart = true;

void setup(){
  Serial.begin(9600);
  pinMode (motor_right, OUTPUT);
  pinMode (motor_left, OUTPUT);
  pinMode (2, INPUT);
  pinMode (3, INPUT);
  pinMode (4, INPUT);
  pinMode (5, INPUT);
  pinMode (6, INPUT);
  digitalWrite (2, HIGH);
  digitalWrite (3, HIGH);
  digitalWrite (4, HIGH);
  digitalWrite (5, HIGH);
  digitalWrite (6, HIGH);
}
void loop(){
 errorval = LineError();
 sensor_de_cores();
 SCstart  ? Serial.println("0") : Serial.println("1");
 delay(500);
 if(SCstart){
   if(errorval < 0.0){
    vel_left = (int)(maxvel*(1-fabs(errorval)));
    vel_right = (int)(maxvel);
  }
  else if(errorval > 0.0){
    vel_left = (int)(maxvel);
    vel_right = (int)(maxvel*(1-errorval));
  }
  else{
    vel_left = (int)(maxvel);
    vel_right = (int)(maxvel);
    Serial.println("Avancar");
  }
  //Fazer actuar os motores:
  analogWrite(motor_right,vel_right);
  analogWrite(motor_left, vel_left);
 
  if (errorval == 0){
    SCstop = false;
  }
  else{
    SCstop = true;
  }
  if (SCstop){
    digitalWrite(led_pin,HIGH);
    delay(170);
    digitalWrite(led_pin,LOW);
    delay(170);
    digitalWrite(led_pin,HIGH);
    delay(170);
    digitalWrite(led_pin,LOW);
    delay(170);
    digitalWrite(led_pin,HIGH);
    delay(170);
    digitalWrite(led_pin,LOW);
    delay(170);
  }
 }
 

 if (SCstart == false){
    delay(5000); 
 }

}


// escolher o sensor que esta sobre a linha

double LineError()
{
  double error = 1.0;
  int valorsensor = 0;
 
  for (int i=0; i < nsensores; i++){

    senval[i] = digitalRead (sensor[i]);
  }

  valorsensor = (senval[0]) | (senval[1]<<1) | (senval[2]<<2) | (senval[3]<<3) | (senval[4]<<4);
 
  switch (valorsensor){
    case 0b10000:
    error = -1.0; break;
    case 0b11000:
    error = -0.75; break;
    case 0b01000:
    error = -0.5; break;
    case 0b01100:
    error = -0.25; break;
    case 0b00100:
    case 0b01110:
    error = 0.0; break;
    case 0b00110:
    error = 0.25; break;
    case 0b00010:
    error = 0.5; break;
    case 0b00011:
    error = 0.75; break;
    case 0b00001:
    error = 1.0; break;
    case 0b00000:
    if(error == 1.0)
    error = lasterror;
    break;
    }
    lasterror = error;
    return error;


void sensor_de_cores(){
 
  int ldr_green = 0;
  int ldr_red = 1;
  int valor_green = 0;
  int valor_red = 0;
 
  valor_green = analogRead(ldr_green);
  valor_red = analogRead(ldr_red);
 
  // Detectar a cor verde;
 
  if (valor_green >=500 && valor_green <=650
  && valor_red >=550 && valor_red <=650){
    SCstart = false;
    analogWrite(motor_right,0);
    analogWrite(motor_left,0);
  }
 
  // Detectar a cor vermelha;
 
  else if (valor_red >=780 && valor_red <= 835
  && valor_green >730 && valor_green <= 805){
    SCstart = false;
    analogWrite(motor_right,0);
    analogWrite(motor_left,0);
    delay(10000);
  }
  else{
    SCstart = true;
  }
}
   
se me conseguirem ajudar agradeçia.

Título: Re: Robot de Busca e Salvamento!
Enviado por: fred gomes em 10 de Julho de 2010, 15:05
oh...
acho que já sei onde está o erro..
eu no inicio do loop esqueçi-me de colocar "if(SCstart){" , é normal que as velocidades dos motores nao estejam a variar conforme a posiçao da linha, quase de certeza que é esse o erro..

eu agora nao estou em casa, mas mais logo experimento e posto aqui novidades, espero que assim funcione :D
Título: Re: Robot de Busca e Salvamento!
Enviado por: fred gomes em 10 de Julho de 2010, 22:06
afinal o erro não está aí..
agora os motores nem se mexem, estou com algum erro na programação mas nao consigo percer o quê..

já alterei a programação (última exposta por mim),
ao fazer o print de CSstart verifico que está tudo correcto.. mas o programa não me corre a parte de codigo para seguir a linha não sei pq.. :-X

alguém me consegue ajudar?
o problema é mesmo de programação..
Título: Re: Robot de Busca e Salvamento!
Enviado por: fred gomes em 10 de Julho de 2010, 23:01
experimentei este código:

Código: [Seleccione]
int ldr_green = 0;
int ldr_red = 1;
boolean SCstart = true;
int valor_green = 0;
int valor_red = 0;

void setup(){
  Serial.begin(9600);
}

void loop(){
  valor_green = analogRead(ldr_green);
  valor_red = analogRead (ldr_red);
 
  // Detectar a cor verde;
 
  if (valor_green >=500 && valor_green <=650
  && valor_red >=550 && valor_red <=650){
    SCstart = false;
  }
 
  // Detectar a cor vermelha;
 
  else if (valor_red >=780 && valor_red <= 835
  && valor_green >730 && valor_green <= 805){
    SCstart = false;
    delay(10000);
    SCstart = true;
    delay(500);
  }
  else{
    SCstart = true;
  }
  SCstart ? Serial.println("0"): Serial.println("1");
  delay(200);
}

ao colocar e o agv sobre o vermelho é-me impresso um 0(false) de 10 em 10 segundos ,
ao colocar sobre o verde é-me impresso sempre um 1 (true) , e sobre branco sempre 0(false)..

o problema nao me parece ser do sensor de cores..
acho que é mesmo da programação..e estou farto de tentar descobrir de onde vêm o problema e não consigo descobrir..
preciso mesmo de ajuda....
Título: Re: Robot de Busca e Salvamento!
Enviado por: microbyte em 11 de Julho de 2010, 01:25
É bom testar as coisas em separado... E se dizes que está tudo bem com a detecção da cor, vamos partir do pressuposto que realmente está tudo bem...

A questão é que tu tens um delay muito grande na função do sensor de cores...

delay(10000);

10 segundos? Para quê? É mesmo necessário?
Título: Re: Robot de Busca e Salvamento!
Enviado por: fred gomes em 11 de Julho de 2010, 04:04
sim, pq eu quero que ao agv ao detectar a cor vermelha para 10 segundos , e so depois prossiga..
segundo os print´s que fiz acho que o SCstart está a variar-me bem consoante a cor sobre a qual se encntra o agv (os resultados dos prints e programação estão mensionados em cima)..

não consigo perceber de onde vêm o problema :-\

mesmo que o sensor de cores estivesse a funcionar mal, SCstart = true, logo ele devia seguir a linha, e apenas não parava ao passar sobre a cor.., mas o que está acontecer é que ele não arranca :S
Título: Re: Robot de Busca e Salvamento!
Enviado por: microbyte em 11 de Julho de 2010, 12:19
A depuração de erros faz-se com Serial.print()'s.

Mete prints por aí fora, liga o Serial monitor e vê por onde é que o código passa e onde é que não está a passar...
Não te podemos ajudar grande coisa a olhar só para o código, pois ele já está algo complexo... E sensor de cores, nunca trabalhei com nenhum.
Título: Re: Robot de Busca e Salvamento!
Enviado por: senso em 11 de Julho de 2010, 23:01
Com prints a mais rebenta com a ram e ai é que fica mesmo perdido.
Título: Re: Robot de Busca e Salvamento!
Enviado por: RicardoSantos em 12 de Julho de 2010, 05:43
O grande problema dele é não poder usar o monitor Serie do programa arduino, porque ele para testar o Robô usa um breaduino... ( Se não estou em erro )

Mas já está praticamente tudo resolvido... amanhã o Fred já deve ter noticias =)
Título: Re: Robot de Busca e Salvamento!
Enviado por: metRo_ em 12 de Julho de 2010, 09:19
Mas tu com um breaduino podes usar tambem o "monitor serie"!
Título: Re: Robot de Busca e Salvamento!
Enviado por: fred gomes em 12 de Julho de 2010, 10:08
sim, mas eu nao consigo usar o motor serie pq preciso de ter o fio do TX ligado e alimentação apenas o + chega), e não dá geito pq com os motores andarem o fio do TX sai logo  ( pois eu so o coloco atraves em contacto com o atmega atravez de uma header fêmea) e não atraves de um borne (que consigo aparfusar e prender mesmo o fio), daí nao conseguir fazer os prints mesmo com ele ligado ( a seguir a linha), tenho de fazer com os motores desligados..

tambem tinha outro problema.. no sensor de cores tinha os 2 ldr´s muito perto um do outro, e com a linha preta(da pista) à mistura, aquilo dava me valores de uma ponta á outra ( a a 1023 a quase), ou seja, estava sempre a detetar cores durante o percurso..
 
Foto do sensor de cores:

http://img20.imageshack.us/i/dsc00448jc.jpg/ (http://img20.imageshack.us/i/dsc00448jc.jpg/)

E como podem ver ele não está bem feito, por exemplo, se estiver a ver o vermelho, so o LDR red devia "apanhar luz", pois é essa a função do filtro (o que vêem em volta dos LDR´s é papel de cor transparente, tipo o dos rebuçados), mas isso nao acontece, ambos os LDR´s me dão valores muito proximos um do outro, o mesmo acontece na cor vermelha...(com o agv sobre o verde por exemplo, um LDr dáva me 610 e outro 620) por exemplo.

Isso acontece pq eles estão muito proximos um do outro, e a luz reflectida apenas para um acaba por embater nos dois (nao me dão valores mesmo iguais so por causa do filtro, que tambem impede alguma  passagem de luz para os LDRs, e como são de cores diferentes, essa quantidade de luz varia, mas muito pouco)..

Eu agora vou fazer um sensor de cores novo, com os ldr´s mais afastados um do outro, para que a linha preta nao interferia na leitura dos dois em simultâneo, e assim consiga obter valores fiáveis quando ele se encontra sobre uma cor..

O Ricardo Santos teve -me ontem ajudar (hoje de madrugada :P ) , tinha tambem alguns problemas de programação, mas acho que esse patamar já está resolvido (obrigado pela ajuda e paciência Ricardo), falta mesmo corrigir o sensor de cores..

Depois deixo aqui novidades :) ,muito obrigado a todos os que me têm ajudado..
Título: Re: Robot de Busca e Salvamento!
Enviado por: fred gomes em 12 de Julho de 2010, 21:39
já está a funcionar...
vou começar a colocar o display e outra placa com buzzer e uns leds, e depois tiro fotos e faço video..
vou tentar fazer isso ainda hoje de madruagada e ver se o acabo, estou com o prazo muito apertado..

muito obrigado a todos os que me têm ajudado, brevemente postarei fotos.. :)
Título: Re: Robot de Busca e Salvamento!
Enviado por: microbyte em 13 de Julho de 2010, 00:00
Já agora esse robot é para competir ou é apenas por diversão?
Título: Re: Robot de Busca e Salvamento!
Enviado por: fred gomes em 13 de Julho de 2010, 10:35
pra já é a minha PAP(projeto de aptidão profissional), quinta ou sxta feira tenho de o apresentar ao júri (ainda não sei ao certo o dia).
Título: Re: Robot de Busca e Salvamento!
Enviado por: fred gomes em 15 de Julho de 2010, 13:50
já apresentei o projecto , tive 18 :)

depois posto fotos, no entanto não o consegui meter como queria.. o sensor de cores não detecta de forma eficaz uma cor em movimento (os valores dos ldr´s variam muito), a cor vermelha reflectia bastante (parecia branco) e substitui pela cor preta ,o display também nao programei como queria por falta de tempo, e pronto...não ficou como queria mas tive boa nota e aprendi bastante com a elaboração deste projecto..

muito obrigado a todos os que me ajudaram , aprendi bastante com  elaboração deste projecto (muito obrigado a todos os que me ensinaram coisas novas, principalmente a nivel de programação), foi esse o meu grande objectivo..

brevemente postarei fotos e um video..
Título: Re: Robot de Busca e Salvamento!
Enviado por: metRo_ em 15 de Julho de 2010, 16:02
Parabéns :) e ficámos à espera das fotos e do video :p
Agora tens tempo para colocar isso como queres :p
Título: Re: Robot de Busca e Salvamento!
Enviado por: fred gomes em 15 de Julho de 2010, 21:48
sim já tenho mais tempo..
mas não sei se vou continuar este projecto, tenho de experimentar outras formas de fazer o sensor de cores (para obter leituras 100% fiáveis), e elaborar a programação que queria para o display, é tudo o que falta,

já sei como fazer um sensor de cores (detecta bem uma cor se não estiver em movimento (que é o caso do agv, a detecção duma cor em movimento é mais difícil do que com o sensor de cores parado)), e só falta mesmo alterar a programação do display, não alterei pq nao tive tempo ppara fazer isso,( perdi muito tempo de volta do sensor de cores..).

tensiono brevemente iniciar-me num novo projecto :) para aprender mais e novas coisas, para isso conto com a vossa ajuda :)

deixo aqui fotos do agv, mais tarde deixarei o video..
espero que gostem, e mais uma vez quero agradeçer a todos os que me ajudaram..

http://img688.imageshack.us/i/dsc02117d.jpg/ (http://img688.imageshack.us/i/dsc02117d.jpg/)

http://img715.imageshack.us/i/dsc02118d.jpg/ (http://img715.imageshack.us/i/dsc02118d.jpg/)

http://img822.imageshack.us/i/dsc02120d.jpg/ (http://img822.imageshack.us/i/dsc02120d.jpg/)
Título: Re: Robot de Busca e Salvamento![CONLUIDO]
Enviado por: fred gomes em 16 de Julho de 2010, 21:35
aqui deixo o video,
troquei a cor vermelha pela preta, pois a vermelha estava a reflectir bastante (parecia branco), e como detectar uma cor em movimento têm as suas dificuldades, perferi trocar...

espero que gostem, e agradeçia comentarios, positivos e negativos.. para que possa melhorar em projectos futuros..

Robot de Busca e Salvamento!. (http://www.youtube.com/watch?v=rI-hhw4cQRI#)
Título: Re: Robot de Busca e Salvamento![CONLUIDO]
Enviado por: metRo_ em 16 de Julho de 2010, 23:05
Gostei da idéia de guardar os fios :p

Eu ia dizer que se calhar tens aí uma estrutura muito grande para pouca coisa, se calhar podias ter aproveitado melhor o espaço no entanto o que podes fazer, visto que tens muito espaço é aproveitar essa base para futuros projectos, testar outros algoritmos, outros componentes, colocar uma camera, etc.
Título: Re: Robot de Busca e Salvamento![CONLUIDO]
Enviado por: fred gomes em 17 de Julho de 2010, 09:50
sim,
se calhar a estrutura foi um bocado grande, podia a ter reduzido um bocado.. no entanto irei aporveitá-la para futuros projectos, pelo menos para testar o projecto, e depois caso queira fazer numa estrutura maior/menor e com outro formato, faço a estrutura e é só colocar lá a parte da electronica... :) ,mas para efectuar os primeiros testes deverei usar mesmo esta estrutura..