Arduino y comunicacion serial

Hola a todos, tengo una super duda que espero me ayuden a resolver.

Tengo un sistema de un eje de libertad (un tornillo sin fin) que mueve una plataforma. El motor tiene un encoder incremental que uso para posicionar

El caso es que usando arduino y la comunicación serie he podido avanzar en un sentido desde una posición de referencia desde la que empiezo a contar. El problema es que cuando ingreso un numero y va a esa posición, después me es imposible ingresar otro numero por el monitor serie de arduino (o de cualquier otro terminal).

Resumiendo, puedo enviar un numero, pero no puedo ingresar el siguiente, tengo que cerrar el monitor serial, lo que involucra que el sistema regresa a su posición inicial sin siquiera lo ordene

les adjunto el código

Código:
//Salidas
int A = 8;
int B = 10;

//Entradas
int IN = 4;
//contador
unsigned long cont = 0;

//auxiliares
int valor_act;
int valor_ant;
int dir=0;
int aux=0;
char cadena[24];
int contador=0;
int i;


void setup()
{
  Serial.begin(9600);
  pinMode(A, OUTPUT);
  pinMode(B, OUTPUT);
  attachInterrupt(0, interrupcion, RISING);
}

void loop()
{
  noInterrupts();
  //Posicion a cero (solo se ejecuta una vez al iniciar)
  digitalWrite(A,LOW);
  digitalWrite(B,LOW);

  while(digitalRead(IN)){
    digitalWrite(A,LOW);
    digitalWrite(B,HIGH);
  }
  
  digitalWrite(B,LOW);
  digitalWrite(A,LOW);
  interrupts();
  
  while(1){
     if(Serial.available()){
        memset(cadena, 0, sizeof(cadena));
        while (Serial.available()>0){
          delay(5);
          cadena[contador]=Serial.read();
          contador++;
        }
        valor_act=atoi(cadena);
        contador=0;
        
        if(valor_act>valor_ant){
         aux=valor_act-valor_ant;
         for(i=0; i<aux;i++){
           cont=cont+16443;
         }
         dir=1;
        }
        if(valor_act<=valor_ant){
         aux=valor_ant-valor_act;
         for(i=0; i<=aux;i++){
           cont=cont+16443;
         }
         dir=2;
        }
       Serial.println(aux);
       Serial.println(cont);
       digitalWrite(13,LOW);
     }
     delay(500);

     while(cont>0){
       if(dir==1){
         digitalWrite(A,HIGH);
         digitalWrite(B,LOW);
       }
       if(dir==2){
         digitalWrite(A,LOW);
         digitalWrite(B,HIGH);
       }
     }
     digitalWrite(A,LOW);
     digitalWrite(B,LOW);
     dir=0;
     valor_ant=valor_act;
     
   }
  
  
}

void interrupcion()
{
  cont--;
}



les agradecería me pudieran ayudar
 
Última edición por un moderador:
Atrás
Arriba