Puente grua con motor step to step

Hola compañeros, soy un principiante que se esta adentrando en el mundo Arduino. Tengo un Mega 2560, y estoy haciendo un proyecto personal, este se basa en una maqueta de un puente grúa automatizado por posiciones. A través de un teclado numérico y un display hago accionar posiciones, primero se escoge la posición donde recoge el objeto y luego donde lo deja.

De momento tengo solo dos motores programados, cuando estos funcionen bien introduciré el tercero.

He podido solucionar el problema del bloqueo, el error estaba en la función getKey(), para poder bloquear el programa hasta que no se presionase una tecla, se necesita la función waitForKet(), con ella el programa se queda parado hasta presionar la tecla, si se presiona una tecla, salta a la siguiente función.

Os iré informando y poniendo alguna que otra foto de como evoluciona el proyecto.

Muchas gracias por todo

Un saludo

///////////////////////////////////////////////////////////////////////////////////////////////////////////////

#include <Keypad.h> 
#include <Stepper.h>  
#include <LiquidCrystal.h>

LiquidCrystal lcd(22, 24, 26, 28, 30, 32);
int pasos1 = 500;      //Pasos a cada accionamento del boton
                      // Cada 2037 pasos són una vuelta completa del eje del motor
int pasos2 = 1000;
int pasos3 = 1500;
  

char tecla;
char tecla2;
char pos1;
char pos2;

const int pasosxrevolucion = 2037;  
Stepper myStepper(pasosxrevolucion, 38,3,4,2);      //Motor eje horizontal[3,4,2 son PWM] [por orden de 1N1,1N3,1N2,1N4]
Stepper myStepper2(pasosxrevolucion, 36,6,7,5);     //Motor eje vertical[6,7,5 son PWM]
                                                    //cuando (pasos) es negativo en el eje horizontal (eje x) es que el motor va a la derecha de lo contrario izquierda
                                                    //cuando (pasos) es negativo en el eje vertical (eje y) es que el motor va hacia arriba de lo contrario abajo
                                                    
                                                    //    {     '1'  '2'  '3'    }      Estas son las nueve posiciones posibles,
                                                    
                                                    //    {     '4'  '5'  '6'    }      la posición 0 es el estado inicial.
                                                    
                                                    //    {     '7'  '8'  '9'    }
                                                    
                                                    //    {'0'                   } 
                                                    
                                                    
const byte ROWS = 4; // cuatro filas
const byte COLS = 3; // tres columnas

// matriz que dibuja el teclado

char numberKeys[ROWS][COLS] ={

  {'1','2','3'},
  {'4','5','6'},
  {'7','8','9'},
  {'*','0','#'}
  
};  

byte rowPins[ROWS] = {31,33,35,37};
byte colsPins[COLS] = {39,41,43};

//inicializar una instancia de la clase NewKeypad

Keypad customKeypad=Keypad(makeKeymap(numberKeys),rowPins,colsPins,ROWS,COLS);

void setup()   
{ 
  lcd.begin(20, 4);
  lcd.setCursor(0,0);
  lcd.write("Andrade Industries");
  lcd.setCursor(4,2);
  lcd.write("PUENTE GRUA");
  
  delay (5000);
  
  lcd.clear();
 
  myStepper.setSpeed(14); //Determina la velocidad del motor 
  myStepper2.setSpeed(14); //Determina la velocidad del motor2  
}  
   
void loop()  
{    
 
  lcd.setCursor(0,0);
  lcd.write("Donde quieres");
  lcd.setCursor(0,1);
  lcd.write("cogerlo?");
  lcd.setCursor(0,2);
  lcd.write("Donde quieres");
  lcd.setCursor(0,3);
  lcd.write("dejarlo?");
  

   
    lcd.display();
    
    // la función waitForKey() permite bloquear el programa hasta obtener un nuevo valor de la tecla pulsada en ASCII
    
    char tecla=customKeypad.waitForKey(); // Espera hasta pulsar la tecla
                                          // Guarda valor pulsado en (tecla) 
  
   if (tecla != NO_KEY)  // Condición que se utiliza para saber si se ha pulsado (tecla)
  {
    pos1=(tecla);      // Guarda valor tecla en (pos1)
    lcd.setCursor(11,1);
    lcd.print(pos1);
    
    
    char tecla2=customKeypad.waitForKey(); // Espera hasta pulsar la tecla2
                                          // Guarda valor pulsado en (tecla2)
    
    
    if (tecla2 != NO_KEY)  // Condición que se utiliza para saber si se ha pulsado (tecla2)
    
    {
      pos2=(tecla2);    // Guarda valor tecla en (pos2)
      lcd.setCursor(11,3);
      lcd.print(tecla2);
      
      //Determinaremos las posiciones con un 'switch' inicial para la primera posición, con los 9 'case' posibles.
      //Dentro de cada 'case' daremos las funciones que activan los steppers con sus respectivos movimientos.
      //Cada 'case' principat tendrá un 'switch' secundario con otros 9 'case', eso es porque desde cada posición,
      //la segunda posición que se da será diferente, es decir,'ejemplo': si decidimos que vaya a coger el objeto
      //a la posición '1' y lo deje en la '4', la trayectoria será única para ese movimiento. Por lo tanto hay un total
      //de 81 combinaciones de movimientos diferentes.
        
     switch(pos1){
     
       case 49: //Primera posición
       
       myStepper.step(-pasos1);    //motor eje x
       myStepper2.step(-pasos3);   //motor eje y
      
         switch(pos2){
         
           case 49:
           //solo tercer motor
           break;
           
           case 50:
           myStepper.step(-pasos1);
           break;
           
           case 51:
           myStepper.step(-pasos2);
           break;
           
           case 52:
           myStepper2.step(pasos1);
           break;
           
           case 53:
           myStepper.step(-pasos1);
           myStepper2.step(pasos1);
           break;
           
           case 54:
           myStepper.step(-pasos2);
           myStepper2.step(pasos1);
           break;
           
           case 55:
           myStepper2.step(pasos2);
           break;
           
           case 56:
           myStepper.step(-pasos1);
           myStepper2.step(pasos2);
           break;
           
           case 57:
           myStepper.step(-pasos2);
           myStepper2.step(pasos2);
           break;
           
         }
         
       lcd.clear();
       break;

Hola Daniel.
Primero edita tu post#1 y usa los tag para inserta códigos.

Segundo explicame que debe hacer el código si es 0 a 9 y si debe aceptar dobles números.
A ver si me explico mejor, algo que tu no has hecho. Nunca hables como si los demás conociéramos tu proyecto porque no lo conocemos, luego vemos el código y no esta comentado entonces tampoco lo entendemos en cuanto a que debe hacer con cada tecla.

Imagina que el programa ahora permite que introduzcas 1 tecla, 2, 3, o la cantidad que gustes hasta presionar # que le dice que no ingresas mas teclas.
Te parece bien?

Luego si tienes 0 hará primeraPosicion, y con cada número la posicion correspondiente.
Los steppers estan moviendose según los pasos establecidos.
Espero tu respuesta y reescribimos el código.

Gracias por el apoyo surbyte, solucioné el problema desde la página :

http://playground.arduino.cc/Code/Keypad

En esta página salen todas las funciones aplicables a los Keypad.

Espero seguir progresando y poder acabar mi proyecto :smiley:

Saludos
Mucha suerte con tu proyecto, mi primer proyecto también fue una torre grúa, controlada por bluetooth con un dispositivo Android.

Me alegro ver que otro tambien hara algo similar.

Como lo resolviste, ahi no esta la respuesta.
Igualmente bien podrias organizar tu idea porque luce desorganizada.

Cambié la función getKey(); por la función waitForKey(); esta explicado en el post principal.