Uso de array y Switch Case

Hola he hecho un programa para mover un vehiculo con dos motores PaP utilizando al Libreria AccelStepper. Para moverlo utilizo un teclado con 5 teclas ( adelante, atras, derecha, izquierda y Activar el movimiento) y cada una de ellas tiene asociado un caracter ( ejemplo adelante = 'A')
Cada tecla tiene asociada una función ( ejemplo: void adelante()). Utiiizo una array con ciclo for donde almacena la secuencia de teclas pulsadas, pues bien solo ejecuta la primera tecla que he pulsado, no se ver dónde está el error. Alguien me puede sugerir una solución?. A continuación copio el programa. Gracias.

#include <AccelStepper.h>
 #define HALFSTEP 4
//motor derecha
#define motorPin1 4 // Pin 1 en el pin IN1 del driver ULN2003
#define motorPin2 5 // Pin 2 en el pin IN2 del driver ULN2003
#define motorPin3 6 // Pin 3 en el pin IN3 del driver ULN2003
#define motorPin4 7 // Pin 4 en el pin IN4 del driver ULN2003

//motor izquierda
#define motorPin5 8 // Pin 1 en el pin IN1 del driver ULN2003
#define motorPin6 9 // Pin 2 en el pin IN2 del driver ULN2003
#define motorPin7 10 // Pin 3 en el pin IN3 del driver ULN2003
#define motorPin8 11 // Pin 4 en el pin IN4 del driver ULN2003
// Define dos objetos de motor paso a paso
AccelStepper stepper1 (HALFSTEP, motorPin1, motorPin3, motorPin2, motorPin4);
AccelStepper stepper2 (HALFSTEP, motorPin5, motorPin7, motorPin6, motorPin8);

//PARAMETROS MATRIZ
char matriz [30];
int i = 0; //contador de pulsos 

//asignación de pines de entrada a los pulsadores

int Pizquierda=A5;
int Padelante=A4;
int Pderecha=A2;
int Patras=A1; 
int Pborra=A0;
int Pactiva=A3;

 void setup () {
Serial.begin(9600);
stepper1. setSpeed ( 600 );
stepper1. setAcceleration ( 200 );//con aceleraciones superiores la rueda se atranca
stepper1. setMaxSpeed ( 1000 );
stepper2. setSpeed (600 );
stepper2. setAcceleration ( 200 );
stepper2. setMaxSpeed ( 1000 );
// 2048 pasos equivale a media vuelta

// PULSADORES
  pinMode(Pizquierda,INPUT);
  pinMode(Padelante,INPUT);
  pinMode(Pderecha,INPUT);
  pinMode(Patras,INPUT);
  pinMode(Pborra,INPUT);
  pinMode(Pactiva,INPUT);

}

 void loop () {

       
     //bucle matriz

                           Serial.print("i=");
                           Serial.println(i);
                           Serial.print("x=");
                           Serial.println(matriz[i]); // a efectos de visualización en el monitor serie
         
      
           if ( digitalRead(Padelante)==HIGH )//pulsador para avanzar
             
                 {
                       
                              i=i+1;              //cuenta los tramos que avanza
                              matriz[i]='A';      //matriz que almacena el numero de veces que avanza
                                                          
                              delay(500);         //retraso para introducir pulsos
                 }            
                   
          if ( digitalRead(Pizquierda)==HIGH )//pulsador para retroceder
                 {
                     i=i+1; 
                     matriz[i]='I';
                     delay(500);
                 }            

          if ( digitalRead(Patras)==HIGH )//pulsador para retroceder
                  {
                       i=i+1;
                       matriz[i]='R';
                       delay(500);
                 } 
                            
          if ( digitalRead(Pderecha)==HIGH )//pulsador para giro derecha
             
                 {
                   i=i+1; 
                   matriz[i]='D'; 
                   delay(500);
                 } 

        if ( digitalRead(Pactiva)==HIGH) //pulsador para activar el movimiento
             {      
                    
                      for (int i=0;i<30;i++)      //ciclo de conteo de los pulsos introducidos
                        { 
                          switch(matriz[i])   // lee el valor de cada celda de la matríz o y lo envia al caso correspondiente 
                          {
               
                          case 'A'://avanza 
                          ADelante();
                          break;
                         
                          case 'I':
                          IZquierda();
                          break;
                          
                          case 'D':
                          DErecha();
                          break;
                  
                          case 'R':
                          ATras();
                          break;
                          }
                        
                        }
                        delay(100);
                      // matriz[i]=0;
                       // i=0;  
               }
 
               stepper1.run ();
               stepper2.run ();            
    
}

void  ADelante () {
if (stepper1.distanceToGo()==0)
    {
      stepper1. move ( 2048 );
      stepper2. move (- 2048 );
      
    }
    
}
void  IZquierda () {

if (stepper1.distanceToGo()==0)
    {
      stepper1. move (500 );
      stepper2. move (500 );
      
    }
 }

type or paste code here

void  ATras () {
if (stepper1.distanceToGo()==0)
    {
      stepper1. move ( -2048 );
      stepper2. move ( 2048);
     }
}
void  DErecha () {
if (stepper1.distanceToGo()==0)
    {
        stepper1. move ( -500 );
        stepper2. move (- 500);
    }
}

Prueba así

for (int j = 0; j <= i ; j++)      //ciclo de conteo de los pulsos introducidos
{ 
    switch(matriz[j])   // lee el valor de cada celda de la matríz o y lo envia al caso correspondiente 
    {

Las teclas están conectadas con uno de sus terminales a 5V y el otro al pin correspondiente con una resistencia a masa, ¿Verdad?

Saludos

Use una variable diferente en el bucle for.

Si, ya se, por eso la cambié.

Fijate que agregué algo en el post anterior

Ademas de lo dicho escribe primero y luego aumenta el indice, si no nunca llenaras el dato 0

 if ( digitalRead(Padelante) == HIGH ) { //pulsador para avanzar
    matriz[i] = 'A';    //matriz que almacena el numero de veces que avanza
    i = i + 1;          //cuenta los tramos que avanza
    delay(500);         //retraso para introducir pulsos
  }

y no dejes que i supere el 29 o se pone ha hacer cosas raras, Pon por algun lado

if ( i > 29) { i = 0;}
 

Lo siento ... no leí tu código claramente ... no hablo español.

@gonpezzi Muy bien por lo del dato 0, quería ver si se daba cuenta solo...

Cuando i vale 30, yo haría que deje de aceptar comandos (salvo ejecutar) para que no empiece a "pisar" los primeros comandos.

Sí por supuesto. Bueno el cambio de variable en el ciclo foregún he comprobado no es necesario en cuanto a la lectura correcta de los datos de la matriz. El problema persiste, si introduzco dos, tres.. datos solo ejecuta el primero.
Muchas gracias.

@red_car No, yo me disculpo, respondí creyendo que tu eras el PO.

Saludos

@fcasasol El problema es que si barres todos los 30 elementos y resulta que en realidad ingresaste menos, no sabes que valores te va a devolver y podría alguno coincidir con un comando que no has ingresado.
Supongamos que en este caso particular te funciona pero es una mala práctica para futuros proyectos.

Siempre limita la lectura del array a la cantidad real de elementos que contiene.

Otro tema es lo que señaló acertadamente @gonpezzi , nunca cargas un valor en el elemento 0 del array sin embargo luego lo lees ¿qué valor devuelve?

Saludos

Bueno cuando cargas el primer dato , por ejemplo A, el contador a ese dato le asigna I=1, claro i inicialmente está a cero y cuando activas el conteo el primer dato ja es i=1; en el monmitor serie se ve que es así.

Muchas gracias.

No, me parece que no nos entendemos...
En tu código, al iniciar, i contiene 0.
Cuando pulsas un comando, primero incrementas y luego guardas el caracter.
O sea, salteas la posición 0.
Pero cuando lees, en el for() a i la inicias a 0 entonces lees una orden que nunca fue ni será definida.

Por otro lado
Corre tu código, guarda solo 2 comandos diferentes (por ej. Adelante y Atras) y dime luego si ejecuta el primero o el segundo. Quiero verificar algo y como estoy en el trabajo no puedo ni simularlo.

Te estas confundiendo, cuando declaras un array de 30 datos si, son 30 casillas pero la primera es la cero y la ultima la 29.

Bueno, no se cuanto tiempo más pueda dedicarte...
Revisa la función run(), creo que ahí radica el problema.
La documentación de la librería dice que hay que llamarla al menos una vez luego de cada paso o micropaso.
En el código todos los comandos se ejecutan de corrido sin llamar nunca a run() hasta que sale del for().
Tal vez estoy mal interpretando la documentación pero creo que viene por ahí.

Saludos

Gracias, lo probaré, creo que quizás sea ese el problema.
Saludos.

Ya lo hice y solo ejecuta el primer comando.
Gracias.

¿Me respondiste a esto?

Has la prueba agregando

  stepper1.run ();
  stepper2.run ();

a continuación del switch(), o sea antes del cierre del for()

Gracias por tu sugerencia, probado y no funciona, por lo que entiendo run() tiene que estar ubicado en el void loop().

Gracias a todos, seguiré probando y cuándo encuentre la solución la comentaré en el forum.
Saludos.

Diría que sí. Solo ejecuta la primera instrucción entrada.
Saludos