es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Cómo configurar un servo para girar solo una vez bajo una condición

Quiero hacer una puerta usando un servo de 360 grados y un sensor ultrasónico, aquí uso condicionales if-else. Cuando las condiciones ultrasónicas son >= 10 cm, el servo debe girar una vez hacia la derecha durante 5 segundos, y viceversa. Pero cuando alcanza la condición >= 10 cm, donde el servo continúa girando sin detenerse, ¿cómo hacer que se detenga en 1 rotación? y también necesito los datos de distancia del sensor ultrasónico para mostrar.

Soy principiante en esto, estaré muy agradecido por la ayuda.

Este es mi código:

“`cpp
#include <wire.h>
#include <servo.h> // Biblioteca de Servo
#define echoPin 3 // Pin de triguero, pin de eco
#define triggerPin 4

int tiempo;
int distancia;
int distancia_final;
Servo servo;

void setup()
{
Serial.begin(9600);
pinMode(triggerPin, OUTPUT);
pinMode(echoPin, INPUT);
}

void loop()
{
digitalWrite(triggerPin, LOW);
delayMicroseconds(2);
digitalWrite(triggerPin, HIGH);
delayMicroseconds(10);
digitalWrite(triggerPin, LOW);
tiempo = pulseIn(echoPin, HIGH);

distancia = tiempo * 0.034 / 2;

Serial.print(distancia);
Serial.print(" CM");
delay(100);
servo.attach(9);

if(distancia <= 10)
{
servo.write(2000);
delay(5000);
}
else if(distancia >= 30)
{
servo.write(1000);
delay(5000);
}
else
{
servo.write(1500);
delay(1000);
}
servo.detach();
}
“`</servo.h></wire.h>

Tags:  , ,

Answer

  1. Avatar for davy.ai

    Solución

    Para hacer que el servo se detenga en una rotación cuando se alcance la condición >= 10cm, podemos agregar un bucle while que compruebe si la posición actual del servo es mayor o igual a la posición inicial más 360 grados. Una vez que el servo ha girado 360 grados, saldrá del bucle while y se desconectará del pin.

    Aquí está el código modificado:

    #include <wire.h>
    #include <servo.h>
    
    #define echoPin 3
    #define triggerPin 4
    
    int waktu;
    int jarak;
    int hasiljarak;
    Servo servo;
    
    void setup() {
      Serial.begin(9600);
      pinMode(triggerPin, OUTPUT);
      pinMode(echoPin, INPUT);
    }
    
    void loop() {
      digitalWrite(triggerPin, LOW);
      delayMicroseconds(2);
      digitalWrite(triggerPin, HIGH);
      delayMicroseconds(10);
      digitalWrite(triggerPin, LOW);
      waktu = pulseIn(echoPin, HIGH);
    
      jarak = waktu * 0.034 / 2;
    
      Serial.print(jarak);
      Serial.print(" CM");
      delay(100);
      servo.attach(9);
    
      if(jarak<=10) {
        int startPos = servo.read();
        servo.write(2000);
        delay(5000);
    
        // check if servo has rotated 360 degrees
        while (servo.read() >= startPos + 360) {}
    
        servo.detach();
      }
      else if(jarak>=30) {
        int startPos = servo.read();
        servo.write(1000);
        delay(5000);
    
        // check if servo has rotated 360 degrees
        while (servo.read() >= startPos + 360) {}
    
        servo.detach();
      }
      else {
        servo.write(1500);
        delay(1000);
        servo.detach();
      }
    }
    

    Para mostrar los datos de distancia del sensor ultrasónico, puedes usar la función Serial.print(), como se muestra en el código anterior. Los datos de distancia se imprimirán en el monitor serial, al que se puede acceder haciendo clic en el botón Serial Monitor en el IDE de Arduino (o presionando Ctrl + Shift + M).</servo.h></wire.h>

Comments are closed.