mismo codigo comportamiento difrente UNO vs Nano

Buenas. tengo este codigo para hacer algo como esto:

solo que le agrego una sirena con el buzzer.

#include <Servo.h>

const int trigPin = 5;
const int echoPin = 6;
const int led = 13;
const int buzzer = 8;
long duration, distance;

Servo servo;

/***   Setup  ***/
void setup()
{
  Serial.begin(9600);
  servo.attach(12);

  pinMode(buzzer, OUTPUT);
  pinMode(trigPin, OUTPUT);
  pinMode(echoPin, INPUT);
  pinMode(led, OUTPUT);
}

/***   Loop  ***/
void loop()
{

  digitalWrite(trigPin, LOW);
  delayMicroseconds(2);
  digitalWrite(trigPin, HIGH);
  delayMicroseconds(10);
  digitalWrite(trigPin, LOW);

  duration = pulseIn(echoPin, HIGH);
  distance = (duration / 2) / 29.1;

  if (distance < 20 && distance > 2)
  {
    Serial.println("Alarma");
    servo.write(0);
    sirena();
  }
  else
  {
    servo.write(90);
  }
  noTone(buzzer);
  delay(100);
}

void sirena()
{
  for (int i = 40; i < 1000; i++)
  {
    delay(1);
    tone(buzzer, i);
  }
  delay(500);
  for (int i = 1000; i > 40; i--)
  {
    delay(1);
    tone(buzzer, i);
  }
}

en el Uno todo funciona correctamente pero en Nano es como si tuviera un delay entre vuelta y vuelta del loop().

en este video de 20" se ve lo que digo

¿alguna idea?

Bueno, parece que tiene que ver con la alimentación.

Tengo un Otto con 4 pilas AA que solo anda bien el servo si alimento el shield con esas pilas soldadas al shield, ni por usb ni por bat 9v anda. No entiendo, pero al menos es una luz en el camino ....