Pasar delay() a millis()
Resultados 1 al 2 de 2

Tema: Pasar delay() a millis()

  1. #1
    Fecha de ingreso
    01 jun, 17
    Mensajes
    13
    Downloads
    0
    Uploads
    0

    Predeterminado Pasar delay() a millis()



    En este Sketch tengo programado un robot que consta de 2 motores DC controlados por un L298N, un ultrasonido hcsr04 y un buzzer que pita si encuentra un obstaculo.
    El robot esta programado para que siga una ruta programada anteriormente con los DC y el L289N.
    La idea es que si encuentra un obstaculo, este se pare y emita sonido el buzzer y se encienda un LED, pero unicamente se para antes de que se inicien los motores, cuando estan en funcionamiento no para.


    ////////////// DECLARACION PIN MOTORES ////////////////////////
    ////////////////////////////////////////////
    //MOTOR B
    int IN3 = 5;
    int IN4 = 4;
    //MOTOR A
    int IN1 = 2;
    int IN2 = 3;
    //////////////////////////////////////
    //////////////////////////////////////

    //////////////// BUZZER /////////////////////////
    /////////////////////////////////////////////////
    const int pinBuzzer = 6;
    /////////////////////////////////////////
    ////////////////////////////////////////

    ////////////// HCSR04/////////////////////////////
    /////////////////////////////////////////////////
    long tiempo;
    int disparador = 9; // triger
    int entrada = 8; // echo
    float distancia;
    const int ledObstaculo = 26;
    ////////////////////////////////////


    void setup()
    {

    //////////////motor/////////////////////
    ////////////////////////////////////////
    //MOTOR B
    pinMode (IN3, OUTPUT);
    pinMode (IN4, OUTPUT);
    //MOTOR A
    pinMode (IN1, OUTPUT);
    pinMode (IN2, OUTPUT);
    ////////////////////////////////////////
    ///////////////////////////////////////


    ////////////hcsr04////////////////////
    /////////////////////////////////////
    pinMode(disparador, OUTPUT);
    pinMode(entrada, INPUT);
    Serial.begin(9600);

    ///////////////////////////////////////
    /////////////////////////////////////
    }

    void Derecha() //El robot gira en sentido derecho.
    {
    // Motor B
    digitalWrite(IN4, LOW);
    analogWrite(IN3, 200);
    //MOTOR A
    digitalWrite(IN1, LOW);
    digitalWrite(IN2, LOW);
    }
    void Izquierda() //El robot gira en sentido izquierdo.
    {
    // Motor B
    digitalWrite(IN3, LOW);
    digitalWrite(IN4, LOW);
    //MOTOR A
    digitalWrite(IN2, LOW);
    analogWrite(IN1, 200);
    }


    void Adelante() //El robot va hacia adelante.
    {
    // Motor B
    digitalWrite(IN4, LOW);
    analogWrite(IN3, 255);
    //MOTOR A
    digitalWrite(IN2, LOW);
    analogWrite(IN1, 255);
    }

    void Atras() //El robot va hacia atrás.
    {
    // Motor B
    digitalWrite(IN3, LOW);
    analogWrite(IN4, 255);
    //MOTOR A
    digitalWrite(IN1, LOW);
    analogWrite(IN2, 255);
    }


    void Parar() //Robot para.
    {
    // Motor B
    digitalWrite(IN3, LOW);
    digitalWrite(IN4, LOW);
    //MOTOR A
    digitalWrite(IN1, LOW);
    digitalWrite(IN2, LOW);
    }


    ////////////////////////////////// RUTA DE PRUEBA ////////////////////////////////////
    /////////////////////////////////////////////////////////////////////////////////////


    void loop()
    {
    MedidaDistancia();
    if(distancia <=30)
    {
    SonidoLedObstaculo();
    delay(1000);
    }
    else
    {
    RutaMotor1();

    }

    delay(2000);

    }



    //////////////Void Ruta Motor 1 motores/////////////////////
    //////////////////////////////////////////////


    void RutaMotor1()
    {
    Adelante();
    delay(5000); //tiempo que esta funcionando Adelante
    Parar();
    delay(2000); // tiempo que esta parado hasta la siguiente funcion

    Derecha();
    delay(1000); //tiempo que esta funcionando Derecha
    Parar();
    delay(2000); // tiempo que esta parado hasta la siguiente funcion

    Adelante();
    delay(5000);
    Parar();
    delay(2000);

    Derecha();
    delay(2000);
    Parar();
    delay(2000);

    Adelante();
    delay(5000);
    Parar();
    delay(2000);

    Izquierda();
    delay(1000);
    Parar();
    delay(2000);

    Adelante();
    delay(5000);
    Parar();
    delay(2000);

    Parar();
    delay(1000);

    }
    ////////////////// VOID MEDID DISTANCIA hcsr04 //////////////////////
    ////////////////////////////////////////////////////////////////////
    void SonidoLedObstaculo()
    {
    if(distancia <= 30){

    {
    digitalWrite(ledObstaculo,HIGH); //Si el sensor mide una distancia más pequeña o igual a 30cm LED ON
    ObstaculoBuzzer();
    delay(1000);
    }

    delay(1000);
    }
    else{
    digitalWrite(ledObstaculo,LOW); //Sinó, apaga el LED
    }
    }

    void MedidaDistancia()
    {
    // lanzamos un pequeño pulso para activar el sensor
    digitalWrite(disparador, HIGH);
    delayMicroseconds(10);
    digitalWrite(disparador, LOW);

    // medimos el pulso de respuesta
    tiempo = (pulseIn(entrada, HIGH)/2); // dividido por 2 por que es el
    // tiempo que el sonido tarda
    // en ir y en volver
    // ahora calcularemos la distancia en cm
    // sabiendo que el espacio es igual a la velocidad por el tiempo
    // y que la velocidad del sonido es de 343m/s y que el tiempo lo
    // tenemos en millonesimas de segundo
    distancia = float(tiempo * 0.0343);
    // y lo mostramos por el puerto serie una vez por segundo
    Serial.println(distancia);
    delay(1000);
    }
    void ObstaculoBuzzer()
    {
    //generar tono de 440Hz durante 1000 ms
    tone(pinBuzzer, 150);
    delay(550);
    tone(pinBuzzer, 50);
    delay(700);
    tone(pinBuzzer, 325);
    delay(250);
    tone(pinBuzzer, 50);
    delay(600);
    tone(pinBuzzer, 670);
    delay(200);
    tone(pinBuzzer, 1125);
    delay(200);
    tone(pinBuzzer, 2500);
    delay(800);
    noTone(pinBuzzer);
    }
    ///////////////////////////////////////////////////////////
    ///////////////////////////////////////////////////////////

    Esto creo que se debe a la programacion realizada con los delay().
    La solución sería realizar el mismo sketch pero con millis(), cosa que soy incapaz de realizar.

    A continuacion pongo el sketch unicamente de los motores, realizada la programacion con delay(), que es lo que hay que pasar a millis().
    Pero que soy incapaz...


    /////////////// DECLARACION PIN MOTORES ////////////////
    ///////////// PARA EL CONTROL DEL MOTOR CON L298N ///////////

    //MOTOR B
    int IN3 = 5;
    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(IN4, LOW);
    analogWrite(IN3, 200);
    //MOTOR A
    digitalWrite(IN1, LOW);
    digitalWrite(IN2, LOW);
    }
    void Izquierda()
    {
    // Motor B
    digitalWrite(IN3, LOW);
    digitalWrite(IN4, LOW);
    //MOTOR A
    digitalWrite(IN2, LOW);
    analogWrite(IN1, 200);
    }


    void Adelante()
    {
    // Motor B
    digitalWrite(IN4, LOW);
    analogWrite(IN3, 255);
    //MOTOR A
    digitalWrite(IN2, LOW);
    analogWrite(IN1, 255);
    }

    void Atras()
    {
    // Motor B
    digitalWrite(IN3, LOW);
    analogWrite(IN4, 255);
    //MOTOR A
    digitalWrite(IN1, LOW);
    analogWrite(IN2, 255);
    }


    void Parar()
    {
    // Motor B
    digitalWrite(IN3, LOW);
    digitalWrite(IN4, LOW);
    //MOTOR A
    digitalWrite(IN1, LOW);
    digitalWrite(IN2, LOW);
    }


    ////////////////////////////////// RUTA DE MOTOR ////////////////////////////////////
    //////////////////////////////// RUTA DE PRUEBA ////////////////////////////////
    void loop() {
    Adelante();
    delay(5000); //tiempo que esta funcionando Adelante
    Parar();
    delay(2000); // tiempo que esta parado hasta la siguiente funcion

    Atras();
    delay(5000); //tiempo que esta funcionando Atras
    Parar();
    delay(2000);

    Derecha();
    delay(5000); //tiempo que esta funcionando Dereccha
    Parar();
    delay(2000);

    Izquierda(); //tiempo que esta funcionando Izquierda
    delay(5000);
    Parar();
    delay(2000);

    Parar();
    delay(1000);

    }

    ///////////////////////////////////////////////////////////////////////////////
    //////////////////////////////////////////////////////////////////////////////


  2. #2
    Fecha de ingreso
    24 feb, 15
    Mensajes
    15
    Downloads
    0
    Uploads
    0

    Predeterminado

    Saludos, a priori lo que veo es un problema de concepto, tu robot hace:

    Mido distancia.

    Hay un obstáculo? Si - Emito sonido.

    Hay un obstáculo? No – Realizo la ruta que me han marcado, como dentro de la función de hacer la ruta no tengo la función de detectar obstáculo sigo a lo mío hasta finalizarla y volver a realizar de nuevo el bucle.

    Hay muchas formas de resolver ese problema.
    Un ejemplo:
    Código:
    byte VectorDireccion [4] = {1, 3, 2, 3};
      int VectorTiempo [4] = {3000, 1000, 3000, 1000};
    
      for (byte i = 0; i < 4; i++) {
    
        byte LecturaVectorDireccion = VectorDireccion [i];
    
        switch (LecturaVectorDireccion) {
          case 0: FuncionDireccion1();
            break;
          case 1: FuncionDireccion2();
            break;
          case 2: FuncionDireccion3();
            break;
        }
    
        int LecturaVectorTiempo = VectorTiempo [i];
    
        unsigned long TiempoActual = millis();
        unsigned long TiempoEspera = TiempoActual + LecturaVectorTiempo;
    
        while (TiempoActual < TiempoEspera) {
          FuncionDeteccion();
          TiempoActual = millis();
          delay(10);
        }
    
      }

Temas similares

  1. Pasar HMI a PC (Siemens WInCC)
    Por Dvd27 en el foro SCADA
    Respuestas: 1
    Último mensaje: 20/11/2017, 08:27
  2. Pasar programa de PLC c20 a PLC C28k
    Por c.mir09 en el foro Omron
    Respuestas: 5
    Último mensaje: 05/07/2017, 00:45
  3. Problemas al pasar programa de una HMI NT631C a una NS10
    Por migueldelamora en el foro Omron
    Respuestas: 4
    Último mensaje: 28/06/2017, 11:28
  4. Como pasar datos de un plc a exel en un pc ¡¡AYUDA¡¡
    Por paconeotest en el foro OPC / ActiveX
    Respuestas: 4
    Último mensaje: 16/07/2013, 18:44

Permisos de publicación

  • No puedes crear nuevos temas
  • No puedes responder temas
  • No puedes subir archivos adjuntos
  • No puedes editar tus mensajes
  •