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!.