Lcd y motor paso a paso

Hola : estoy comandando un motor paso a paso y el problema que tengo es que al mismo tiempo quiero imprimir una variable que va cambiando en un LCD. Cuando intento hacer esto debido al tiempo que tarda el LCD en imprimir el motor se ralentiza. Alguien me puede dar una idea de como hacerlo ?? yo ve visto que las impresoras 3d lo hacen , o la solución es usar dos arduinos ??
 
Hola !! gracias por tu respuesta !! hice todo sin delay, probé de hacer andar el motor junto con leds destellando a diferentes tiempo y todo bárbaro, pero cuando quiero imprimir el lcd me hace como un corte el motor. En un rato cuando llegue a casa subo lo que hice. Muchas gracias
 
C++:
#include <Wire.h>
#include <LiquidCrystal_I2C.h>
LiquidCrystal_I2C lcd(0x27, 20, 4);



unsigned long interval1 = 1000;
unsigned long interval2 = 1;
unsigned long interval3 = 500;
unsigned long previousMillis1;
unsigned long previousMillis2;
unsigned long previousMillis3;

int led1 = 13;
int led2 = 2;
int dir = 5;
int pulso = 4;
bool state1 = false;
bool state2 = false;
bool state3 = false;

void debug(String text)
{
   Serial.print(millis());
   Serial.print('\t');
   Serial.println(text);
}

void setup() {
   Serial.begin(9600);
   previousMillis1 = millis();
   previousMillis2 = millis();
   pinMode(led1, OUTPUT);
   pinMode(led2, OUTPUT);
   pinMode(pulso, OUTPUT);
   pinMode(dir, OUTPUT);

   lcd.begin();
   lcd.backlight();
}

void loop() {
   unsigned long currentMillis = millis();
   digitalWrite (dir, HIGH);
  
   // Gestionar el desbordamiento
   if ((unsigned long)(currentMillis - previousMillis1) >= interval1)
   {
      action1();
      previousMillis1 = millis();
   }
   if ((unsigned long)(currentMillis - previousMillis2) >= interval2)
   {
      action2();
      previousMillis2 = millis();
   }
   if ((unsigned long)(currentMillis - previousMillis3) >= interval3)
   {
      action3();
      previousMillis3 = millis();
   }

}

void action1()
{
   state1 = !state1;
   if (state1)  digitalWrite (led1, HIGH);
   if (!state1) digitalWrite (led1, LOW);
}

void action2()
{
     state2 = !state2;
   if (state2)  digitalWrite (pulso, HIGH);
   if (!state2) digitalWrite (pulso, LOW);
   }

void action3()
   {
   state3 = !state3;
   if (state3)  digitalWrite (led2, HIGH);
   if (!state3) digitalWrite (led2, LOW);
                
   //lcd.clear();
   //lcd.setCursor(7,0 );
   //lcd.print("A");
   }
Ese es el codigo que estoy probando, asi anda bien pero cuando en action3() cuando las barras para imprimir en el lcd siento como una quedada en el motor.
 
Ese es el problema de las bibliotecas ped#$%@& del LCD. Son funciones bloqueantes. Tratá de usar otra biblioteca de funciones de LCS y no lo que viene con Arduino. Acá hay una, probá y fijate si vá mejor:
Voy a probar ..... gracias
Ese código que has escrito dá poco menos que asco.
Donde aprendiste las estructuras de selección ?? Por carta???
jajajaj me imagino !!!! soy novato en esto !!! perdon
Voy a probar ..... gracias

jajajaj me imagino !!!! soy novato en esto !!! perdon
Donde puedo sacar info para aprender ??
 

Dr. Zoidberg

Well-known-Papá Pitufo
Donde puedo sacar info para aprender ??
En la web hay PARVAS de información, pero para aprender tenes que empezar por NO copiar y pegar, sino por analizar y descubrir como funciona cada dispositivo y el contexto en el que se aplica esa operación. Y si no te alcanza con lo que encontrás, pues tendrás que aprender a diseñar tu propio código.
Ya lo dijo Bill Gates...."cualquiera puede programar"... y así nacieron quienes programan sin tener NPI de lo que deben hacer..y mucho menos cuando es real-time.
 
En la web hay PARVAS de información, pero para aprender tenes que empezar por NO copiar y pegar, sino por analizar y descubrir como funciona cada dispositivo y el contexto en el que se aplica esa operación. Y si no te alcanza con lo que encontrás, pues tendrás que aprender a diseñar tu propio código.
Ya lo dijo Bill Gates...."cualquiera puede programar"... y así nacieron quienes programan sin tener NPI de lo que deben hacer..y mucho menos cuando es real-time.
Aveces copio la estructura y pego para ser más rápido y hay cosas que seguramente quedan de más , pero siempre trato de entender lo que hago. Esto lo probé tratando de encontrar la solución al problema que tengo pensando que podía andar con esto de la multitarea y eliminado los delay.
 
Me parece que tendrias que replantearte bien lo que queres, en ese código podes reducir extremadamente todo. Hay cosas de mas, y cosas al "P2"...

Mejor dinos cuál es tu idea, lo que tienes (fisicamente), lo que pretendes que haga, etc.

O mejor tratá de estudiar un poco mas el lenguaje C o C++, asi entiendes lo que haces y lo que debes hacer. Prueba y prueba, usa simula, y si puedes prueba en la realidad, y dale vueltas y vueltas...
Evita el "Copy&Paste", que a veces crea mas confuciones que ayuda
 
Me parece que tendrias que replantearte bien lo que queres, en ese código podes reducir extremadamente todo. Hay cosas de mas, y cosas al "P2"...

Mejor dinos cuál es tu idea, lo que tienes (fisicamente), lo que pretendes que haga, etc.

O mejor tratá de estudiar un poco mas el lenguaje C o C++, asi entiendes lo que haces y lo que debes hacer. Prueba y prueba, usa simula, y si puedes prueba en la realidad, y dale vueltas y vueltas...
Evita el "Copy&Paste", que a veces crea mas confuciones que ayuda
Hola ! Lo que quiero hacer es que un motor paso a paso se mueva mientras se imprimen variables en un lcd , he leído y probado mucho pero no lo logro por eso recurro a ustedes. Por lo que he leído hay cosas que se solucionan con la multitarea y eso fue lo que traté de hacer pero por lo que ustedes ma dicen no es el camino correcto. Me podrías decir por donde buscar ??? Desde ya muchas gracias
 
Ya te lo hemos dicho varias veces, usa interrupciones para el manejo del motor. La multitarea esta buena, pero a veces algunas funciones demoran mas, haciendo desplazar un poco el conteo.
Por ejemplo, yo usé multitarea para un boton de encendido de un auto (el que usan los que no tienen llave), o incluso en una alarma
 
Yo creo que la librería es lenta por que de por si la LCD pide retardos para poder escribir y luego le sumamos el protocolo I2C, puede que usen delays y delays anidados.

hay que revisar la librería a detalle.
 
Ya te lo hemos dicho varias veces, usa interrupciones para el manejo del motor. La multitarea esta buena, pero a veces algunas funciones demoran mas, haciendo desplazar un poco el conteo.
Por ejemplo, yo usé multitarea para un boton de encendido de un auto (el que usan los que no tienen llave), o incluso en una alarma
Vos te referís a manejar el tiempo de pulso del motor paso a paso con interrupciones internas ??? Perdona mi ignorancia pero es la primera vez que hago un proyecto un poco complejo. Gracias
 
Apoyo el uso de interrupción para control del motor. Lo que haga falta para garantizar la velocidad máxima. Otras velocidades, por código.
 
Apoyo el uso de interrupción para control del motor. Lo que haga falta para garantizar la velocidad máxima. Otras velocidades, por código.
Vuelvo a decir que es la primera vez que intento hacer algo medianamente complejo, me estas hablando de las interrupciones internas ?? Muchas gracias por el consejo !!
 
Arriba