const byte ROWS = 4; // Número de filas en el teclado
const byte COLS = 4; // Número de columnas en el teclado
char keys[ROWS][COLS] = {
{'1', '2', '3', 'A'},
{'4', '5', '6', 'B'},
{'7', '8', '9', 'C'},
{'*', '0', '#', 'D'}
};
byte rowPins[ROWS] = {9, 8, 7, 6}; // Conectar los pines de fila a estos pines en el Arduino
byte colPins[COLS] = {5, 4, 3, 2}; // Conectar los pines de columna a estos pines en el Arduino
char inputBuffer[20]; // Almacena los valores ingresados
byte bufferIndex = 0; // Índice actual en el búfer
// Definir pines para controlar el motor paso a paso
const int APlusPin = 12;
const int AMinusPin = 13;
const int BPlusPin = 11;
const int BMinusPin = 10;
// Variable para indicar si se debe iniciar el motor
boolean startMotor = false;
void setup() {
Serial.begin(9600);
// Configurar los pines del motor como salida
pinMode(APlusPin, OUTPUT);
pinMode(AMinusPin, OUTPUT);
pinMode(BPlusPin, OUTPUT);
pinMode(BMinusPin, OUTPUT);
}
void loop() {
char key = getKey();
if (key != 0) {
if (key == '#') {
executeCommand();
} else if (key == '*') {
clearBuffer();
} else {
addToBuffer(key);
}
}
}
char getKey() {
for (byte col = 0; col < COLS; col++) {
pinMode(colPins[col], OUTPUT);
digitalWrite(colPins[col], LOW);
for (byte row = 0; row < ROWS; row++) {
pinMode(rowPins[row], INPUT_PULLUP);
if (digitalRead(rowPins[row]) == LOW) {
delay(50); // Debounce
while (digitalRead(rowPins[row]) == LOW);
pinMode(rowPins[row], INPUT);
pinMode(colPins[col], INPUT);
return keys[row][col];
}
}
pinMode(colPins[col], INPUT);
}
return 0; // Devolver 0 si no se presionó ninguna tecla
}
void addToBuffer(char newChar) {
if (bufferIndex < sizeof(inputBuffer) - 1) {
inputBuffer[bufferIndex] = newChar;
bufferIndex++;
}
}
void clearBuffer() {
for (byte i = 0; i < sizeof(inputBuffer); i++) {
inputBuffer[i] = '\0';
}
bufferIndex = 0;
Serial.println("Buffer cleared.");
}
void executeCommand() {
if (bufferIndex > 1) {
char direction = inputBuffer[0];
int degrees = atoi(inputBuffer + 1);
Serial.print("Command received: ");
Serial.print(direction);
Serial.print(degrees);
Serial.println(" degrees");
// Calcular la cantidad de pasos necesarios para el giro en grados
int steps = (512 * degrees) / 360;
// Configurar el motor para la dirección deseada
if (direction == 'A') {
digitalWrite(APlusPin, HIGH);
digitalWrite(AMinusPin, LOW);
digitalWrite(BPlusPin, LOW);
digitalWrite(BMinusPin, HIGH);
} else if (direction == 'B') {
digitalWrite(APlusPin, LOW);
digitalWrite(AMinusPin, HIGH);
digitalWrite(BPlusPin, HIGH);
digitalWrite(BMinusPin, LOW);
}
// Iniciar el motor
startMotor = true;
// Realizar los pasos necesarios para el giro
for (int i = 0; i < steps; i++) {
if (startMotor) {
// Implementa el control de paso a paso aquí, dependiendo de tu motor
} else {
break; // Detener el giro si 'startMotor' es falso
}
}
// Detener el motor después de completar el giro
startMotor = false;
} else if (inputBuffer[0] == '#') {
// Si se presionó '#' sin un valor, imprimir el mensaje
Serial.println("No se ingresó un valor para girar.");
} else {
Serial.println("Invalid command.");
}
clearBuffer();
}