Problemas declaración variables en arduino

Buenas noches,

Soy nuevo en este foro y en el mundo de Arduino. Estoy empezando a realizar mis proyectos y después de semanas me he quedado estancado en el que estoy realizando ahora. Se trata de un manipulador 2D(viene a ser un brazo robotico)con placa Arduino Uno que se mueve con dos motores paso a paso. He diseñado una aplicación que mediante un sensor de color TC3200 y un electroiman clasifique una serie de bolas metálicas pintadas segun su color y las lleve a una cajita diferente mediante trayectorias diferentes.

El problema surge a la hora de implementar las diferentes variables de los pasos hechos por los motores. Anteriormente mediante scilab y interpolación de puntos de paso he obtenido dos cadenas de numero de pasos llamados npas_1 y npas_2, que depiendiendo del color seran unos o otros.

adjunto los archivos correspondientes!

Los archivos calculs() y maniobra_v1() se encargan de realizar el movimiento de lo motores. De primeras habia realizado 3 diferentes archivos de calculos y 3 de maniobra(para cada color) pero eso agotaba la memoria del arduino y era inviable. Mi cuestion es que haciendolo de esta forma(redefiniendo npas_1, y npas_2 cada vez me da error y no compila....). Tambien al inicializar las variables npas_1 e npas_2 en el cuerpo principal con valores aleatorios los motores solo hacen lo que pone en estas dos ultimas variables dichas, es decir en entrar en los diferentes case no canvian su valor....

Alguien sabria como poder redefinir npas_1 y npas_2 dependiendo del caso q le toque?

Muchas gracias y espero que entiendan mi duda!

MANIPULADOR_FINAL.ino (9.83 KB)

Adjunto todo el codigo de las funciones calculs y maniobra_V1.

void Calculs()
{
 int dnpas_1; // Nombre de passos en un tram de la llei de moviment.
 int dnpas_2; 

 for(int i=0; i<npunts-1; i++)
 {
   dnpas_1 =npas_1[i+1]-npas_1[i];
   dnpas_2 = npas_2[i+1]-npas_2[i];

   if (dnpas_1 > 0){    // Comprobació del signe per definir el sentit.
     s_1[i] = sentit_1;
   }
   else {
     s_1[i] = !sentit_1;
     dnpas_1 =-dnpas_1;
   }

   if (dnpas_2 > 0){    // Comprobació del signe per definir el sentit.
     s_2[i] = sentit_2;
   }
   else {
     s_2[i] = !sentit_2;
     dnpas_2=-dnpas_2;
   }

   if (dnpas_1 !=0) {    //Interval entre passos, motor 1.
     dt_1[i] = dt/dnpas_1;
   }
   else{
     dt_1[i]=1000000;
   }

   if (dnpas_2 !=0) {     //Interval entre passos, motor 2.
     dt_2[i] = dt/dnpas_2;
   }
   else{
     dt_2[i]=1000000;
   } 
 }
}



void Maniobra_V1()
{
digitalWrite(piu_led_vermell, LOW);
digitalWrite(piu_led_groc,LOW );  
digitalWrite(piu_led_verd, HIGH);

 unsigned long t_inicial; // Temps inicial d'un tram de la llei de moviment.
 unsigned long t_final;  // Temps final d'un tram de la llei de moviment.
 unsigned long t_1;
 unsigned long t_2;
 
 temps_so=micros();
 //digitalWrite(piu_brunzidor,brunzidor);
   
 for(int i=0; i<npunts-1; i++)
 { 
   if(perill) break; 
   digitalWrite(piu_sentit_1, s_1[i]);  // Introducció del sentit correcte.
   digitalWrite(piu_sentit_2, s_2[i]);

   t_inicial = micros();    // Temps inicial de l'interval.
   t_1 = t_inicial+dt_1[i];
   t_2 = t_inicial+dt_2[i];
   t_final = t_inicial + dt;     // Temps final de l'interval.

   while(micros()<t_final)
   {
     //Canvi_brunzidor();
     if(micros()>t_1)                   // Un pas de l'actuador 1.
     {
       digitalWrite(piu_pas_1, LOW);   
       digitalWrite(piu_pas_1, HIGH); 
       t_1=t_1+dt_1[i];
     }  
     if(micros()>t_2)                   // Un pas de l'actuador 2.
     {
       digitalWrite(piu_pas_2, LOW);
       digitalWrite(piu_pas_2, HIGH);
       t_2=t_2+dt_2[i];
     }
   }
 }
  // digitalWrite(piu_brunzidor, LOW);
}

Bueno, postea el código completo y si no cabe (+9000 caracteres lo adjuntas).
Si puedes postearlo usa tags. Te he pasado un privado con la explicación.
Asi se hace muy dificil seguirte. Esta por tramos no se que pertenece a que cosa.
Solo muestras rutinas y no vemos todo el código.

Desde ya post inicial.
No deberías dimensionar un array dentro de un switch case.

Alguien sabria como poder redefinir npas_1 y npas_2 dependiendo del caso q le toque?

Hacerlo dinámico basado en que criterio?
Tienes una ecuación?

Hola joanfqv

¿ Podrias poner el mensaje de error que te dá el compilador ?

Bueno a mi me sale esto:

error: 'Buscar_origen' was not declared in this scope

pero hice una modificación al comienzo con tus arrays.
Agrega la rutina buscar_origen y dime como va!

MANIPULADOR_FINAL.ino (11.8 KB)

Perdon, no adjunte ese fichero lo adjunto a continuación. Entiendo lo que has hecho pero digo como sabrá el programa cual coger? Segun el case?

Buscar_origen.ino (1.2 KB)

El programa lo determina usando color para determinar que fila usar.

En la definición de los multiarray quedaron 3 filas y 101 elementos. El compilador si permite el auto bound para filas pero no para columnas.

A mi me compila sin errores.

Archivo tiene mas de 9000 caracteres asi que esta adjunto.
Una nota que le da un poco de elegancia al código
En lugar de tener case para 0 a 2 usa esto

   switch (color) {
      case 0: //verde
      case 1: //blau
      case 2: //verde
              Calculs();
              Maniobra_V1();
              delay(500);
              digitalWrite(piu_electroiman,HIGH);
              delay(1000);
              Buscar_origen();
              break;
          
      case 3:
              digitalWrite(piu_electroiman,HIGH);
              delay(500);
              Buscar_origen();
          
          	  break;
     
    }

MANIPULADOR_FINAL.ino (13.1 KB)

Muchas gracias! lo he probado y compila solo que no mueve los motores....imanta la pieza y la desimanta despues de pasar calculs y maniobra pero sin moverse los motores

a ver..
tu código tenia dos variables repetidas

//int npas_1;
//int npas_2;

similares a tus array, sabías? Yo las comenté.

surbyte:
a ver..
tu código tenia dos variables repetidas

//int npas_1;

//int npas_2;




similares a tus array, sabías? Yo las comenté.

eso me di cuenta y lo eliminé, el problema es que al cargar el programa a mi arduino uno y correrlo, hace la lectura de color bien, enciende el electroiman pero no mueve los motores. Es decir el apartado de Calculs() y Maniobra() no los realiza. Se queda quieto y apaga el electroiman.

Mejor dicho, los motores se ponen a hacer pitidos como si de un r2d2 se tratara

Me llama la atención que con semejante programa que has escrito te hayas bloqueado con esto.
Una matriz como yo te configuré que guarda los datos en flash para no consumir RAM es solo eso.. un artilugio solo para no consumir RAM y que el programa pueda crecer en otros aspectos.
Pero pude equivocarme.
Pero que se hace cuando uno se equivoca? Se pone en ciertos lugares puntos de inspección.
Veamos

 for ( int i=0; i<npunts-1; i++) {
           char buffer[50];
           sprintf(buffer, "npas-1[%d][%3d] = %-3d npas-2[%d][%3d] = %-3d", color, i, npas_1[color][i], color, i, npas_2[color][i]);
           Serial.println(buffer); // esto imprimirá los valores que toma npas_1 y 2 cuando el ciclo for vaya cambiando
	   dnpas_1 = npas_1[color][i+1]-npas_1[color][i];
	   dnpas_2 = npas_2[color][i+1]-npas_2[color][i];

Agrega eso y mira si los valores salen de acuerdo al color determinado.

EDITO: cometí un error al accesar los datos que usan PROGMEM
debe ser asi

for ( int i=0; i<npunts-1; i++) {
     dnpas_1 = pgm_read_word(&npas_1[color][i+1])-pgm_read_word(&npas_1[color][i]);
     dnpas_2 = pgm_read_word(&npas_2[color][i+1])-pgm_read_word(&npas_2[color][i]);