cuadrupedo comandado con IR

Hola a todos.

Intento hacer un robot cuadrúpedo comandado con mando IR y sensor AX-1838HS.
Creo que me he venido arriba, dado el poco conocimiento de programación que tengo.
Pero bueno, el caso es que en principio todo funcionaba bien si el robot hacia un movimiento y esperaba para ejecutar la siguiente orden enviada por mando.
El problema a empezado cuando hago que el robot ande en continuo e intento enviar una nueva orden con el mando IR. Por ejemplo girar.
Parece que no recibe la señal o solo alguna vez aleatoriamente.
He leído que este sensor(AX-1838HS) al ser de baja calidad da problemas.
En resumen, no sé si el problema lo genero yo con el código, o es más bien problema de hardware.
Adjunto el programa por si alguien quiere reírse un poco y si además me echa una mano, pues perfecto…

Salut.

#include <Wire.h>
#include <Adafruit_PWMServoDriver.h>
#include <IRremote.h>
Adafruit_PWMServoDriver servos = Adafruit_PWMServoDriver(0x40);
//servo           0   1   2   3   4   5   6   7   8   9   10  11
unsigned int pos0[12] =  {145, 120, 140, 155, 145, 125, 172, 140, 125, 135, 140, 140};
unsigned int pos180[12] = {535, 510, 530, 555, 535, 515, 565, 530, 515, 530, 530, 530};
int velo1 = 100;
const int RECV_PIN = 8;
int movement;
IRrecv irrecv(RECV_PIN);
decode_results results;

void setup() {
  servos.begin();
  servos.setPWMFreq(60); //Frecuecia PWM de 60Hz o T=16,66ms
  Serial.begin(9600);//iniciailzamos la comunicación
  irrecv.enableIRIn(); 
  posstay();
}
void setServo(uint8_t n_servo, int angulo) {
  int duty;
  duty = map(angulo, 0, 180, pos0[n_servo], pos180[n_servo]);
  servos.setPWM(n_servo, 0, duty);
}
void loop() {
  if (irrecv.decode(&results)){
       
     if (results.value == 0XFF7A85)
    {
      movement = 0;
      turnright();
      //Serial.println(movement);
    }
    if (results.value == 0xFF30CF)
    {
      movement = 0;
      turnleft();
      //Serial.println(movement);
    }
    if (results.value == 0xFF906F)
    {
      movement = 0;
      greating() ;
      //Serial.println(movement);
    }
    if (results.value == 0xFF18E7)
    {
      movement = 0;
      posstay() ;
      //Serial.println(movement);
    }
    
    
    if (results.value == 0xFF9867)
    {
      movement = 1;
      //Serial.println(movement);
    }
    irrecv.resume();
  }
    if (movement==1)
    {
    walk();
    }
  
 } 

void posstay() {
  setServo(0, 130);
  setServo(1, 145);
  setServo(2, 45);
  delay (velo1);
  setServo(0, 130);
  setServo(1, 122);
  setServo(2, 59);
  delay (velo1);
  setServo(3, 50);
  setServo(4, 35);
  setServo(5, 135);
  delay (velo1);
  setServo(3, 50);
  setServo(4, 58);
  setServo(5, 121);
  delay (velo1);
  setServo(6, 50);
  setServo(7, 35);
  setServo(8, 135);
  delay (velo1);
  setServo(6, 50);
  setServo(7, 58);
  setServo(8, 121);
  delay (velo1);
  setServo(9, 130);
  setServo(10, 145);
  setServo(11, 45);
  delay (velo1);
  setServo(9, 130);
  setServo(10, 122);
  setServo(11, 59);
  delay (velo1);
}
void turncenter() {
  setServo(0, 130);
  setServo(1, 122);
  setServo(2, 59);
  setServo(3, 50);
  setServo(4, 58);
  setServo(5, 121);
  setServo(6, 50);
  setServo(7, 58);
  setServo(8, 121);
  setServo(9, 130);
  setServo(10, 122);
  setServo(11, 59);
  delay (velo1);
}

void turnleft() {
  setServo(0, 159);
  setServo(1, 120);
  setServo(2, 70);
  setServo(3, 83);
  setServo(4, 58);
  setServo(5, 123);
  setServo(6, 83);
  setServo(7, 58);
  setServo(8, 123);
  setServo(9, 159);
  setServo(10, 120);
  setServo(11, 70);
  delay (velo1);
  setServo(0, 130);
  setServo(1, 145);
  setServo(2, 45);
  delay (velo1);
  setServo(0, 130);
  setServo(1, 122);
  setServo(2, 59);
  delay (velo1);
  setServo(3, 50);
  setServo(4, 35);
  setServo(5, 135);
  delay (velo1);
  setServo(3, 50);
  setServo(4, 58);
  setServo(5, 121);
  delay (velo1);
  setServo(6, 50);
  setServo(7, 35);
  setServo(8, 135);
  delay (velo1);
  setServo(6, 50);
  setServo(7, 58);
  setServo(8, 121);
  delay (velo1);
  setServo(9, 130);
  setServo(10, 145);
  setServo(11, 45);
  delay (velo1);
  setServo(9, 130);
  setServo(10, 122);
  setServo(11, 59);
  delay (velo1);
}
void turnright() {
  setServo(0, 97);
  setServo(1, 122);
  setServo(2, 57);
  setServo(3, 21);
  setServo(4, 60);
  setServo(5, 110);
  setServo(6, 21);
  setServo(7, 60);
  setServo(8, 110);
  setServo(9, 97);
  setServo(10, 122);
  setServo(11, 87);
  delay (velo1);
  setServo(0, 130);
  setServo(1, 145);
  setServo(2, 45);
  delay (velo1);
  setServo(0, 130);
  setServo(1, 122);
  setServo(2, 59);
  delay (velo1);
  setServo(3, 50);
  setServo(4, 35);
  setServo(5, 135);
  delay (velo1);
  setServo(3, 50);
  setServo(4, 58);
  setServo(5, 121);
  delay (velo1);
  setServo(6, 50);
  setServo(7, 35);
  setServo(8, 135);
  delay (velo1);
  setServo(6, 50);
  setServo(7, 58);
  setServo(8, 121);
  delay (velo1);
  setServo(9, 130);
  setServo(10, 145);
  setServo(11, 45);
  delay (velo1);
  setServo(9, 130);
  setServo(10, 122);
  setServo(11, 59);
  delay (velo1);
}

void walk() {
  setServo(6, 50);
  setServo(7, 35);
  setServo(8, 135);
  delay (velo1);
  setServo(6, 25);
  setServo(7, 33);
  setServo(8, 141);
  delay (velo1);
  setServo(6, 25);
  setServo(7, 58);
  setServo(8, 126);
  delay  (velo1);
  setServo(0, 130);
  setServo(1, 145);
  setServo(2, 45);
  delay (velo1);
  setServo(0, 113);
  setServo(1, 138);
  setServo(2, 61);
  delay (velo1);
  setServo(0, 113);
  setServo(1, 118);
  setServo(2, 73);
  delay (velo1);
  setServo(0, 130);
  setServo(1, 122);
  setServo(2, 56);
  setServo(3, 25);
  setServo(4, 58);
  setServo(5, 126);
  setServo(6, 49);
  setServo(7, 58);
  setServo(8, 121);
  setServo(9, 113);
  setServo(10, 118);
  setServo(11, 73);
  delay (velo1);
  setServo(9, 113);
  setServo(10, 138);
  setServo(11, 61);
  delay (velo1);
  setServo(9, 156);
  setServo(10, 147);
  setServo(11, 39);
  delay (velo1);
  setServo(9, 155);
  setServo(10, 122);
  setServo(11, 54);
  delay (velo1);
  setServo(3, 25);
  setServo(4, 33);
  setServo(5, 141);
  delay (velo1);
  setServo(3, 67);
  setServo(4, 42);
  setServo(5, 119);
  delay (velo1);
  setServo(3, 67);
  setServo(4, 62);
  setServo(5, 107);
  delay (velo1);
  setServo(0, 155);
  setServo(1, 122);
  setServo(2, 54);
  setServo(3, 50);
  setServo(4, 58);
  setServo(5, 121);
  setServo(6, 67);
  setServo(7, 62);
  setServo(8, 107);
  setServo(9, 130);
  setServo(10, 122);
  setServo(11, 59);
  //delay (velo1);
}
void greating() {
  setServo(0, 130);
  setServo(1, 133);
  setServo(2, 52);
  delay (velo1);
  setServo(0, 130);
  setServo(1, 133);
  setServo(2, 180);
  delay (velo1);
  setServo(0, 150);
  setServo(1, 133);
  setServo(2, 180);
  delay (velo1);
  setServo(0, 62);
  setServo(1, 133);
  setServo(2, 180);
  delay (300);
  setServo(0, 150);
  setServo(1, 133);
  setServo(2, 180);
  delay (300);
  setServo(0, 62);
  setServo(1, 133);
  setServo(2, 180);
  delay (300);
  setServo(0, 150);
  setServo(1, 133);
  setServo(2, 180);
  delay (300);
  setServo(0, 62);
  setServo(1, 133);
  setServo(2, 180);
  delay (300);
  setServo(0, 130);
  setServo(1, 133);
  setServo(2, 180);
  delay (300);
  setServo(0, 130);
  setServo(1, 122);
  setServo(2, 59);
  delay (velo1);
}

Tienes el típico problema de unir varios programas con delays, no funcionara, debes utilizar la función milis(). En documentación hay varios ejemplos.

Saludos

Graaacias PeterKantTropus . Lo pruebo.