Otros expertos en ARDUINO y C++, ayuda por favor.

  1. #1
    ForoParalelo: Miembro Avatar de vicentincoconut
    Registro
    17 dic, 14
    Mensajes
    845
    Me gusta (Dados)
    100
    Me gusta (Recibidos)
    228

    expertos en ARDUINO y C++, ayuda por favor.

    Pues eso, señores, me he metido en el apasionante mundo del Arduino(suputamadre) y estoy un poco agobiado, debo decir que no tengo ni idea de lenguaje C y todo lo que voy haciendo es por el metodo de prueba y error y leer mucho.

    Al grano, estoy moviendo un motor paso a paso con un driver y me ayudo de la libreria ACCELSTEPPER para que los movimientos sean mas suaves,el funcionamiento del programa consiste en que el motor partiendo de cero va a la posicion A de ahi va a la posicion B y vuelve a A. El problema que tengo es que si durante el movimiento de A-B o de B-A pulso el paro de emergencia (seta)no hace caso hasta que no llega a su destino, me he dado cuenta que es por la funcion "runToPosition" que por lo visto es un bucle y no se como hacer que salga de ahi. Bueno si alguien os dejo el codigo y si podeis echarme una mano os lo agradecere muchisimo.

    Soy novato, no os burleis mucho shurs!.




    #include <AccelStepper.h>

    // Defino el stepper y los pines que uso


    AccelStepper stepper1(1,13,11);





    #define fcretro 4
    #define seta 2
    #define fcavance 8
    #define automatico 12

    float potvel; //Variable lectura potenciometro velocidad
    int potavance; //Variable lectura potenciometro posicion izquierda
    int potretro; //Variable lectura potenciometro posicion izquierda
    int Kauto= 0;
    int manual=A5;


    void setup() {
    Serial.begin(9600); //iniciar puerto serie

    // velocidad maxima y aceleracion
    stepper1.setMaxSpeed(potvel);
    stepper1.setAcceleration(8000);


    pinMode(fcretro, INPUT);
    pinMode(seta, INPUT);
    pinMode(fcavance, INPUT);
    pinMode(automatico, INPUT);
    pinMode(manual,INPUT);


    }

    void loop() {



    if (digitalRead(automatico)== HIGH) {
    delay(3000);
    if (digitalRead(automatico)==HIGH) {
    Kauto= HIGH;}
    Serial.println ("auto");}



    if (digitalRead(fcavance)== HIGH || digitalRead(seta)== HIGH || digitalRead(manual)==HIGH) {Kauto=LOW; }


    potvel=analogRead(A0); //Lectura potenciómetro velocidad
    potvel = map(potvel, 0, 1023, 3000, 20000); //Establecemos la posicion paro en avance
    stepper1.setMaxSpeed(potvel);


    while (digitalRead(manual)== HIGH && digitalRead(seta)==LOW) {

    Serial.println("Manual");
    if (digitalRead(fcretro)==0) { potvel==0;
    stepper1.move(-100);
    stepper1.stop(); // Stop as fast as possible: sets new target
    stepper1.run();
    }
    }

    if (digitalRead(fcretro)== HIGH) {stepper1.setCurrentPosition(0);}

    while ((Kauto)== LOW && digitalRead(seta)==LOW && digitalRead(fcretro)==LOW) {

    Serial.println("noAUTOM"); //no lo uso de momento
    if (digitalRead(fcretro)==0) {/*sign= -1;*/ potvel==0;
    stepper1.move(-100);
    stepper1.stop(); // Stop as fast as possible: sets new target
    stepper1.run();
    }
    }

    if (digitalRead(fcretro)== HIGH) {stepper1.setCurrentPosition(0);}



    // Ahora empieza el ciclo AUTOMATICO
    while ( (Kauto) ==HIGH && digitalRead(seta)== LOW) {
    //AVANCE
    potavance=analogRead(A1); //Lectura potenciómetro posicion avance
    potavance = map(potavance, 0, 1023, 12500, 13524); //Establecemos la posicion paro en avance



    if (digitalRead(fcavance)== HIGH || digitalRead(seta)== HIGH || digitalRead(manual)==HIGH) {Kauto=LOW; Serial.println ("fcavance"); }
    stepper1.moveTo(potavance);
    while (stepper1.distanceToGo() !=0 && digitalRead(seta)==LOW && Kauto== HIGH)
    {

    potvel=analogRead(A0); //Lectura potenciómetro velocidad
    potvel = map(potvel, 0, 1023, 1800, 3500); //Establecemos la velocidad antes entre 1800 y 3500
    stepper1.setMaxSpeed(potvel);
    if (digitalRead(fcavance)== HIGH || digitalRead(seta)== HIGH || digitalRead(manual)==HIGH) {Kauto=LOW; Serial.println ("Kautolow"); }
    stepper1.runToPosition();

    }

    if (digitalRead(fcavance)== HIGH || digitalRead(seta)== HIGH || digitalRead(manual)==HIGH) {Kauto=LOW; Serial.println ("Kautolow"); }
    //RETROCESO
    potretro=analogRead(A2); //Lectura potenciómetro posicion retroceso
    potretro = map(potretro, 0, 1023, 4500, 3489); //Establecemos la posicion paro en retroceso
    stepper1.moveTo(potretro);
    if (digitalRead(fcavance)==HIGH) Kauto=LOW;
    while (stepper1.distanceToGo()!= 0 && digitalRead(seta)==LOW && Kauto==HIGH )
    {
    if (digitalRead(fcavance)==HIGH) Kauto=LOW;
    potvel=analogRead(A0); //Lectura potenciómetro velocidad
    potvel = map(potvel, 0, 1023, 1800, 3500);
    stepper1.setMaxSpeed(potvel);
    if (digitalRead(fcavance)== HIGH || digitalRead(seta)== HIGH || digitalRead(manual)==HIGH) {Kauto=LOW; Serial.println ("Kautolow"); }
    stepper1.runToPosition();

    }
    if (digitalRead(fcavance)== HIGH || digitalRead(seta)== HIGH || digitalRead(manual)==HIGH) {Kauto=LOW; Serial.println ("Kautolow"); }
    }
    }

  2. #2
    ForoParalelo: Miembro Avatar de marck
    Registro
    31 ago, 14
    Ubicación
    Madrid
    Mensajes
    3,555
    Me gusta (Dados)
    1489
    Me gusta (Recibidos)
    575
    Cita Iniciado por vicentincoconut Ver mensaje
    El mensaje está oculto porque el usuario está en tu lista de ignorados.
    Pues eso, señores, me he metido en el apasionante mundo del Arduino(suputamadre) y estoy un poco agobiado, debo decir que no tengo ni idea de lenguaje C y todo lo que voy haciendo es por el metodo de prueba y error y leer mucho.

    Al grano, estoy moviendo un motor paso a paso con un driver y me ayudo de la libreria ACCELSTEPPER para que los movimientos sean mas suaves,el funcionamiento del programa consiste en que el motor partiendo de cero va a la posicion A de ahi va a la posicion B y vuelve a A. El problema que tengo es que si durante el movimiento de A-B o de B-A pulso el paro de emergencia (seta)no hace caso hasta que no llega a su destino, me he dado cuenta que es por la funcion "runToPosition" que por lo visto es un bucle y no se como hacer que salga de ahi. Bueno si alguien os dejo el codigo y si podeis echarme una mano os lo agradecere muchisimo.

    Soy novato, no os burleis mucho shurs!.




    #include <AccelStepper.h>

    // Defino el stepper y los pines que uso


    AccelStepper stepper1(1,13,11);





    #define fcretro 4
    #define seta 2
    #define fcavance 8
    #define automatico 12

    float potvel; //Variable lectura potenciometro velocidad
    int potavance; //Variable lectura potenciometro posicion izquierda
    int potretro; //Variable lectura potenciometro posicion izquierda
    int Kauto= 0;
    int manual=A5;


    void setup() {
    Serial.begin(9600); //iniciar puerto serie

    // velocidad maxima y aceleracion
    stepper1.setMaxSpeed(potvel);
    stepper1.setAcceleration(8000);


    pinMode(fcretro, INPUT);
    pinMode(seta, INPUT);
    pinMode(fcavance, INPUT);
    pinMode(automatico, INPUT);
    pinMode(manual,INPUT);


    }

    void loop() {



    if (digitalRead(automatico)== HIGH) {
    delay(3000);
    if (digitalRead(automatico)==HIGH) {
    Kauto= HIGH;}
    Serial.println ("auto");}



    if (digitalRead(fcavance)== HIGH || digitalRead(seta)== HIGH || digitalRead(manual)==HIGH) {Kauto=LOW; }


    potvel=analogRead(A0); //Lectura potenciómetro velocidad
    potvel = map(potvel, 0, 1023, 3000, 20000); //Establecemos la posicion paro en avance
    stepper1.setMaxSpeed(potvel);


    while (digitalRead(manual)== HIGH && digitalRead(seta)==LOW) {

    Serial.println("Manual");
    if (digitalRead(fcretro)==0) { potvel==0;
    stepper1.move(-100);
    stepper1.stop(); // Stop as fast as possible: sets new target
    stepper1.run();
    }
    }

    if (digitalRead(fcretro)== HIGH) {stepper1.setCurrentPosition(0);}

    while ((Kauto)== LOW && digitalRead(seta)==LOW && digitalRead(fcretro)==LOW) {

    Serial.println("noAUTOM"); //no lo uso de momento
    if (digitalRead(fcretro)==0) {/*sign= -1;*/ potvel==0;
    stepper1.move(-100);
    stepper1.stop(); // Stop as fast as possible: sets new target
    stepper1.run();
    }
    }

    if (digitalRead(fcretro)== HIGH) {stepper1.setCurrentPosition(0);}



    // Ahora empieza el ciclo AUTOMATICO
    while ( (Kauto) ==HIGH && digitalRead(seta)== LOW) {
    //AVANCE
    potavance=analogRead(A1); //Lectura potenciómetro posicion avance
    potavance = map(potavance, 0, 1023, 12500, 13524); //Establecemos la posicion paro en avance



    if (digitalRead(fcavance)== HIGH || digitalRead(seta)== HIGH || digitalRead(manual)==HIGH) {Kauto=LOW; Serial.println ("fcavance"); }
    stepper1.moveTo(potavance);
    while (stepper1.distanceToGo() !=0 && digitalRead(seta)==LOW && Kauto== HIGH)
    {

    potvel=analogRead(A0); //Lectura potenciómetro velocidad
    potvel = map(potvel, 0, 1023, 1800, 3500); //Establecemos la velocidad antes entre 1800 y 3500
    stepper1.setMaxSpeed(potvel);
    if (digitalRead(fcavance)== HIGH || digitalRead(seta)== HIGH || digitalRead(manual)==HIGH) {Kauto=LOW; Serial.println ("Kautolow"); }
    stepper1.runToPosition();

    }

    if (digitalRead(fcavance)== HIGH || digitalRead(seta)== HIGH || digitalRead(manual)==HIGH) {Kauto=LOW; Serial.println ("Kautolow"); }
    //RETROCESO
    potretro=analogRead(A2); //Lectura potenciómetro posicion retroceso
    potretro = map(potretro, 0, 1023, 4500, 3489); //Establecemos la posicion paro en retroceso
    stepper1.moveTo(potretro);
    if (digitalRead(fcavance)==HIGH) Kauto=LOW;
    while (stepper1.distanceToGo()!= 0 && digitalRead(seta)==LOW && Kauto==HIGH )
    {
    if (digitalRead(fcavance)==HIGH) Kauto=LOW;
    potvel=analogRead(A0); //Lectura potenciómetro velocidad
    potvel = map(potvel, 0, 1023, 1800, 3500);
    stepper1.setMaxSpeed(potvel);
    if (digitalRead(fcavance)== HIGH || digitalRead(seta)== HIGH || digitalRead(manual)==HIGH) {Kauto=LOW; Serial.println ("Kautolow"); }
    stepper1.runToPosition();

    }
    if (digitalRead(fcavance)== HIGH || digitalRead(seta)== HIGH || digitalRead(manual)==HIGH) {Kauto=LOW; Serial.println ("Kautolow"); }
    }
    }
    El paro de emergencia hazlo por interrupciones, te va a requerir un poco más de esfuerzo entenderlo si no tienes ni idea de programar ni de informática en general pero es la mejor ssolución para problemas de ese estilo. Básicamente las interrupciones son lineas que cuando sucede un evento (en tu caso botón pulsado), interrumpe la ejecución de un programa para ejecutar lo que tu hayas puesto que ejecute cuando pase ese evento, y luego sigue con la ejecucion normal del programa hasta que suceda una nueva interrupción.

    Si finalmente decides tomar esta solución y tienes algún problema coméntamelo.

  3. #3
    ForoParalelo: Miembro Avatar de vicentincoconut
    Registro
    17 dic, 14
    Mensajes
    845
    Me gusta (Dados)
    100
    Me gusta (Recibidos)
    228
    Gracias Shur, he estado leyendo sobre las interrupciones y me parece que lo probare.

  4. #4
    ForoParalelo: Miembro Avatar de pedriko
    Registro
    03 oct, 16
    Mensajes
    122
    Me gusta (Dados)
    6
    Me gusta (Recibidos)
    2
    Prueba chupando primero la punta del ratón

  5. #5
    Al lidl Avatar de Musulpole
    Registro
    01 nov, 15
    Ubicación
    En la pole
    Mensajes
    3,264
    Me gusta (Dados)
    3020
    Me gusta (Recibidos)
    881
    ¿No había un programa para arduino que sólo tenías que poner bloques?
    Edit: Visualino
    Última edición por Musulpole; 10/12/2016 a las 23:15

  6. #6
    ForoParalelo: Miembro Avatar de mawer
    Registro
    13 dic, 16
    Mensajes
    4
    Me gusta (Dados)
    0
    Me gusta (Recibidos)
    0
    las interrupciones son la clave, si no te salen puedo ayudarte

Permisos de publicación

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