Control de servos , dirección y medición mediante sensor de ultrasonidos.

Buenas a todos .

Primero de todo me presento como un reciente aficionado a la plataforma , con muchas ganas y no con tanta maña.

Hoy acudo a vosotros por lo siguiente:

-La idea es que mediante un sensor de ultrasonidos acoplado a un servo que se mueva de forma constante de lado a lado , detecte por un rango inferior al que yo especifique y lo " siga".

¿Como?
-Bueno , al detectar, la idea es que el servo se detenga y en cuanto el objetivo se mueva y por ende desparezca del rango de detección de mi sensor , el servo vuelva al trabajo hasta encontrar al objetivo dentro de su rango de 180º.

He probado de distintas formas , pero todas pese a que han dado resultados distintos , han acabado en fracaso .

He aqui la "obra"

Este código pese a que no da movimiento al servo, es la que veo mas "lógica" para que su funcionamiento se lleve a cabo de forma correcta.
Anteriormente ejecuté el movimiento de los servos con una directriz fija -
servo1.write(2);
delay(700);
servo1.write(178);
delay(700);
Pero de esa forma el sensor de ultrasonidos dejaba de funcionar mientras los servos ejecutaban sus posiciones , dando como resultado que los servos se detuvieran siempre en la posición 2.
Así que pensé que si el cambio de 2 a 178 era progresivo las lecturas del sensor serian progresivas y por ende la detención de los servos en consecuencia seria la correcta.

Mi lógica puede ser totalmente errónea , así que imploro ayuda.

:

#include <Servo.h>     // Carga la librería Servos
#include<Ultrasonic.h> // Carga la libreria de Ultrasonidos

Servo servo1;         //Crea un servo digital para controlar el servomotor
Servo servo2;         //Crea un servo digital para controlar el servomotor
int echo = 8;         //Pin de entrada de ultrasonidos
int trigger = 9;      //Pin de salida de ultrasonidos
long distancia;       //Variable para leer el valor de echo
long tiempo;         //Variable para ejecutar la función pulsein
char x;                //Variable para una ascensión progresiva del servo
void setup()
{
  Serial.begin(9600);
  pinMode(echo,INPUT);            // asociamos echo como entrada

  pinMode(trigger,OUTPUT);        // asociamos trigger como salida
  servo1.attach(22,2,178);        /* asocia el servo al pin 22 
                                     limitando la posición máxima y mínima del servo por seguridad */
  servo2.attach(24);              // asocia el servo2 al pin 24
  
}
void loop()
{
  digitalWrite(9 ,LOW);           // Por cuestión de estabilización del sensor
  delayMicroseconds(5);
  
  digitalWrite(9, HIGH);          // Envío del pulso ultrasónico
  delayMicroseconds(10);
  
  tiempo=pulseIn(8, 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 8 empieza a recibir el rebote, HIGH, hasta que 
                                     deja de hacerlo, LOW, la longitud del pulso entrante*/
  
  distancia= int(0.01715*tiempo);   //fórmula para calcular la distancia obteniendo un valor entero
  
  Serial.println(distancia);       //Monitorización en centímetros de la distancia en el monitor serial
  Serial.println(" cm"); 
  delay(50);
  
  
   while(distancia<100){            // Condicional , mientras distancia menor que "valor" , parada!
   
   delay(100);
   break;
   }
   if(distancia>100 && x>175){     //Condicional, si distancia mayor que "valor" y x mayor que "valor"
  servo1.write(x--);
   delay(100);
   }
   else if (distancia>100 && x<5){ //Condicional B , si distancia mayor que "valor" y x menor que "valor"
     servo1.write(x++);
     delay(100);
   Serial.print(x);
}
}

En el while pensé en copiar el código de detección del sensor dentro , ya que al detectar <100 comienza el bucle y no sale hasta detectar mas de 100 , en delay no se detecta absolutamente nada , por eso lo de copiar el código de detección , pero al final opté por un simple break.

PD: Seguramente dentro de este código , se encuentren atrocidades visuales para cualquiera minimamente puesto en el tema , así que pido comprensión hacia mi persona xD

Si alguien desea ofrecer conocimientos de forma mas directa, propongo hacerlo por skype, considero que es una herramienta muy útil y versátil en este tipo de situaciones.
Username : Efreit , icono junto a un muñeco de nieve.

Gracias por adelantado a todos y saludos!.

/*
 * Radar
 *
 * ----------------------------------
 * Author: Joseph Cheng<9Lab.co> 
 * Date: 2012-10-02 11:37:12
 * Revision: 2
 * ----------------------------------
 */

#include <Servo.h>
#include <Ultrasonic.h>

#define TRIGGER_PIN  12
#define ECHO_PIN     13

Servo myservo;  // create servo object to control a servo 
Ultrasonic ultrasonic(TRIGGER_PIN, ECHO_PIN);

// this constant won't change.  It's the pin number
// of the sensor's output:
int angle = 179;
int dypOutputPin = 2; // TRIG
int dypInputPin = 3;  // ECHO
long distance;
long cm;
int val;

void setup() {
  // initialize serial communication:
  Serial.begin(9600);
  myservo.attach(9);  // attaches the servo on pin 9 to the servo object 
}

void loop()
{
  float cmMsec;
  long microsec = ultrasonic.timing();   

  cmMsec = ultrasonic.convert(microsec, Ultrasonic::CM);
  
  if(angle < 0) {
    angle = 180;
  }
  
  Serial.print("{d:");
  Serial.print(cmMsec);
  Serial.print(",r:");
  Serial.print(angle);
  Serial.print("}");
  
  val = map(angle, 0, 180, 0, 179);
  
  myservo.write(val);
  
  angle -= 15;
  
  delay(100);
}

DistObjetivo=20 ;

if(cmMsec != DistObjetivo)
** myservo.write(val);**

Wow , la mitad del código no acabo de comprenderlo xD , así que le echare un tiempo para entenderlo.

De todas formas gracias , estaba un poco atascado en esta parte y comenzaba a pensar en otras alternativas .

Muchas gracias compañero!.

Vengo a darte una mano a ver si lo entiendes.

Acá tienes el link que te dará algunas ideas para entenderlo mejor

/*
 * Radar
 *
 * ----------------------------------
 * Author: Joseph Cheng<9Lab.co> 
 * Date: 2012-10-02 11:37:12
 * Revision: 2
 * ----------------------------------
 */

#include <Servo.h>
#include <Ultrasonic.h>

#define TRIGGER_PIN  12
#define ECHO_PIN     13

Servo myservo;  			// create servo object to control a servo 
Ultrasonic ultrasonic(TRIGGER_PIN, ECHO_PIN);

							// this constant won't change.  It's the pin number
							// of the sensor's output:
int angle 			= 179;
long distance;
long cm;
int val;

void setup() {
  // initialize serial communication:
  Serial.begin(9600);
  myservo.attach(9);  		// Servo conectado al pin 9
}

void loop()
{
  float cmMsec;				// creo una varaible floa cmMseg
  long microsec = ultrasonic.timing();   // leo el sensor ultrasónico. Respueta en microsegundos

  cmMsec = ultrasonic.convert(microsec, Ultrasonic::CM);  // convierto los microseg a CM usando una función de la librería
  
  if(angle < 0) {		// Si el angulo es negativo entonces el ángulo es igual a 180.
    angle = 179;
  }
  
  Serial.print("{d:");
  Serial.print(cmMsec);
  Serial.print(",r:");
  Serial.print(angle);
  Serial.print("}");		// imprimo CM y ángulo por el serial.
  
  //val = map(angle, 0, 180, 0, 179);  // esta funcion comvierte todo lo que este entre 0 y 180 a 0 y 179. 
  // al cambiar el if para los negativos a 179 esta función map esta de mas.

  myservo.write(val);				 // envia ese angulo al servo
  
  angle -= 15;						 // le quito 15 grados a la lectura de ángulo
  
  delay(100);						 // demora de 100 mseg
}

Basicamente el servo comienza en 179 grados, hace una lectura y luego repite la operación cada 15 grados, cuando llega a 0, vuelve a comenzar.

Buenas a todos tengo unas consultas respecto al sensor y al servo
es que tengo que hacer que se detenga el servo cuando detecte a un objeto "x" y cuando no lo detecte se quede en un angulo de 90 pero que se quede quieto

Es un hilo del 2015, no debes revivir un hilo tan viejo y menos para hacer consultas.
Crea un hilo propio y lee las normas del foro que esta vez pasaste por alto.