collapse

* Posts Recentes

Amplificador - Rockboard HA 1 In-Ear por almamater
[27 de Março de 2024, 19:13]


O que é isto ? por KammutierSpule
[26 de Março de 2024, 19:35]


Bateria - Portátil por almamater
[25 de Março de 2024, 22:14]


Emulador NES em ESP32 por dropes
[13 de Março de 2024, 21:19]


Escolher Osciloscópio por jm_araujo
[06 de Fevereiro de 2024, 23:07]


TP4056 - Dúvida por dropes
[31 de Janeiro de 2024, 14:13]


Leitura de dados por Porta Serie por jm_araujo
[22 de Janeiro de 2024, 14:00]


Distancia Cabo por jm_araujo
[08 de Janeiro de 2024, 16:30]


Meu novo robô por josecarlos
[06 de Janeiro de 2024, 16:46]


Laser Engraver - Alguém tem? por almamater
[16 de Dezembro de 2023, 14:23]

Autor Tópico: Robot de Busca e Salvamento![CONLUIDO]  (Lida 70302 vezes)

0 Membros e 1 Visitante estão a ver este tópico.

Offline fred gomes

  • Mini Robot
  • *
  • Mensagens: 238
Re: Robot de Busca e Salvamento!
« Responder #75 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...

 :-\
« Última modificação: 11 de Maio de 2010, 18:15 por fred gomes »
cumprimentos,
Fred

Offline fred gomes

  • Mini Robot
  • *
  • Mensagens: 238
Re: Robot de Busca e Salvamento!
« Responder #76 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..
cumprimentos,
Fred

Offline fred gomes

  • Mini Robot
  • *
  • Mensagens: 238
Re: Robot de Busca e Salvamento!
« Responder #77 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 , 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 :)

« Última modificação: 15 de Maio de 2010, 16:52 por fred gomes »
cumprimentos,
Fred

Offline nunosilvarocha

  • Mini Robot
  • *
  • Mensagens: 337
Re: Robot de Busca e Salvamento!
« Responder #78 em: 14 de Maio de 2010, 22:30 »
e umas fotos da evolução do projecto??
acho que ficava bem!!

Offline senso

  • Global Moderator
  • Mini Robot
  • *****
  • Mensagens: 9.733
  • Helpdesk do sitio
Re: Robot de Busca e Salvamento!
« Responder #79 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 ;)
« Última modificação: 15 de Maio de 2010, 17:00 por TigPT »
Avr fanboy

Offline OxyGen

  • Mini Robot
  • *
  • Mensagens: 92
  • ET - UA
    • Curto.D ET Blog
Re: Robot de Busca e Salvamento!
« Responder #80 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.
OxyGen #

Offline senso

  • Global Moderator
  • Mini Robot
  • *****
  • Mensagens: 9.733
  • Helpdesk do sitio
Re: Robot de Busca e Salvamento!
« Responder #81 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
Avr fanboy

Offline fred gomes

  • Mini Robot
  • *
  • Mensagens: 238
Re: Robot de Busca e Salvamento!
« Responder #82 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..
cumprimentos,
Fred

Offline senso

  • Global Moderator
  • Mini Robot
  • *****
  • Mensagens: 9.733
  • Helpdesk do sitio
Re: Robot de Busca e Salvamento!
« Responder #83 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.
« Última modificação: 15 de Maio de 2010, 13:56 por senso »
Avr fanboy

Offline fred gomes

  • Mini Robot
  • *
  • Mensagens: 238
Re: Robot de Busca e Salvamento!
« Responder #84 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.
« Última modificação: 15 de Maio de 2010, 14:53 por fred gomes »
cumprimentos,
Fred

Offline amando96

  • Mini Robot
  • *
  • Mensagens: 1.631
  • MAC address? But I have windows...
    • Projects, News, Blog, Tutorials
Re: Robot de Busca e Salvamento!
« Responder #85 em: 15 de Maio de 2010, 15:02 »
O sensor da sharp não precisa de resistencia.

Offline fred gomes

  • Mini Robot
  • *
  • Mensagens: 238
Re: Robot de Busca e Salvamento!
« Responder #86 em: 15 de Maio de 2010, 15:06 »
eu estou a usar estes sensores: http://loja.lusorobotica.com/64-optical-detector-phototransistor.html , precisam dum pullup no colector para funcionarem.
cumprimentos,
Fred

Offline senso

  • Global Moderator
  • Mini Robot
  • *****
  • Mensagens: 9.733
  • Helpdesk do sitio
Re: Robot de Busca e Salvamento!
« Responder #87 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
Avr fanboy

Offline fred gomes

  • Mini Robot
  • *
  • Mensagens: 238
Re: Robot de Busca e Salvamento!
« Responder #88 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 :-\
cumprimentos,
Fred

Offline fred gomes

  • Mini Robot
  • *
  • Mensagens: 238
Re: Robot de Busca e Salvamento!
« Responder #89 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;)
cumprimentos,
Fred