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
-
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
#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();
}
-
Lê tudo a partir daqui: http://lusorobotica.com/index.php/topic,1153.msg12156.html#msg12156
-
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 >:(
-
acho que este não é o tópico mais indicado mas acho que é escusado abrir outro. nes te condigo(
// ---------------------------------------------------------------------------- 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?
-
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
-
ok obrigado
-
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?