Mi servo motor se queda atascado

Hola, estoy haciendo un programa sobre una caja musical en Arduino Uno
Uso un sensor HC-SR04 a una distancia menor a 30cm esto activará mi pista y encenderá mi servomotor que empezará en 90° y después avanzará de 2° en 2° hasta llegar a 0°, de 0° irá aumentando también de 2° en 2° hasta llegar a 180°, quedando en bucle, todo de forma individual ya funciona
Mi problema es que a la hora de juntar los programas, sólo funciona el sensor y la pista, pero mi servomotor se queda atascado sin realizar nada, ya hice una prueba de forma individual y si funciona mi servomotor, sólo es cuando uno el programa
Si alguien puedes ayudarme a corregir este programa se lo agradecería demasiado
Este es mi programa (la pista esta recortada porque es demasiado texto)

#include <Servo.h>

Servo servoMotor;

const int trigPin = 9;
const int echoPin = 10;
const int tonePin = 11;
const int servoPin = 6;
int angulo = 90;
bool objetoDetectado = false;
bool servoActivado = false;
unsigned long tiempoActivacion = 0;

void setup() {
  servoMotor.attach(servoPin);
  servoMotor.write(angulo);
  delay(1000);

  pinMode(trigPin, OUTPUT);
  pinMode(echoPin, INPUT);
  pinMode(tonePin, OUTPUT);
}

void loop() {
  int distancia = medirDistancia();
  if (distancia < 30 && !servoActivado) {
    servoActivado = true;
    objetoDetectado = true;
    tiempoActivacion = millis();
    PlayMusic();
    girarServo();
  }

  if (servoActivado && millis() - tiempoActivacion > 96000) {
    servoMotor.detach();
    servoActivado = false;
  }

  delay(100);
}

int medirDistancia() {
  digitalWrite(trigPin, LOW);
  delayMicroseconds(2);
  digitalWrite(trigPin, HIGH);
  delayMicroseconds(10);
  digitalWrite(trigPin, LOW);
  long tiempo = pulseIn(echoPin, HIGH);
  int distancia = tiempo * 0.034 / 2;
  return distancia;
}

void PlayMusic() {
  tone(tonePin, 493, 479.46380625);
  delay(532.7375625);
  delay(2.9761875);
  tone(tonePin, 391, 158.03555625);
  delay(175.5950625);
  delay(2.9761875);
  tone(tonePin, 440, 158.03555625);
  delay(175.5950625);
  delay(2.9761875);
  tone(tonePin, 493, 479.46380625);
  delay(532.7375625);
  delay(2.9761875);
  tone(tonePin, 440, 158.03555625);
  delay(175.5950625);
  delay(2.9761875);
  tone(tonePin, 440, 318.74968125);
  delay(354.1663125);
  delay(2.9761875);
  tone(tonePin, 440, 158.03555625);
  delay(175.5950625);
  delay(2.9761875);
}

void girarServo() {
  servoMotor.attach(servoPin);
  for (angulo = 90; angulo >= 0; angulo -= 2) {
    servoMotor.write(angulo);
    delay(15);
  }

  while (millis() - tiempoActivacion < 96000) {
    for (angulo = 0; angulo <= 180; angulo += 2) {
      servoMotor.write(angulo);
      delay(15);
    }

    for (angulo = 180; angulo >= 0; angulo -= 2) {
      servoMotor.write(angulo);
      delay(15);
    }
  }
}

Su publicacion se MUEVE a su ubicacion actual ya que es mas adecuada.

Conecta el servo al pin 9 y el trigger a otro pin. El 6 estaría bien

1 Like

El parámetro de la función delay(), los milisegundos, es unsigned long (uint32_t) por lo que poner números con decimales, que serán truncados, es en vano.
Lo mismo ocurre con el parámetro duración de la función tone()

Si el servo se tiene que mover mientras se ejecuta PlayMusic() no puedes usar delay() porque nada puede ejecutarse mientras tanto entonces debes usar millis() y hacer que mientras se ejecuta una nota se controle el servo.

Por otro lado, los datos de pin, nota y duración para la función tone() e incluso la duración de cada "delay" puedes guardarlos en una array y reproducirlos con un lazo for()

1 Like