Hola surbyte, gracias por contestarme.
No entiendo a que te refieres con añadir tiempos. Como ya comente el programa funcionaba perfectamente cuando en el loop escribía yo que rutina utilizar. Sin embargo al añadir la pixy2 para la elección de la rutina las mediciones del sonar eran erroneas.
Adjunto el código entero para que puedas entender mejor el programa.
Muchas gracias de antemano.
#include <AFMotor.h>
#include <Servo.h>
#include <Pixy2.h>
// SONARRAREN PINAK
#define trigPin 50 // Arduino pin tied to trigger pin on the ultrasonic sensor.
#define echoPin 48 // Arduino pin tied to echo pin on the ultrasonic sensor.
#define led 46
// PI-ren ezarpena
#define PI 3.1415926535897932384626433832795
int encoderPos=0;
AF_DCMotor aurezk(4,MOTOR34_64KHZ); // Rueda delantera izquierda
AF_DCMotor auresk(3,MOTOR34_64KHZ); // Rueda delantera derecha
AF_DCMotor atzesk(1,MOTOR12_64KHZ); // Rueda trasera derecha
AF_DCMotor atzezk(2,MOTOR12_64KHZ); // Rueda trasera izquierda
Servo servoMotor;
Pixy2 pixy;
void setup()
{
Serial.begin(9600);
pinMode(trigPin, OUTPUT);
pinMode(echoPin, INPUT);
pinMode(led, OUTPUT);
pinMode(52,OUTPUT);
attachInterrupt(2, interrupcion, FALLING);
pixy.init(); // Inicializacion de la camara Pixy2
}
void loop()
{
Serial.println("ITXAROTEN");
pixy.ccc.getBlocks(); // Recoger datos de la camara
if(pixy.ccc.numBlocks) // Para comprobar si ha detectado algo
{
if(pixy.ccc.blocks[0].m_signature==1) // Color uno detectado
{
Abat(); // Ir a A1
}
else if(pixy.ccc.blocks[0].m_signature==2) // Color dos detectado
{
Abi(); // Ir a A2
}
else if(pixy.ccc.blocks[0].m_signature==3) // Color. 3 detectado
{
digitalWrite(30,HIGH);
}
}
}
void interrupcion()
{
encoderPos++;
}
void JATORRItikAP()
{
int angelua; //angulo del servo
int aldaketa; // variable para cambiar el angulo
double minimoa; //distancia mínima para colision
// establecer velocidades
atzezk.setSpeed(100);
atzesk.setSpeed(100);
aurezk.setSpeed(100);
auresk.setSpeed(100);
long distancia;
distancia=0;
encoderPos=0;
angelua=90;
aldaketa=-5;
delay(1000);
do
{
//moverse
atzezk.run(FORWARD); // Hacia delante
atzesk.run(FORWARD);
auresk.run(FORWARD);
aurezk.run(FORWARD);
//Serial.println(encoderPos);
distancia=SONAR(angelua);
Serial.print("Neurtuta: ");
Serial.print(distancia);
minimoa=kalminimoa(angelua);
Serial.print(" DMIN: ");
Serial.println(minimoa);
if(distancia<minimoa)
{
atzezk.run(RELEASE);
atzesk.run(RELEASE);
auresk.run(RELEASE);
aurezk.run(RELEASE);
do
{
distancia=SONAR(angelua);
Serial.print("ARRISKUA!");
Serial.print(" DMIN: ");
Serial.print(minimoa);
Serial.print(" REALA: ");
Serial.println(distancia);
}while(distancia<minimoa);
atzezk.run(FORWARD); // hacia delante
atzesk.run(FORWARD);
auresk.run(FORWARD);
aurezk.run(FORWARD);
}
angelua=angelua+aldaketa; //actualizar variable del angulo
if(angelua==155)
{
aldaketa=-5;
angelua=145;
}
if(angelua==40)
{
aldaketa=5;
angelua=40;
}
}while(encoderPos<=405);
//Parar
atzezk.run(RELEASE);
atzesk.run(RELEASE);
auresk.run(RELEASE);
aurezk.run(RELEASE);
}
void APtikA1()
{
int angelua;
int aldaketa;
long distancia;
double minimoa;
minimoa=0;
distancia=0;
angelua=90;
aldaketa=-5;
encoderPos=0;
// Abiadurak ezarri
atzezk.setSpeed(100);
atzesk.setSpeed(100);
aurezk.setSpeed(100);
auresk.setSpeed(100);
delay(1000);
do
{
//Mugitzen hasi
atzezk.run(FORWARD);
atzesk.run(FORWARD);
auresk.run(FORWARD);
aurezk.run(FORWARD);
distancia=SONAR(angelua);
minimoa=kalminimoa(angelua);
if(distancia<minimoa)
{
atzezk.run(RELEASE);
atzesk.run(RELEASE);
auresk.run(RELEASE);
aurezk.run(RELEASE);
do
{
distancia=SONAR(angelua);
}while(distancia<minimoa);
atzezk.run(FORWARD); // Aurrerantza
atzesk.run(FORWARD);
auresk.run(FORWARD);
aurezk.run(FORWARD);
}
angelua=angelua+aldaketa;
}while(encoderPos<=405);
//Gelditu
atzezk.run(RELEASE);
atzesk.run(RELEASE);
auresk.run(RELEASE);
aurezk.run(RELEASE);
}
void APtikA2()
{
int angelua;
int aldaketa;
long distancia;
double minimoa;
minimoa=0;
distancia=0;
angelua=90;
aldaketa=-5;
encoderPos=0;
// Abiadurak ezarri
atzezk.setSpeed(100);
atzesk.setSpeed(100);
aurezk.setSpeed(100);
auresk.setSpeed(100);
delay(1000);
do
{
//Mugitzen hasi
atzezk.run(FORWARD); // Aurrerantza
atzesk.run(FORWARD);
auresk.run(FORWARD);
aurezk.run(FORWARD);
distancia=SONAR(angelua);
minimoa=kalminimoa(angelua);
if(distancia<minimoa)
{
atzezk.run(RELEASE);
atzesk.run(RELEASE);
auresk.run(RELEASE);
aurezk.run(RELEASE);
do
{
distancia=SONAR(angelua);
}while(distancia<minimoa);
atzezk.run(FORWARD); // Aurrerantza
atzesk.run(FORWARD);
auresk.run(FORWARD);
aurezk.run(FORWARD);
}
angelua=angelua+aldaketa;
}while(encoderPos<=560);
//Gelditu
atzezk.run(RELEASE);
atzesk.run(RELEASE);
auresk.run(RELEASE);
aurezk.run(RELEASE);
}
void Abat()
{
JATORRItikAP();
BIRAKETA();
APtikA1();
delay(5000);
KONTRABIRAKETA();
APtikA1();
BIRAKETA2();
JATORRItikAP();
KONTRABIRAKETA();
}
void Abi()
{
JATORRItikAP();
}
void KONTRABIRAKETA() // Para girar 360° el Rover
{
//Abiadurak ezarri
atzezk.setSpeed(120);
atzesk.setSpeed(120);
auresk.setSpeed(120);
aurezk.setSpeed(120);
encoderPos=0;
delay(1000);
do{
//Mugitzen hasi
atzezk.run(FORWARD);
aurezk.run(FORWARD);
atzesk.run(BACKWARD);
auresk.run(BACKWARD);
Serial.print(encoderPos);
}while(encoderPos<=135);
//Gelditu
atzezk.run(RELEASE);
atzesk.run(RELEASE);
auresk.run(RELEASE);
aurezk.run(RELEASE);
}
void BIRAKETA2() // Para girar 90 grados el. Rover
{
//Abiadurak ezarri
atzezk.setSpeed(120);
atzesk.setSpeed(120);
auresk.setSpeed(120);
aurezk.setSpeed(120);
encoderPos=0;
delay(1000);
do{
//Mugitzen hasi
atzezk.run(FORWARD);
aurezk.run(FORWARD);
atzesk.run(BACKWARD);
auresk.run(BACKWARD);
Serial.print(encoderPos);
}while(encoderPos<=60);
//Gelditu
atzezk.run(RELEASE);
atzesk.run(RELEASE);
auresk.run(RELEASE);
aurezk.run(RELEASE);
}
void BIRAKETA() // Para girar 90°. Rover
{
//Abiadurak ezarri
atzezk.setSpeed(120);
atzesk.setSpeed(120);
auresk.setSpeed(120);
aurezk.setSpeed(120);
encoderPos=0;
delay(1000);
do{
//Mugitzen hasi
atzezk.run(BACKWARD);
aurezk.run(BACKWARD);
atzesk.run(FORWARD);
auresk.run(FORWARD);
Serial.print(encoderPos);
}while(encoderPos<=60);
//Gelditu
atzezk.run(RELEASE);
atzesk.run(RELEASE);
auresk.run(RELEASE);
aurezk.run(RELEASE);
}
long SONAR( int angelua) // Subrutina del sonar
{
servoMotor.attach(10);
long duracion, distancia ;
servoMotor.write(angelua);
delay(50);
digitalWrite(52,HIGH);
digitalWrite(trigPin, LOW); // Nos aseguramos de que el trigger está desactivado
delayMicroseconds(2); // Para asegurarnos de que el trigger esta LOW
digitalWrite(trigPin, HIGH); // Activamos el pulso de salida
delayMicroseconds(10); // Esperamos 10µs. El pulso sigue active este tiempo
digitalWrite(trigPin, LOW); // Cortamos el pulso y a esperar el echo
duracion = pulseIn(echoPin, HIGH) ;
distancia = duracion / 2 / 29.1 ;
//Serial.println(String(distancia) + " cm.") ;
return distancia;
}
float kalminimoa(int angelua) // subrutina para calcular distancia minima de colision
{
float radianetan;
float minimo;
radianetan=0;
minimo=0;
if(angelua<90)
{
radianetan=angelua*(2*PI/360); // angulos a radianes
minimo=(7.5/cos(radianetan))+0.5; // Distancia minima kalkuloa + 0.5 margen de seguridad
}
if(angelua>90)
{
radianetan=angelua*(2*PI/360);
minimo=(-7.5/cos(radianetan))+0.5;
}
if (angelua==90)
{
minimo=25; // 90º cos()-a error,
}
// limitar la distancia mínima
if (minimo>25)
{
minimo=25;
}
return minimo;
}