Proyecto, robot sigue personas

Buenas, debido a que nunca antes he participado en un foro no se si esta es la forma correcta de plantear mi pregunta, pero allá voy.
La duda es la siguiente, estoy tratando de escribir el código para un robot 4wd que siga el movimiento de las personas, para ello empleo 2 PIR que establecen la dirección de giro y 1 sensor ulttrasonico para frenar en cuanto se encuentra cerca del objetivo.
Mi problema surge a la hora de detectar movimiento, el robot se queda girando eternamente y yo solo necesito que los motores se activen durante medio segundo llevando a cabo menos de 1 cuarto de vuelta.
Desde ya, muchas gracias por vuestras respuestas y un saludo.

btcar_v01_22_copia2_ino.ino (10.3 KB)

Los PIR no me parecen sensores apropiados. Suelen tener ventan en las que permanecen activos mucho tiempo.
Comprobaste eso?
Cuando tiempo luego de detectar presencia permanece en ON cada PIR?
Chequea ese dato y seguimos conversando.

Yo lo haría con 3 ultrasónicos.

surbyte:
Los PIR no me parecen sensores apropiados. Suelen tener ventan en las que permanecen activos mucho tiempo.
Comprobaste eso?
Cuando tiempo luego de detectar presencia permanece en ON cada PIR?
Chequea ese dato y seguimos conversando.

Yo lo haría con 3 ultrasónicos.

Gracias por responder surbyte, verás, los pir son el modelo HC-SR501, el fabricante indica que el tiempo mínimo activo es de 3 segundos y efectivamente medido con el polimetro tengo esa duración de 3 segundos.
Traté de solventarlo, como puedes ver en el código, con unos delay y unas funciones millis() pero aún así no obtengo el resultado deseado, no creo que sea el adecuado el código que tengo ni su organización, soy totalmente novato en esto y con este proyecto estoy dando palos de ciego.

No uses delay()
Y si usas delay() no uses millis() decide que usarás pero las dos... poco tienen que ver salvo que pongas un delay(1) y ahi no digo nada.

Dejando de lado el tema delay() que todos los dias da dolores de cabeza veamos que ocurre con tu código.

Si algo demora 3 segundos eso será un problema para tu detección.
Yo sigo pensando que es mucho para algo como un robot pero si puedes vivir con esa demora bien.

Mi consejo que no va a cambiar nada es que en lugar de ver estados del PIR veas cambios de estado o sea.. cuando haya un flanco positivo entonces tu tomas acción

Esto

estadoPIR1 = digitalRead(sensorPIR1);
delay(1000);
estadoPIR2 = digitalRead(sensorPIR2);
delay(1000);

Para que? Para que delay(1000)? o sea a tus 3 segundos le agregas un segundo mas cuando debes reaccionar inmediatamente!!

Debes aprender a poner pausas donde corresponde pero no por que si!!

Esta es mi versión de esa parte del código

tomas dos variables booleanas

// Uso bool y no int porque int son 16 bits y con 1 bit me sobra para ver un estado.

bool estadoPIR1, estadoPIR1Ant = false; // defino el estado anterior como falso o 0
bool estadoPIR2, estadoPIR2Ant = false;
// cuando leo en el loop hago esto

estadoPIR1 = digitalRead(sensorPIR1);

if (estadoPIR1  && !estadoPIR1Ant) {
  // PIR1 cambio de flanco asi que muevo a donde corresponda
}

estadoPIR2 = digitalRead(sensorPIR2);

El resto del código mejor no verlo.. sigues sumando delay(1000) y mas delay(1000)

Bueno hay que cambiar toda tu forma de pensar estas cosas.
Mas tarde sigo con la idea.

if (estadoPIR2  && !estadoPIR2Ant) {
  // PIR2 cambio de flanco asi que muevo a donde corresponda 
}

Voy a tratar de ir corrigiendo el código en base a lo que me indicaste aunque lo tengo complicado en los 3 segundos de estado alto del PIR, pero aún así me gustaría intentarlo a ver a donde se puede llegar, y así ir aprendiendo, que es mi objetivo.

Insisto que Los PIR son mala idea pero veré como modificarlo para que funcione aun con esos 3 segundos.
Mira a ver si puedes regularlo para que no demore ese tiempo.

Bueno acá esta el manual y dice que va de 3 a 5 min asi que imposible a menos que lo modifiques electrónicamente.

Te dejo el esquema y como modificar ese tiempo para hacerlo mas veloz
El tiempo esta definido por un capacitor y un resistor conectados entre los pines 5 y 6 del BISS0001.
El tiempo se calcula como 24R33CY2

Prueba variando esa R a ver si logras achicar los tiempos.

Tas hacer las modificaciones que me indicaste, he podido comprobar que efectivamente este proyecto, el robot "perro" o seguidor de personas,en principio no se puede realizar con este modelo de detector PIR, he ajustado el código para que detecte únicamente los flancos de subida y mediante un delay(5oo) establecí el tiempo de giro necesario para que el robot se orientase al lugar donde detecta movimiento, pero a su vez, el detector opuesto detecta el movimiento del giro, realizando un giro en el sentido opuesto, supuse que los PIR solo reaccionarían ante una variación de calor como la de un cuerpo humano, conclusión, el bicho enloquece y al final tira para donde le da la gana.
No emplee los 2 ultrasonicos para direccionar ya que supuse, y corrígeme si me equivoco, que en cuanto el robot avanzase, el ultrasonico opuesto también detectaría una variación de distancia, direccionandolo otra vez, en el sentido opuesto.

Si ves que esto tiene solución, nuevamente agradecería tu respuesta, un saludo.

Te adjunto el código modificado.

btcar_v01_22_copia3_ino.ino (10.5 KB)

Bueno, veamos el problema y busquemos una solución.

Supongamos que hacemos un robot seguidor bajo estas condiciones (no otras). Tenemos una persona u objeto a seguir (no dos ni tres y esa es la condición).
SI hicieras que tu sensor detecte el objeto entonces pasaría lo que describes. Que tal si lo que haces es asegurarte que el objeto quede entre ambos sensores, y siempre vas de un lado a otro avanzando asegurandote que este entre medio? Eso serviriía según yo lo veo.

Si, seria una buena opción, pero partiendo de que la persona ya se encuentra en frente al robot, como hago para que el robot se oriente allí a donde se mueva la persona, si la persona se mueve de enfrente a un lado es muy probable que lo detecte los 2 PIR, y en cuanto este robot comience a moverse seguramente tambien lo detecte el otro pir a menos que establezca una condición tipo, "mientras los motores están activos, no aceptes más señales entrantes", la verdad es que no sabria ni por donde empezar a escribir este nuevo codigo.

Tu siempre puedes hacer un algoritmo de búsqueda haciendo que gire a un lado o a otro. En algun momento debe encontrar algo, o bien si gira 360 y no encuentra nada... que se quede en el lugar. SE me ocurre no?
Si coloca 3 sensores.. 1 al flrente y ese sabra donde esta el objeto y dos a los lados para asegurarte de seguirlo.

Entonces la idea seria, que el ultrasonido rotase buscando una variación de distancia (recordando que cada vez que se mueva el robot, los PIR darian falsas detecciones por el propio movimiento de este). En cuanto el ultrasonico detectase esa variación, incicarle que gire hacia el objeto, pero ahora surgen más problemas aún, no le puedo indicar una distancia fija para identificarla como movimiento ya que si se acerca a una pared, se terminaria tirando contra ella indefinidamente creyendo que es una persona. Insisto, no comprendo la forma en la que puedo emplear los pir para discriminar una persona de un objeto ya que estos me dan falsos positivos cuando se mueve el propio robot.