//definir las posiciones de los servos
#defineSERVO_FRONT1700#defineSERVO_REAR1300#defineSERVO_STOP1500ServoServoIzq,ServoDer;voidsetup(){Serial.begin(9600); //inicio de la comunicación seriepinMode(trig,OUTPUT);/*activamos el pin 9 como salida: emite un pulso ultrasónico*/pinMode(echo,INPUT);/*activamos el pin 8 como entrada: tiempo del rebote del ultrasonido*/ServoIzq.attach(8);ServoDer.attach(9);}voidloop(){digitalWrite(trig,LOW);/* Por cuestión de estabilización del sensor*/delayMicroseconds(5);digitalWrite(trig,HIGH);/* envío del pulso ultrasónico*/delayMicroseconds(10);tiempo=pulseIn(echo,HIGH);/* Función para medir la longitud del pulso entrante. Mide el tiempo que transcurrido entre el envío del pulso ultrasónico y cuando el sensor recibe el rebote, es decir: desde que el pin 12 empieza a recibir el rebote, HIGH, hasta que deja de hacerlo, LOW, la longitud del pulso entrante*/distancia=int(0.017*tiempo);/*fórmula para calcular la distancia obteniendo un valor entero*//*Monitorización en centímetros por el monitor serial*/Serial.println("Distancia ");Serial.println(distancia);Serial.println(" cm");delay(100);
//el robot va hacia delante
ServoIzq.writeMicroseconds(SERVO_FRONT);ServoDer.writeMicroseconds(SERVO_REAR);if(distancia<20)/*si la distancia del sensor con el objeto es menor de 20*/{
//gira a la derecha
ServoIzq.writeMicroseconds(SERVO_FRONT);ServoDer.writeMicroseconds(SERVO_FRONT);}else/*si no*/{
Gracias chicos. El sketch es similar al mio, aunque mi rover no quería que girara sino que se detuviera (en un principio). Les dejo el trozo de sketch que corresponde al sensor ultrasónico:
digitalWrite(Ptrig, LOW); delayMicroseconds(2); digitalWrite(Ptrig, HIGH); // genera el pulso de trigger por 10ms delayMicroseconds(10); digitalWrite(Ptrig, LOW);
duracion = pulseIn(Pecho, HIGH); distancia = (duracion/2) / 29; // calcula la distancia en centimetros
if (distancia <= 10 && distancia>=2){ analogWrite(derB, 0); // para analogWrite(izqB, 0); analogWrite(derA, 0); analogWrite(izqA, 0);
Veo que ustedes sensan a 20cm y no a 10cm como yo. Quizás sea eso el fallo de mi rover y no le doy tiempo a reaccionar, pero tampoco quería que retrocediera o se detuviera demasiado temprano. ¿Han probado vuestro sketch en situación real? Por experiencia les comento que en la mesa funciona todo y luego los duendes hacen de las suyas (que no digo que sea vuestro caso...)
Gracias por compartir. Tendré que volver a probar mi rover con 20 cm a ver que tal. Seguiré de cerca vuestro proyecto.
Hola Suso, prueba a ver con éste programa en principio no importa la distancia de sensado Usas Arduino como controlador del proyecto??
#include //libreria servo long distancia; long tiempo;
int trig = 2; int echo = 6; //definir las posiciones de los servos #define SERVO_FRONT 1700 #define SERVO_REAR 1300 #define SERVO_STOP 1500
Servo ServoIzq, ServoDer;
void setup()
{ Serial.begin(9600); //inicio de la comunicación serie
pinMode(trig, OUTPUT); /*activamos el pin 9 como salida: emite un pulso ultrasónico*/ pinMode(echo, INPUT); /*activamos el pin 8 como entrada: tiempo del rebote del ultrasonido*/
ServoIzq.attach(8); ServoDer.attach(9);
}
void loop()
{
digitalWrite(trig,LOW); /* Por cuestión de estabilización del sensor*/ delayMicroseconds(5); digitalWrite(trig, HIGH); /* envío del pulso ultrasónico*/ delayMicroseconds(10);
tiempo=pulseIn(echo, HIGH); /* Función para medir la longitud del pulso entrante. Mide el tiempo que transcurrido entre el envío del pulso ultrasónico y cuando el sensor recibe el rebote, es decir: desde que el pin 12 empieza a recibir el rebote, HIGH, hasta que deja de hacerlo, LOW, la longitud del pulso entrante*/
distancia= int(0.017*tiempo); /*fórmula para calcular la distancia obteniendo un valor entero*/
/*Monitorización en centímetros por el monitor serial*/ Serial.println("Distancia "); Serial.println(distancia); Serial.println(" cm");
delay (100); //el robot va hacia delante ServoIzq.writeMicroseconds(SERVO_FRONT); ServoDer.writeMicroseconds(SERVO_REAR);
if(distancia<20) /*si la distancia del sensor con el objeto es menor de 20*/
Gracias chicos. El sketch es similar al mio, aunque mi rover no quería que girara sino que se detuviera (en un principio). Les dejo el trozo de sketch que corresponde al sensor ultrasónico:
ResponderEliminardigitalWrite(Ptrig, LOW);
delayMicroseconds(2);
digitalWrite(Ptrig, HIGH); // genera el pulso de trigger por 10ms
delayMicroseconds(10);
digitalWrite(Ptrig, LOW);
duracion = pulseIn(Pecho, HIGH);
distancia = (duracion/2) / 29; // calcula la distancia en centimetros
if (distancia <= 10 && distancia>=2){
analogWrite(derB, 0); // para
analogWrite(izqB, 0);
analogWrite(derA, 0);
analogWrite(izqA, 0);
analogWrite(derA, 0); // retrocede
analogWrite(izqA, 0);
analogWrite(derB, vel);
analogWrite(izqB, vel);
delay(250);
analogWrite(derB, 0); // para
analogWrite(izqB, 0);
analogWrite(derA, 0);
analogWrite(izqA, 0);
estado=0;
}
Veo que ustedes sensan a 20cm y no a 10cm como yo. Quizás sea eso el fallo de mi rover y no le doy tiempo a reaccionar, pero tampoco quería que retrocediera o se detuviera demasiado temprano. ¿Han probado vuestro sketch en situación real? Por experiencia les comento que en la mesa funciona todo y luego los duendes hacen de las suyas (que no digo que sea vuestro caso...)
Gracias por compartir. Tendré que volver a probar mi rover con 20 cm a ver que tal. Seguiré de cerca vuestro proyecto.
Saludos.
Hola Suso, prueba a ver con éste programa en principio no importa la distancia de sensado
EliminarUsas Arduino como controlador del proyecto??
#include //libreria servo
long distancia;
long tiempo;
int trig = 2;
int echo = 6;
//definir las posiciones de los servos
#define SERVO_FRONT 1700
#define SERVO_REAR 1300
#define SERVO_STOP 1500
Servo ServoIzq, ServoDer;
void setup()
{
Serial.begin(9600); //inicio de la comunicación serie
pinMode(trig, OUTPUT); /*activamos el pin 9 como salida: emite un pulso ultrasónico*/
pinMode(echo, INPUT); /*activamos el pin 8 como entrada: tiempo del rebote del ultrasonido*/
ServoIzq.attach(8);
ServoDer.attach(9);
}
void loop()
{
digitalWrite(trig,LOW); /* Por cuestión de estabilización del sensor*/
delayMicroseconds(5);
digitalWrite(trig, HIGH); /* envío del pulso ultrasónico*/
delayMicroseconds(10);
tiempo=pulseIn(echo, HIGH); /* Función para medir la longitud del pulso entrante. Mide el tiempo que transcurrido entre el envío del pulso ultrasónico y cuando el sensor recibe el rebote, es decir: desde que el pin 12 empieza a recibir el rebote, HIGH, hasta que deja de hacerlo, LOW, la longitud del pulso entrante*/
distancia= int(0.017*tiempo); /*fórmula para calcular la distancia obteniendo un valor entero*/
/*Monitorización en centímetros por el monitor serial*/
Serial.println("Distancia ");
Serial.println(distancia);
Serial.println(" cm");
delay (100);
//el robot va hacia delante
ServoIzq.writeMicroseconds(SERVO_FRONT);
ServoDer.writeMicroseconds(SERVO_REAR);
if(distancia<20) /*si la distancia del sensor con el objeto es menor de 20*/
{
ServoIzq.writeMicroseconds(SERVO_STOP);
ServoDer.writeMicroseconds(SERVO_STOP);
}
}
Gracias por el aporte. Tendré que probarlo a ver.
ResponderEliminarSaludos.