#include <IRremote.h>
// Configuración de pines
const int IR_RECEIVE_PIN = 11;
// Pines para el motor izquierdo
const int MOTOR_IZQ_DIR_PIN = 2;
const int MOTOR_IZQ_STEP_PIN = 3;
const int MOTOR_IZQ_ENABLE_PIN = 6;
// Pines para el motor derecho
const int MOTOR_DER_DIR_PIN = 4;
const int MOTOR_DER_STEP_PIN = 5;
const int MOTOR_DER_ENABLE_PIN = 7;
// Definición de códigos IR (debes ajustarlos según tu control)
#define IR_CODE_AVANZAR 0x57A8FF00 // Ejemplo: Tecla "Play"
#define IR_CODE_IZQUIERDA 0x1FE0FF00 // Ejemplo: Tecla "Left"
#define IR_CODE_DERECHA 0x6F90FF00 // Ejemplo: Tecla "Right"
#define IR_CODE_ROTAR 0x3DC2FF00 // Ejemplo: Tecla "RETURN"
// Configuración de los motores
const int STEPS_PER_REV = 200; // Pasos por revolución
const int STEP_DELAY = 1000; // Microsegundos entre pasos (velocidad)
const int PASOS_GIRO = 50; // Pasos para realizar un giro
void setup() {
Serial.begin(9600);
// Configurar pines de los motores
pinMode(MOTOR_IZQ_DIR_PIN, OUTPUT);
pinMode(MOTOR_IZQ_STEP_PIN, OUTPUT);
pinMode(MOTOR_IZQ_ENABLE_PIN, OUTPUT);
pinMode(MOTOR_DER_DIR_PIN, OUTPUT);
pinMode(MOTOR_DER_STEP_PIN, OUTPUT);
pinMode(MOTOR_DER_ENABLE_PIN, OUTPUT);
// Habilitar motores (LOW para habilitar en muchos drivers)
digitalWrite(MOTOR_IZQ_ENABLE_PIN, LOW);
digitalWrite(MOTOR_DER_ENABLE_PIN, LOW);
// Inicializar receptor IR
IrReceiver.begin(IR_RECEIVE_PIN, ENABLE_LED_FEEDBACK);
Serial.println("Sistema listo. Esperando comandos IR...");
}
void loop() {
if (IrReceiver.decode()) {
IrReceiver.resume(); // Prepara para recibir el siguiente valor
Serial.print("Código recibido: 0x");
Serial.println(IrReceiver.decodedIRData.decodedRawData, HEX);
// Procesar comandos
switch(IrReceiver.decodedIRData.decodedRawData) {
case IR_CODE_AVANZAR:
Serial.println("Comando: Avanzar recto");
avanzar();
break;
case IR_CODE_IZQUIERDA:
Serial.println("Comando: Girar izquierda");
girarIzquierda();
break;
case IR_CODE_DERECHA:
Serial.println("Comando: Girar derecha");
girarDerecha();
break;
case IR_CODE_ROTAR:
Serial.println("Comando: Rotar en su eje");
rotarEnEje();
break;
default:
Serial.println("Comando no reconocido");
break;
}
}
}
// Función para avanzar recto
void avanzar() {
// Ambos motores en sentido horario (adelante)
digitalWrite(MOTOR_IZQ_DIR_PIN, HIGH);
digitalWrite(MOTOR_DER_DIR_PIN, HIGH);
darPasosSincronizados(PASOS_GIRO);
}
// Función para girar a la izquierda
void girarIzquierda() {
// Motor izquierdo detenido o atrás, motor derecho adelante
digitalWrite(MOTOR_IZQ_DIR_PIN, LOW); // Cambia a LOW para atrás o HIGH para detener
digitalWrite(MOTOR_DER_DIR_PIN, HIGH);
darPasosSincronizados(PASOS_GIRO);
}
// Función para girar a la derecha
void girarDerecha() {
// Motor izquierdo adelante, motor derecho detenido o atrás
digitalWrite(MOTOR_IZQ_DIR_PIN, HIGH);
digitalWrite(MOTOR_DER_DIR_PIN, LOW); // Cambia a LOW para atrás o HIGH para detener
darPasosSincronizados(PASOS_GIRO);
}
// Función para rotar sobre su eje
void rotarEnEje() {
// Motores en sentidos opuestos
digitalWrite(MOTOR_IZQ_DIR_PIN, HIGH); // Izquierda adelante
digitalWrite(MOTOR_DER_DIR_PIN, LOW); // Derecha atrás
darPasosSincronizados(PASOS_GIRO);
}
// Función auxiliar para mover ambos motores sincronizados
void darPasosSincronizados(int pasos) {
for(int i = 0; i < pasos; i++) {
digitalWrite(MOTOR_IZQ_STEP_PIN, HIGH);
digitalWrite(MOTOR_DER_STEP_PIN, HIGH);
delayMicroseconds(STEP_DELAY);
digitalWrite(MOTOR_IZQ_STEP_PIN, LOW);
digitalWrite(MOTOR_DER_STEP_PIN, LOW);
delayMicroseconds(STEP_DELAY);
}
}
Izquierda
Derecha