Anuncio TOP B1 Mensaje

Colapsar

Anuncio TOP B4 Mensaje (Mobile)

Colapsar

Anuncio

Colapsar
No hay anuncio todavía.

Problema programación tiempos de ejecución

Colapsar
X
 
  • Filtrar
  • Tiempo
  • Mostrar
Limpiar Todo
nuevos mensajes

  • Problema programación tiempos de ejecución

    Para manejar la ruta de mi robot a traves de 2 motores DC controlados por un L298N he realizado varios void que luego introduzco en el void loop() para que sigan un bucle.
    Mi problematica es que cuando introduzco estos void en el void setup, al añadir el tiempo de ejecucion al traves de la funcion delay() pues no se me activa niguno, no hace caso.
    Pero por separado si funcionan
    Os dejo el ejemplo de mi programacion, para que veais que tengo distintos vois creados: void Adelante(), void Atras, void Izquierda(), void Derecha(), void parar();

    Código:
    //MOTOR B
    int IN3 = 7;
    int IN4 = 4;
    //MOTOR A
    int IN1 = 2;
    int IN2 = 3;
    
    void setup()
      {
      //MOTOR B
      pinMode (IN3, OUTPUT);
      pinMode (IN4, OUTPUT);
      //MOTOR A
      pinMode (IN1, OUTPUT);
      pinMode (IN2, OUTPUT);
    }
    
    void Derecha()
    {
      
      
      // Motor B
      digitalWrite(IN3, LOW);
      digitalWrite(IN4, LOW);
      analogWrite(IN3, 200);
    
      
      //MOTOR A
      digitalWrite(IN1, HIGH);
      digitalWrite(IN2, LOW);
      analogWrite(IN1, 200);
    
    }
    
    void Adelante()
    {
      
      
      // Motor B
      digitalWrite(IN3, HIGH);
      digitalWrite(IN4, LOW);
      analogWrite(IN3, 200);
    
      
      //MOTOR A
      digitalWrite(IN1, HIGH);
      digitalWrite(IN2, LOW);
      analogWrite(IN1, 200);
    
    }
    
    void Atras()
    {
      
      
      // Motor B
      digitalWrite(IN3, LOW);
      digitalWrite(IN4, HIGH);
      analogWrite(IN3, 200);
    
      
      //MOTOR A
      digitalWrite(IN1, LOW);
      digitalWrite(IN2, HIGH);
      analogWrite(IN1, 200);
    
    }
    
    void Izquierda()
    {
      
      
      // Motor B
      digitalWrite(IN3, HIGH);
      digitalWrite(IN4, LOW);
      analogWrite(IN3, 200);
    
      
      //MOTOR A
      digitalWrite(IN1, LOW);
      digitalWrite(IN2, LOW);
      analogWrite(IN1, 200);
    
    }
    
    void Parar()
    {
      
      
      // Motor B
      digitalWrite(IN3, LOW);
      digitalWrite(IN4, HIGH);
      analogWrite(IN3, 200);
    
      
      //MOTOR A
      digitalWrite(IN1, LOW);
      digitalWrite(IN2, HIGH);
      analogWrite(IN1, 200);
    
    }
    
    void loop() {
      Adelante ();
     delay (2000);
     Atras ();
     delay (2000);
     Derecha ();
     delay (1000);
     Izquierda ();
     delay (1000);
     Parar ();
     delay (4000);
    }
    De esta forma no ocurre nada, únicamente funcionan los motores a una velocidad hacia delante y ya, no cumple la rutina creada en el void loop().

    ¿Puede ser problema del delay?

  • #2
    Buenas.
    Si, es el delay, tienes un problema de concepto.
    La función delay(); pausa el programa, no estás enviando pulso alguno, conecta los jumpers para que estén alimentados los pines ENB y ENA y prueba.

    Pero en el caso de que quieres controlar la velocidad utiliza millis().
    Un ejemplo: https://www.arduino.cc/en/Tutorial/BlinkWithoutDelay

    Comentario


    • #3
      Buenas, no tengo conectados los pines ENA y ENB porque tenia problemas con el L289N.
      No me regulaban bien la velocidad de giro.
      Tengo que aprender esa programacion con millis() porque se me atraganta.
      Simplemente quiero hacer con mi programacion lo siguiente:
      que vaya hacia delante X tiempo, luego hacia la izquierda, luego derecha... pero no consigo hacerlo con dicha funcion...
      El ejemplo que me has mandado me dejas lagunas... si pudieras echarme una mano con un ejemplo de mi programacion..
      Un saludo

      Comentario


      • #4
        Hola de nuevo, me retracto con lo dicho anteriormente, la función PWM se mantiene en uso y envía pulsos cuando estás usando delay.

        Como dijiste que por separa si funcionan creía que las funciones estaban bien. Pues me equivocaba, ahí es donde reside el problema.

        Te has confundido, has creado las funciones para controlar el driver con 6 pines, pero lo controlas con 4 pines.
        Para que funcione tienes 3 opciones:
        1. Necesitas usar 2 salidas más que sean PWM del arduino para que controlen los pines ENA y ENB y así controlar la velocidad , en las funciones serán los analogWrite(IN4, 200) y analogWrite(IN5, 200) por ejemplo.
        2. Eliminar todos los analogWrite y alimentar a 5V los EN, sin controlar velocidad.
        3. Modificar las funciones, los pines de salida del Arduino para que sean todos PWM y alimentar a 5V los EN para así controlar la velocidad, como en el siguiente condigo


        Código:
        const byte IN[4] = {3, 5, 6, 9};
        
        void setup()
        {
          //MOTOR B
          pinMode(IN[2], OUTPUT);
          pinMode(IN[3], OUTPUT);
          //MOTOR A
          pinMode(IN[0], OUTPUT);
          pinMode(IN[1], OUTPUT);
        }
        
        void Derecha()
        {
          // Motor B
          digitalWrite(IN[2], 200);
          analogWrite(IN[3], LOW);
          
          //MOTOR A
          digitalWrite(IN[1], LOW);
          analogWrite(IN[0], 200);
        }
        
        void Adelante()
        {
          // Motor B
          digitalWrite(IN[2], LOW);
          analogWrite(IN[3], 200);
          
          //MOTOR A
          digitalWrite(IN[1], LOW);
          analogWrite(IN[0], 200);
        }
        
        void Atras()
        {
          // Motor B
          digitalWrite(IN[2], 200);
          analogWrite(IN[3], LOW);
          
          //MOTOR A
          digitalWrite(IN[1], 200);
          analogWrite(IN[0], LOW);
        }
        
        void Izquierda()
        {
          // Motor B
          digitalWrite(IN[2], LOW);
          analogWrite(IN[3], 200);
        
          //MOTOR A
          digitalWrite(IN[1], 200);
          analogWrite(IN[0], LOW);
        }
        
        void Parar()
        {
          // Motor B
          digitalWrite(IN[2], LOW);
          analogWrite(IN[3], LOW);
        
          //MOTOR A
          digitalWrite(IN[1], LOW);
          analogWrite(IN[0], LOW);
        }
        
        void loop() {
          Adelante ();
          delay (2000);
          Atras ();
          delay (2000);
          Derecha ();
          delay (1000);
          Izquierda ();
          delay (1000);
          Parar ();
          delay (4000);
        }
        Ten en cuenta que le provocas un cambio brusco al motor al cambiar de sentido de giro, te recomiendo usar la función parar() durante unos milisegundos(depende de la inercia que lleve) entre cambios de sentido.

        Te adjunto como seria usando millis con el programa que diseñe para grafcet.
        Espero que todo esto te haya ayudado.
        Archivos Adjuntos

        Comentario


        • #5
          Muchas gracias, disculpa la tardanza en contestar.
          Un saludo

          Comentario

          Anuncio Footer B3 Mensaje

          Colapsar

          Anuncio Footer B5 Mensaje (Mobile) 300x600

          Colapsar
          Trabajando...
          X