LusoRobótica - Robótica em Português

Software => Software e Programação => Tópico iniciado por: wear em 31 de Julho de 2009, 17:11

Título: Navegação Robo com IR
Enviado por: wear em 31 de Julho de 2009, 17:11
Boas pessoal venho novamente pedir a vossa ajuda eu basei-me no código do guibot, mas o meu robo não navega em condições ou seja o servo que sustenta o Sensor IR logo no início vira para a direita e não sai mais dessa posição mesmo que apareça objectos na frente.....

que estarei eu a fazer mal no código.....já agora alguém me pode explicar a biblioteca Metro, pois eu no código estou a usar porque antes também não estava a funcionar e então pensei que fosse disso e meti mas não funciona na mesma e não sei para que serve se quer, então pedia a vossa ajuda para me explicarem pois eu gosto de saber o que uso e como funciona...

aqui fica o código

Citar

#include <Metro.h>

int servoFrente=9; // Servo suporta o sensor distância ligado no pino 9
int servoDireita=10; // Servo rotação lado direito ligado no pino 10
int servoEsquerda=11; // Servo rotação lado esquerdo ligado no pin 11
int sensorDistancia=0; //Sensor de distância ligado no pino Analógico 0
int distancia=0; // Valor que vai conter a leitura do sensor
int esquerda, direita, frente; // Variáveis que vão guardar os valores de leitura do Sensor
int distanciaMinima=600; // Distância Mínima de segurança
int calculaDistancia=0; //Guarda o valor lido pelo sensor
int tempo = 300; // tempo do temporizador em millisegundos
int i;
Metro mede_distancia = Metro(tempo);

void setup(){

  Serial.begin(9600);
  pinMode(servoFrente, OUTPUT);
  pinMode(servoDireita, OUTPUT);
  pinMode(servoEsquerda, OUTPUT);
  pinMode(sensorDistancia, INPUT);

}

void loop(){

  if (mede_distancia.check() == 1) {
    olharFrente();
  }
  if (frente < distanciaMinima)
  andarFrente();
  else
  decidirCaminho();
 

}

int lerSensor(){
  return calculaDistancia = analogRead(0);
}

void olharFrente() {
  analogWrite(servoFrente, 90);
  delay(500);     
  lerSensor();
  frente = calculaDistancia;
}

void olharDireita(){
  analogWrite(servoFrente, 160);
  delay(500);
  lerSensor();
  direita= calculaDistancia;
}

void olharEsquerda(){
  analogWrite(servoFrente, 20);
  delay(500);
  lerSensor();
  esquerda=calculaDistancia;
}

void pararMotores(){
  analogWrite(servoDireita, 127);
  analogWrite(servoEsquerda, -127);
  delay(20);
}

void andarFrente(){
  analogWrite(servoDireita, 152);
  analogWrite(servoEsquerda, -152);
}

void andarTras(){
  analogWrite(servoDireita, -152);
  analogWrite(servoEsquerda, 152);
}

void andarDireita(){
  analogWrite(servoDireita, 152);
  analogWrite(servoEsquerda, 152);
}

void andarEsquerda(){
  analogWrite(servoDireita, 140);
  analogWrite(servoEsquerda, 140);
}

void decidirCaminho(){

  pararMotores();
  olharEsquerda();
  delay(250);
  pararMotores();
  olharDireita();
  delay(250);

  if (esquerda < direita)
    andarEsquerda();
  else
    andarDireita();

}


Título: Re:Navegação Robo com IR
Enviado por: metRo_ em 31 de Julho de 2009, 18:25
Lê tudo a partir daqui: http://lusorobotica.com/index.php/topic,1153.msg12156.html#msg12156
Título: Re:Navegação Robo com IR
Enviado por: wear em 31 de Julho de 2009, 19:08
já tinha andado nesse tópico, por acaso e lembrei me que podia ser interferência e é capaz de fazer sentido pois quando só o servo da frente com o sensor é executado ele roda quando trabalham os outros servos fica "colado" à direita e não mexe mais  >:(

Título: Re: Navegação Robo com IR
Enviado por: R.S. em 20 de Fevereiro de 2010, 00:17
acho que este não é o tópico mais indicado mas acho que é escusado abrir outro.  nes te condigo(
Código: [Seleccione]
// ---------------------------------------------------------------------------- Servo
#include <Servo.h>

Servo servo;
int servoPin = 9;



// ---------------------------------------------------------------------------- Metro
// importar a livraria Metro, esta livraria permite criar temporizadores
// http://www.arduino.cc/playground/Code/Metro
#include <Metro.h>
int duration = 300;   // dura?‹o do temporizador em milisegundos
Metro mede_distancia = Metro(duration);    // declarar inst‰ncia



// ---------------------------------------------------------------------------- SENSOR SHARP
int sensorPin = 2;     // pin onde o sensor SHARP est‡ ligado
int sensorValue = 0;   // vari‡vel que vai conter o valor de leitura do sensor
int esquerda, direita, frente; // vari‡veis que v‹o conter os valores de leitura do sensor



// defini?‹o de uma dist‰ncia segura, valores abaixo significa que est‡ perto de um obst‡culo
// varia consoante o sensor
int distanciaSegura = 150;



// ---------------------------------------------------------------------------- Bump switchs
int PIN_BUMP_ESQ = 2;  // pin do bump esquerdo
int PIN_BUMP_DIR = 4;  // pin do bump direito

// Variaveis Bump Switchs
int BUMP_ESQ_VAR, BUMP_DIR_VAR;




// ---------------------------------------------------------------------------  Motores
int motor_left[] = {5, 6};
int motor_right[] = {7, 8};




// ---------------------------------------------------------------------------- Setup
// fun?‹o chamada quando o Arduino Ž inicializado
void setup() {
 
  Serial.begin(9600);
 
  // declarar em que pin est‡ o servo
  servo.attach(servoPin);
 
  // Setup motores
  int i;
  for(i = 0; i < 2; i++){
    pinMode(motor_left[i], OUTPUT);
    pinMode(motor_right[i], OUTPUT);
  }
 
}



// ---------------------------------------------------------------------------- Loop
// fun?‹o chamada infinitamente ap—s o setup()
void loop() {
 
  // mede distancia de X em X tempo
  if (mede_distancia.check() == 1) {
    olhaFrente();
  }
 
  // se a dist‰ncia em frente for menor do que a dist‰ncia segura previeamente definida
  // decidi para onde ir
  if (frente < distanciaSegura) drive_forward();
  else decidirDireccao();
 
}




// ---------------------------------------------------------------------------- Decide direc?‹o
void decidirDireccao() {

  motor_stop();
  olhaEsquerda();
  delay(250);
  motor_stop();
  olhaDireita();
  delay(250);
 
  if (esquerda < direita) turn_left();
  else turn_right();

}





// ---------------------------------------------------------------------------- Olhar em redor

void olhaEsquerda() {
   // olha para a esquerda e mede dist‰ncia
   servo.write(20);
   delay(500);
   readIR();
   esquerda = sensorValue;
}

void olhaDireita() {
   // olha para a direita e mede dist‰ncia
   servo.write(160);
   delay(500);     
   readIR();
   direita = sensorValue;
}

void olhaFrente() {
   // olha para a direita e mede dist‰ncia
   servo.write(90);
   delay(500);     
   readIR();
   frente = sensorValue;
}





// ---------------------------------------------------------------------------- Leitura do sensor SHARP
int readIR() {
  return sensorValue = analogRead(4);
  //Serial.println(sensorValue);
}
) esta-me a adar o seguinte erro:

" error: 'drive_forward' was not declared in this scope"

o que tenho de alterar?
Título: Re: Navegação Robo com IR
Enviado por: senso em 20 de Fevereiro de 2010, 00:22
Estas a chamar a função drive_forward, mas ela não existe, pelo menos nesse pedaço de código, provavelmente é isso que o compilador te quer dizer, que ela não existe apesar de a chamares
Título: Re: Navegação Robo com IR
Enviado por: R.S. em 20 de Fevereiro de 2010, 00:24
ok obrigado
Título: Re: Navegação Robo com IR
Enviado por: vicardosof em 05 de Março de 2010, 15:28
Um pequeno problema no código:
A distância de segurança será para evitar colisões, certo?
Não entendi a parte que está frente < distanciaMinima
Não seria ao contrário?