problemi con Interrupt

Sto cercando di rimodernare un mio robottino e volevo mettere i due IR collegati all'ingresso interrupt 0 e 1 per il blocco dei motori con ostacolo avanti o dietro.
il listato iniziale è questo

// Test Wall_E
#include "Ultrasonic.h"
#include <Wire.h>
#include <Arduino.h>
#include <OneWire.h>
#include <Servo.h>

// Servocomandi
Servo dxservo;    // crea l'oggetto servo braccio destro
Servo suservo;    // crea l'oggetto servo movimento verticale testa
Servo girservo;   // crea l'oggetto servo movimento orizzontale testa
int pos1 = 10;     // variable e posizione iniziale del servo
int pos2 = 80;    // variable e posizione iniziale del servo
int pos3 = 75;    // variable e posizione iniziale del servo

//faretto e led1 retro
int lux = 0;
int led1 = 4;
int led2 = 18;
int led3 = 19;

//motore A
int enA = 6;
int in1 = 7;
int in2 = 8;
//motore B
int enB = 11;
int in3 = 12;
int in4 = 13;

// variabili lettura Ultrasonic
Ultrasonic ultrasonic(16, 17);
int val = 0;
int valdx = 0;
int valsx = 0;

// variabili gestione interrupt
int irav;
int irrt;
int blok;
int bat;
int a = 0;

//===*****============================*****====================
void setup()
{
  Serial.begin(9600);
  Wire.begin();
  attachInterrupt(0, vai_indietro, FALLING);
  attachInterrupt(1, vai_avanti, FALLING);

  dxservo.attach(5);    // dichiaro il servo collegato al pin 5
  suservo.attach(9);   // dichiaro il servo collegato al pin 10
  girservo.attach(10);  // dichiaro il servo collegato al pin 11

  dxservo.write(pos1);  //metto il servo nella posizione iniziale
  suservo.write(pos2);  //metto il servo nella posizione iniziale
  girservo.write(pos3); //metto il servo nella posizione iniziale

  //imposta i pin
  pinMode (enA, OUTPUT);
  pinMode (in1, OUTPUT);
  pinMode (in2, OUTPUT);
  pinMode (enB, OUTPUT);
  pinMode (in3, OUTPUT);
  pinMode (in4, OUTPUT);

  pinMode (led1, OUTPUT);  // led1 frontale
  pinMode (led2, OUTPUT);  // led1 retro
  pinMode (2, INPUT);    // gestione interrupt avanti
  pinMode (3, INPUT);    // gestione interrupt retro

  digitalWrite(enA, LOW);
  digitalWrite(enB, LOW);
  led1OnOff();

}
//===*****============================*****====================
void loop()
{
  Serial.println(" LOOP_LOOP ");
  Serial.println(" LOOP_LOOP ");
  batteria();
  delay(3000);
}
//===*****============================*****====================
void vai_indietro() {
  Serial.println(" INTERRUPT AVANTI ");
  delay(1500);
  noInterrupts();
  irav = digitalRead(2);
  irrt = digitalRead(3);
  if (irav < 1 && irrt > 0) {
    alt();
    retro();
  }
  if (irav < 1 && irrt < 1) {
    blocco();
  }
  delay(3000);
}

//===*****============================*****====================
void vai_avanti() {
  Serial.println(" INTERRUPT RETRO ");
  delay(1500);
  noInterrupts();
  irav = digitalRead(2);
  irrt = digitalRead(3);
  if (irav > 0 && irrt < 1) {
    alt();
    go();
  }
  if (irav < 1 && irrt < 1) {
    blocco();
  }
}
//===*****============================*****====================
void go() {
  Serial.println(" MOTORI AVANTI ");
  digitalWrite(enA, 100);
  digitalWrite(enB, 100);
  digitalWrite(in1, LOW);
  digitalWrite(in2, HIGH);
  digitalWrite(in3, LOW);
  digitalWrite(in1, HIGH);
  Serial.println(" IMPOSTATO MOTORI AVANTI ");
  delay(100);
}
//===*****============================*****====================
void retro() {
  Serial.println(" MOTORI INDIETRO ");
  digitalWrite(enA, 50);
  digitalWrite(enB, 50);
  digitalWrite(in1, HIGH);
  digitalWrite(in2, LOW);
  digitalWrite(in3, HIGH);
  digitalWrite(in1, LOW);
  Serial.println(" IMPOSTATO MOTORI INDIETRO ");
  delay(1500);
  Serial.println(" FINE MANOVRA ");
  delay(500);
}
//===*****============================*****====================
void alt() {
  //alt i motori
  Serial.println("ALT MOTORI");
  digitalWrite (in1, LOW);
  digitalWrite (in2, LOW);
  digitalWrite (in3, LOW);
  digitalWrite (in4, LOW);
  Serial.println(" == MOTORI FERMI == ");
  delay(1000);
}
//===*****============================*****====================
void blocco() {
  //alt i motori
  Serial.println("ALT MOTORI");
  digitalWrite (in1, LOW);
  digitalWrite (in2, LOW);
  digitalWrite (in3, LOW);
  digitalWrite (in4, LOW);
  Serial.println(" == NON HO SPAZIO == ");
  delay(1000);
}
//=======================================================================================
void led1OnOff() {
  //accendo o alt luce in relazione luminosità ambiente
  lux = analogRead(0);
  if (lux < 40) {
    digitalWrite (led1, HIGH); Serial.println("poca luce, accendo il faro ");
  }
  else {
    digitalWrite (led1, LOW); Serial.println("luce ok, il faro non serve ");
  }
}
//=======================================================================================
void batteria() {
  //accendo o alt luce in relazione luminosità ambiente
  bat = analogRead(1);
  if (bat < 970) {
    Serial.println("BATTERIA BASSA ");
    alt();
  }
}
//=======================================================================================

e mi sembrava fosse semplice implementarli ma poi facendo un test con un semplice cartoncino ho visto questo

luce ok, il faro non serve 
 LOOP_LOOP 
 LOOP_LOOP 
 LOOP_LOOP 
 LOOP_LOOP 
 INTERRUPT AVANTI 
ALT MOTORI
 == MOTORI FERMI == 
 MOTORI INDIETRO 
 IMPOSTATO MOTORI INDIETRO 
 FINE MANOVRA 
 INTERRUPT AVANTI 
ALT MOTORI
 == MOTORI FERMI == 
 MOTORI INDIETRO 
 IMPOSTATO MOTORI INDIETRO 
 FINE MANOVRA 
 LOOP_LOOP 
 LOOP_LOOP 
 LOOP_LOOP 
 LOOP_LOOP 
 LOOP_LOOP 
 LOOP_LOOP 
 INTERRUPT AVANTI 
 INTERRUPT AVANTI 
 LOOP_LOOP 
 LOOP_LOOP 
 LOOP_LOOP 
 LOOP_LOOP 
 LOOP_LOOP 
 LOOP_LOOP

avevo una doppia risposta e nonostante l'interrupt fosse in FALLING togliendo il cartoncino mi dava due segnali per fortuna senza comandi.
il LOOP_LOOP l'ho messo per evidenziarmi dove mi trovo.
Qualcuno sa dirmi dove sbaglio?

Ciao! Non so se sia questo il problema!??? Ma le variabili globali "esterne alle funzioni" che usi nelle funzioni interrupt, la guida dice che bisogna dichiararle volatile, volatile int miaVariabile;