Principiante necesita ayuda.

la estoy cagando en algo y no se en que, este programa es para una controladora de servos ssc32 , si la controlador envía un "." es que el servo ha llegado a la posición que tenia que llegar, pero si aun se mueve la controlador envía un "+"

de momento casi esta ,pero algo esta mal por que a veces no espera a que el servo termine de moverse y le manda que se mueva a otro lado .

alguna idea?

si le subo el tiempo de retardo entonces funciona, pero eso no me vale por que entonces es que a los servos les da tiempo de llegar pero no por que funcionen los if

byte contador;

int completado;
int incompleto;
int inByte;

int led8 = 8;//indica que ya ha parado
int led9 = 9;//indica que continua

void setup() {
   if (Serial.available() > 0 ) {  // si hay datos en el serial...
  
  int inByte = Serial.read(); {}}
  
     
  
  pinMode(led8,OUTPUT);
  pinMode(led9,OUTPUT);
 
  
  
Serial.begin(9600);
}

void loop() {
  int request();

 
  //request();
  if(completado == 1 and contador == 0){
  Serial.println("             activando uno ");
  //digitalWrite(led8,LOW); digitalWrite(led9,LOW);
  contador = 1;
  completado = 0;
  primero();

 }
  else{
    Serial.println(" iniciando retardo");
    retardo();
  
}


  
  request();
  if (completado == 1  and contador == 1){
  Serial.println("     activando dos 222222222222");
  //digitalWrite(led8,HIGH); digitalWrite(led9,LOW);
  contador = 2;
  completado = 0;
  segundo();
 
 
}
else{
Serial.println(" iniciando retardo");
retardo();}
 
 

request();
  if(completado  ==1  and contador == 2){
    Serial.println(" reiniciando");
  //digitalWrite(led8,HIGH); digitalWrite(led9,LOW); 
contador = 0;
completado =0;
primero();

}
else{
Serial.println(" iniciando retardo");
retardo();}

}
  
 
  

  


void primero(){
  Serial.println("#14 p100 t500");
   Serial.println(" iniciando movimiento uno ");
}
  
  void segundo(){
    Serial.println("#14 p1700 t500");
  Serial.println("iniciando movimiento 2");
}
  
    
  

  void retardo() //aqui se puede incluir un void para que mire el infrarojo
{
  for(int i = 0; i < 100; i++)
  {//leerPulsador();  // leemos el pulsador cada milisegundo, asi nos aseguramos que si estamos dentro un efecto, lo detectaremos
  //Serial.println("retardo");

    delay(1);//no se por que sin el delay no funciona
  }}
   
  
  
 




 
 void request(){
   
   
  Serial.println ("Q14");
  
   if (Serial.available() > 0 ) {  // si hay datos en el serial...
  
  int inByte = Serial.read(); {}
   
    switch (inByte) {
      case '.':
      Serial.println("parada detectada");
      completado = 1;
      digitalWrite(led8,HIGH);
      delay(50);
      digitalWrite(led8,LOW);
      
      break;
      
      case '+':
      Serial.println("      movimiento detectado       ");
      digitalWrite(led9,HIGH);
      delay(50);
      digitalWrite(led9,LOW);
      //incompleto =1;
      //Serial.println("#0 p500 t2000");
      break;

}
}
}
  1. No puedes usar este lenguaje en el foro

la estoy cagando en algo

espero no repitas esa expresión. Lee las normas del foro!!

  1. Muchas cosas mal ubicadas en tu sketch.
    primero en el setup no puedes poner
if (Serial.available() > 0 ) {  // si hay datos en el serial...
  
  int inByte = Serial.read(); {}}
  ....................

y luego defines

Serial.begin(9600)

esta línea debe ir antes y

if (Serial.available() > 0 ) {

debe ir en el loop, pero luego veo que lo tienes en la función request() asi que no lo incluyo.

  1. No se si es un error porque el otro dia lo debatimos el us de and en los if.
    if (completado == 1 and contador == 0){
    para mi debe ir

if (completado == 1 && contador == 0){

asi que modifico, ojo no pruebo el funcionamiento, te lo dejo a ti para que lo hagas.

byte contador;

int completado;
int incompleto;
int inByte;

int led8 = 8;//indica que ya ha parado
int led9 = 9;//indica que continua

void setup() {
  
  pinMode(led8,OUTPUT);
  pinMode(led9,OUTPUT);
  
  Serial.begin(9600);
}

void loop() {
  

  request();

  if (completado == 1 && contador == 0){
     Serial.println("             activando uno ");
    //digitalWrite(led8,LOW); digitalWrite(led9,LOW);
    contador = 1;
    completado = 0;
    primero();
 }
 else{
    Serial.println(" iniciando retardo");
    retardo();
 }

  request();
  if (completado == 1  && contador == 1){
     Serial.println("     activando dos 222222222222");
     //digitalWrite(led8,HIGH); digitalWrite(led9,LOW);
     contador = 2;
     completado = 0;
     segundo();
  } else{
          Serial.println(" iniciando retardo");
          retardo();
     }
 
  request();
  if (completado  ==1  && contador == 2){
     Serial.println(" reiniciando");
     //digitalWrite(led8,HIGH); digitalWrite(led9,LOW); 
     contador = 0;
     completado =0;
     primero();
  } else {
            Serial.println(" iniciando retardo");
            retardo();}
    }
  
  void primero(){
      Serial.println("#14 p100 t500");
      Serial.println(" iniciando movimiento uno ");
  }
  
  void segundo(){
       Serial.println("#14 p1700 t500");
      Serial.println("iniciando movimiento 2");
  }
  
  void retardo() //aqui se puede incluir un void para que mire el infrarojo
  {
     for (int i = 0; i < 100; i++) {   
          //leerPulsador();  
          // leemos el pulsador cada milisegundo, asi nos aseguramos que si estamos dentro un 
          // efecto, lo detectaremos
          //Serial.println("retardo");

          delay(1);        //no se por que sin el delay no funciona
     }
  }
   
  void request(){
         Serial.println ("Q14");
         if (Serial.available() > 0 ) {  // si hay datos en el serial...
            int inByte = Serial.read(); {}
        
            switch (inByte) {
                 case '.':
                            Serial.println("parada detectada");
                            completado = 1;
                            digitalWrite(led8,HIGH);
                            delay(50);
                            digitalWrite(led8,LOW);
      
                            break;
      
                 case '+':
                            Serial.println("      movimiento detectado       ");
                            digitalWrite(led9,HIGH);
                            delay(50);
                            digitalWrite(led9,LOW);
                            //incompleto =1;
                            //Serial.println("#0 p500 t2000");
                            break;

            }
        }
}

Gracias, es la primera vez que me pongo a jugar con el serial.

Lo de and la verdad que lo hago por qué me es más fácil de acordarme que &&.

Luego el código tiene algunas cosas raras por que lo modificado 50 veces ya a ver si sonaba la flauta, antes los if eran

If completado ==1 && incompleto==0

Pero parece que aparte de que mi void request era mejorable .

Luego lo pruebo y pongo el resultado por sí alguno usa la ssc32 y le vale.

a ver, he realizado cambios, sigue pasando lo mismo, la idea es que no mueva el motor si el motor no esta parado, lo consigo a medias , hace el movimiento uno y 2 bien, esperando a tener la señal de completo y luego los hace otra vez mal, sin esperar a tener esa señal, el programa esta lleno de Serial:println para hacer diagnostico, pero yo no llego a ver que esta mal.

esto es lo que aparece por el serial:

Q14
 iniciando retardo
Q14
 iniciando retardo
Q14
 iniciando retardo
Q14
parada detectada
 iniciando retardo
Q14
parada detectada
 iniciando retardo
Q14
parada detectada
             activando uno 
1
#14 p100 t500
 iniciando movimiento uno 
Q14
 iniciando retardo
Q14
      movimiento detectado       
 iniciando retardo
Q14
      movimiento detectado       
 iniciando retardo
Q14
      movimiento detectado       
 iniciando retardo
Q14
parada detectada
 iniciando retardo
Q14
parada detectada
 iniciando retardo
Q14
parada detectada
     activando dos 222222222222
2
#14 p1700 t500
iniciando movimiento 2
Q14
parada detectada
reiniciando
0
#14 p100 t500
 iniciando movimiento uno 
Q14
      movimiento detectado       
 iniciando retardo
Q14
      movimiento detectado       
 iniciando retardo
Q14
      movimiento detectado       
 iniciando retardo
Q14
      movimiento detectado       
 iniciando retardo
Q14
parada detectada
 iniciando retardo
Q14
parada detectada
 iniciando retardo
Q14
parada detectada
             activando uno 
1
#14 p100 t500
 iniciando movimiento uno 
Q14
parada detectada
     activando dos 222222222222
2
#14 p1700 t500
iniciando movimiento 2
Q14
      movimiento detectado       
 iniciando retardo
Q14
      movimiento detectado       
 iniciando retardo
Q14
      movimiento detectado       
 iniciando retardo
Q14
      movimiento detectado       
 iniciando retardo
Q14
parada detectada
 iniciando retardo
Q14
parada detectada
 iniciando retardo
Q14
parada detectada
reiniciando
0
#14 p100 t500
 iniciando movimiento uno 
Q14
parada detectada
             activando uno 
1
#14 p100 t500
 iniciando movimiento uno 
Q14
      movimiento detectado       
 iniciando retardo
Q14
      movimiento detectado       
 iniciando retardo
Q14
      movimiento detectado       
 iniciando retardo
Q14
      movimiento detectado       
 iniciando retardo
Q14
parada detectada
 iniciando retardo
Q14
parada detectada
 iniciando retardo
Q14
parada detectada
     activando dos 222222222222
2
#14 p1700 t500
iniciando movimiento 2
Q14
parada detectada
reiniciando
0
#14 p100 t500
 iniciando movimiento uno 
Q14
      movimiento detectado       
 iniciando retardo
Q14
      movimiento detectado       
 iniciando retardo
Q14
      movimiento detectado       
 iniciando retardo
Q14
      movimiento detectado       
 iniciando retardo
Q14
parada detectada
 iniciando retardo
Q14
parada detectada
 iniciando retardo
Q14
parada detectada
             activando uno 
1
#14 p100 t500
 iniciando movimiento uno 
Q14
parada detectada
     activando dos 222222222222
2
#14 p1700 t500
iniciando movimiento 2
Q14
      movimiento detectado       
 iniciando retardo
Q14
      movimiento detectado       
 iniciando retardo
Q14
      movimiento detectado       
 iniciando retardo
Q14
      movimiento detectado       
 iniciando retardo
Q14
parada detectada
 iniciando retardo
Q14
parada detectada
 iniciando retardo
Q14
parada detectada
reiniciando
0
#14 p100 t500
 iniciando movimiento uno 
Q14
parada detectada
             activando uno 
1
#14 p100 t500
 iniciando movimiento uno 
Q14
      movimiento detectado       
 iniciando retardo
Q14
      movimiento detectado       
 iniciando retardo
Q14
      movimiento detectado       
 iniciando retardo
Q14
      movimiento detectado       
 iniciando retardo
Q14
parada detectada
 iniciando retardo
Q14
parada detectada
 iniciando retardo
Q14
parada detectada
     activando dos 222222222222
2
#14 p1700 t500
iniciando movimiento 2
Q14
parada detectada
reiniciando
0
#14 p100 t500
 iniciando movimiento uno 
Q14
      movimiento detectado       
 iniciando retardo

cuando dice iniciando retardo varias veces y luego iniciando movimiento la cosa esta bien, los motores completan su recorrido.

cuando apenas hay retardos entre un movimiento y otro es cuando no les deja completar su recorrido.

no entiendo que por cada vez que lo hace bien lo haga otra vez mal.

el codigo:

// el ssc manda "." si el movimiento esta completado
// si aun esta en curso manda ""+""
//con un delay de 50uS


//el problema es que al detctar movimiento no para,ordena el siguiente movimiento igualmente
int contador =0;


int completado;
int incompleto;
int inByte;

int led8 = 8;//indica que ya ha parado
int led9 = 9;//indica que continua

void setup() {
  
  
     
  
  pinMode(led8,OUTPUT);
  pinMode(led9,OUTPUT);
 
  
  // put your setup code here, to run once:
Serial.begin(9600);
}

void loop() {
  int request();

 
  request();
  if(completado == 1 and contador == 0){
  Serial.println("             activando uno ");
  contador++;
  Serial.println(contador);
  Serial.print(completado);
  completado = 0;
  primero();

 }
  else{
    Serial.println(" iniciando retardo");
    retardo();
  
}


  
  request();
  if (completado == 1  and contador == 1){
  Serial.println("     activando dos 222222222222");
  //digitalWrite(led8,HIGH); digitalWrite(led9,LOW);
  contador++; 
  Serial.println(contador);
  Serial.println(completado);
  completado = 0;
  segundo();
 
 
}
else{
Serial.println(" iniciando retardo");
retardo();}
 
 

request();
if(completado  ==1  and contador == 2){
    Serial.println("reiniciando");
  //digitalWrite(led8,HIGH); digitalWrite(led9,LOW); 
contador= 0;
Serial.println(contador);
Serial.println(completado);
completado =0;
primero();

}
else{
Serial.println(" iniciando retardo");
retardo();}

}
  
 
  

  


void primero(){
  Serial.println("#14 p100 t500"); //mueve el motor a la posicion uno
   Serial.println(" iniciando movimiento uno ");
}
  
  void segundo(){
    Serial.println("#14 p1700 t500");//mueve el motor a la posicion 2
  Serial.println("iniciando movimiento 2");
}
  
    
  

  void retardo() //aqui se puede incluir un void para que mire el infrarojo
{
  for(int i = 0; i < 100; i++)
  {//leerPulsador();  // leemos el pulsador cada milisegundo, asi nos aseguramos que si estamos dentro un efecto, lo detectaremos
  //Serial.println("retardo");
    delay(1);//no se por que sin el delay no funciona
  }}
   
  
  
 




 
 void request(){
   
   
  Serial.println ("Q14");
  delay(50);
  int inByte = Serial.read(); {}
   
    switch (inByte) {
      case '.':
      Serial.println("parada detectada");
      completado = 1;
      digitalWrite(led8,HIGH);
      delay(50);
      digitalWrite(led8,LOW);
      
      break;
      
      case '+':
      Serial.println("      movimiento detectado       ");
      digitalWrite(led9,HIGH);
      delay(50);
      digitalWrite(led9,LOW);
      break;

}
}

esto ("#14 p100 t500") es lo que le dice a la tarjeta que motor mover, a que posición y a que velocidad.

esto otro (Q14) se envía a la tarjeta para preguntarle si el movimiento se ha completado.

si el movimiento se ha completa la tarjeta da (".") de lo contrario da ("+")

bueno pues mirando los datos del monitor serial se me ocurrió una idea y parece que funciona.

creo un contador con las paradas que han aparecido , el problema es que si mientras mueve un motor y le llega la señal de parada una sola vez enviara el siguiente movimiento sin dejar que el anterior sea completado , así que he introducido un contador de paradas y una condición mas para que los movimientos se puedan llegar a realizar y de momento funciona.

gracias por la ayuda, aquí dejo el código por si le pudiera llegar a serle util a algún otro.

si veis algo que este mal o sea memorable y me lo hacéis sabe os estare agradecido.

// el ssc manda "." si el movimiento esta completado
// si aun esta en curso manda ""+""
//con un delay de 50uS


//el problema es que al detctar movimiento no para,ordena el siguiente movimiento igualmente
int contador =0;

int parada = 0;


int completado;
int incompleto;
int inByte;

int led8 = 8;//indica que ya ha parado
int led9 = 9;//indica que continua

void setup() {
  
  
     
  
  pinMode(led8,OUTPUT);
  pinMode(led9,OUTPUT);
 
  
  // put your setup code here, to run once:
Serial.begin(9600);
}

void loop() {
  int request();

 
  request();
  if(completado == 1 and contador == 0 and parada >=2){
  Serial.println("             activando uno ");
  contador++;
  Serial.println(contador);
  Serial.print(completado);
  completado = 0;
  primero();
  

 }
  else{
    Serial.println(" iniciando retardo");
    retardo();
  
}


  
  request();
  if (completado == 1  and contador == 1 and parada >=2){
  Serial.println("     activando dos 222222222222");
  //digitalWrite(led8,HIGH); digitalWrite(led9,LOW);
  contador++; 
  Serial.println(contador);
  Serial.println(completado);
  completado = 0;
  segundo();
  parada =0;

 
 
}
else{
Serial.println(" iniciando retardo");
retardo();}
 
 

request();
if(completado  ==1  and contador == 2 and parada >=2){
    Serial.println("reiniciando");
  //digitalWrite(led8,HIGH); digitalWrite(led9,LOW); 
contador= 0;
Serial.println(contador);
Serial.println(completado);
completado =0;
primero();
parada=0;

}
else{
Serial.println(" iniciando retardo");
retardo();}

}
  
 
  

  


void primero(){
  Serial.println("#14 p100 t500"); //mueve el motor a la posicion uno
   Serial.println(" iniciando movimiento uno ");
}
  
  void segundo(){
    Serial.println("#14 p1700 t500");//mueve el motor a la posicion 2
  Serial.println("iniciando movimiento 2");
}
  
    
  

  void retardo() //aqui se puede incluir un void para que mire el infrarojo
{
  for(int i = 0; i < 100; i++)
  {//leerPulsador();  // leemos el pulsador cada milisegundo, asi nos aseguramos que si estamos dentro un efecto, lo detectaremos
  //Serial.println("retardo");
    delay(1);//no se por que sin el delay no funciona
  }}
   
  
  
 




 
 void request(){
   
   
  Serial.println ("Q14");
  delay(50);
  int inByte = Serial.read(); {}
   
    switch (inByte) {
      case '.':
      Serial.println("parada detectada");
      completado = 1;
      parada++;
      digitalWrite(led8,HIGH);
      delay(50);
      digitalWrite(led8,LOW);
      
      break;
      
      case '+':
      Serial.println("      movimiento detectado       ");
      digitalWrite(led9,HIGH);
      delay(50);
      digitalWrite(led9,LOW);
      break;

}
}

Cuando veo un programa asi necesito preguntarte esto?
Puedes explicar en lo que se llama seudocódigo o bien en tus palabras que debes hacer.
Si recibo esto por el serial hago esto.
Si recibo lo otro hago esto otro... y bla bla bla.

No mires lo programado, dinos lo que esperas que haga el programa.
Repito.. no mires el programa.

Es para un robot.

Mover un servo, cuando el servo termine de moverse moverlo otra vez.

Al código seguro que le sobran cosas, esto es debido a que al no funcionar correctamente le iba añadiendo a ver si así si.

Ahora que ya funciona lo iré aligerando.

Empiezo y si el serial me dice que el servo esta parado lo pongo en marcha, le sumo uno al contador

Si el serial me dice que el servo ha parado y que el contador está a dos lo pongo en marcha otra vez y sumo uno

Si el serial me dice que el motor esta parado reseteo contador y muevo el motor otra vez, así entra en un bucle en el que el servo no para de moverse nunca y me permite comprobar que nunca manda la orden de moverse sin terminar el movimiento anterior.

Lo intente también haciendo que el código tenga en cuenta si el motor envia la señal de que aún se está moviendo pero esa parte la eliminé por innecesaria, ya que para funcionar correctamente sólo necesita saber que el servo ya completó su recorrido.

No se sí me he explicado como querías y todo lo bien que podría.