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;