Aviso

El foro está en modo de sólo lectura.

Control de Motor paso a paso con nextion + arduino

Más
6 años 6 meses antes #759 por juan
Buenos dias,
quiero controlar un motor paso a paso con arduino y nextion, creo un boton con 2 estados en la nextion y esta es la unica manera que consigo que pare el motor, lo que pasa es que cuando ejecuto el codigo, el motor va lento y funciona mal, si quito la linea " int apagar=myNextion.getComponentValue("page1.bt0");" que esta dentro del while, el motor funciona bien pero no me lee el boton de la nextion cuando le doy parar, hay alguna manera para controlar un motor paso a paso distinta? o le falla algo a mi codigo, porque cuando pongo la linea para leer el estado del boton de la nextion se realientiza el bucle y si no pongo un while no me funciona, no se si me podriais hechar una mano, Gracias.





void motorOn(){
int apagar=myNextion.getComponentValue("page1.bt0");
if(valor4 != apagar){


Serial.print("valor del motor es: ");
Serial.println(apagar);
valor4=apagar;
if(valor4==1)
{
while(valor4==1){
digitalWrite(DIR,LOW);//Cambio de dirección
digitalWrite(ENA,HIGH);// HIGH enciende motor - LOW apaga motor "deja sin tensión"
digitalWrite(PUL,HIGH);//HIGH enciende giro del motor - LOW para giro del motor pero mantiene tensión
delayMicroseconds(1000);
digitalWrite(PUL,LOW);// Este PULL ha de ser inverso al de arriba, ya que enciende y apaga el pulso en 50 ms dando paso asi al bucle for
delayMicroseconds(1000);
int apagar=myNextion.getComponentValue("page1.bt0");

if(apagar==0){
break;
}

}
}

if(valor4==0)
{
digitalWrite(DIR,HIGH);//Cambio de dirección
digitalWrite(ENA,LOW);// HIGH enciende motor - LOW apaga motor "deja sin tensión"
digitalWrite(PUL,HIGH);//HIGH enciende giro del motor - LOW para giro del motor pero mantiene tensión
delayMicroseconds(100);
digitalWrite(PUL,LOW);// Este PULL ha de ser inverso al de arriba, ya que enciende y apaga el pulso en 50 ms dando paso asi al bucle for
delayMicroseconds(100);
}





}
}
Más
6 años 6 meses antes #760 por Jose Luis
En primer lugar debéis de acostumbraros a poner los codigos completos, ya que a veces hay que mirar fuera de los trozos que nos enviáis.

En segundo lugar si eliminamos el comando de leer el botón, tienes dos temporizaciones que temporizan 2 milisegundos, el decir, el tiempo que tarda en ejecutarse ese bucle es de aproximadamente 2 milisegundos (vamos descartar las instrucciones que para este caso es despreciable). Bien, si ahora le ponemos el botón, que esta leyendo constantemente la pantalla, que son varios bytes y que seguro lo estas haciendo a 9600bps, que tiempo te esta añadiendo al bucle? Segun mis cuentas, enviar un byte, mas el bit de parada y en de arranque hara que casi te lleve 1 ms enviar un byte, y tienes que enviar varios y recibir varios, yo no creo que baje de 10 milisegundos el tiempo que gestión de ese comando, si no es mas.

Te quiero decir con esto, que el motor va lento por que estas haciendo una comunicación de baja velocidad lo que te esta causando que el tiempo de ese bucle se multiplique y por eso va lento.

Posibilidades? No has puesto el código completo ni has dicho que arduino usas. Si usas un mega intentar enviar y recibir datos a 115200, eso haría que fuera mejor, pero no se si lo suficiente para ir bien. Si es un uno, poner 57600 e intentar el serial de hardware del arduino.

Otra opción, escuchar tu el puerto serie y que si llega un comando de marcha o paro atenderlo, sino llega, no te causaría retardo en el bucle.

un saludo.
Tiempo de carga de la página: 0.100 segundos
Gracias a Foro Kunena