Control de motores DC en robots (3 parte)

En las dos entradas anteriores vimos cómo simular en Tinkercad el funcionamiento de dos motores DC y aplicar ese conocimiento a la programación de robots reales. Eso es lo que vamos a empezar ahora.

Esquema electrónico del robot

El esquemático del robot sobre el que vamos a hacer las pruebas es similar al que figura abajo. En cada uno de los robos, puede haber alguna diferencia con los pines a los que están conectados los motores, etc. Por eso, en cada uno de los robots, hay que hacer las pruebas básicas de movimiento.

Esquemático de un robot móvil con dos motores DC

Paso 1: Comprobar el movimiento básico de cada uno de los motores.

// Programa que permite controlar el movimiento basico de dos motores DC utilizando el puente H-Bridge L293D o similar.

const int switchPin = 2;    // switch input  De momento no se utiliza. Sirve para configuraciones posteriores.
const int motor1Pin = 3;    // H-bridge leg 1 (pin 2, 1A)
const int motor2Pin = 4;    // H-bridge leg 2 (pin 7, 2A)
const int motor4Pin = 5;    // H-bridge leg 4 (pin 10, 4A)
const int motor3Pin = 6;    // H-bridge leg 3 (pin 15, 3A)
const int enablePin12 = 9;    // H-bridge enable pin motor M2
const int enablePin34 = 10;    // H-bridge enable pin motor M1 


void setup() {
    // set the switch as an input .Se utilizara en otros programas, no en este:
    pinMode(switchPin, INPUT);

    // set all the other pins you're using as outputs:
    pinMode(motor1Pin, OUTPUT);
    pinMode(motor2Pin, OUTPUT);
    pinMode(motor4Pin, OUTPUT);
    pinMode(motor3Pin, OUTPUT);
     
    pinMode(enablePin12, OUTPUT);
    pinMode(enablePin34, OUTPUT);
   

    // set enablePin high so that motor can turn on:
    digitalWrite(enablePin12, HIGH);
    digitalWrite(enablePin34, HIGH);
  }
  
  
void loop() {
    
     // Movimiento hacia adelante motores
      digitalWrite(motor1Pin, HIGH);   
      digitalWrite(motor2Pin, LOW);  
      digitalWrite(motor4Pin, HIGH);   
      digitalWrite(motor3Pin, LOW);    
      
  }

Se carga y se prueba este programa. Hay que comprobar que los dos motores van hacia adelante. En caso contrario, hay que cambiar los valores HIGH-LOW en cada uno de los pines hasta lograr el movimiento deseado. Cuando funcionen así, es conveniente poner a la derecha comentarios para etiquetar qué pines corresponden al motor izquierdo y qué pines al derecho.

En las pruebas realizadas, vemos que los motores están girando hacia atrás. Por lo tanto, habría que modificar el código de esta forma:

void loop() {
    
     // Movimiento hacia adelante motores
      digitalWrite(motor1Pin, LOW);   // Motor izquierdo hacia adelante
      digitalWrite(motor2Pin, HIGH);  
      digitalWrite(motor4Pin, LOW);   // Motor derecho hacia adelante
      digitalWrite(motor3Pin, HIGH);    
      
  }

Hemos cambiado el orden LOW-HIGH para invertir el giro del motor.

Deberíamos comprobar si hemos etiquetado bien los motores izquierdo y derecho con sus pines. Para ello, probamos el programa con un solo motor:

void loop() {
    
     // Movimiento hacia adelante motores
      digitalWrite(motor1Pin, LOW);   // Motor izquierdo hacia adelante
      digitalWrite(motor2Pin, HIGH);  
      //digitalWrite(motor4Pin, LOW);   // Motor derecho hacia adelante
      //digitalWrite(motor3Pin, HIGH);    
      
  }

En las pruebas vemos que efectivamente el motor izquierdo es el que se mueve hacia adelante y el derecho está parado. Por tanto, los pines 1 y 2 controlan el izquierdo y los pines 3-4 controlan el derecho. En tal caso, los comentarios puestos a la derecha de los digitalWrite son correctos.

Con esta información, ya sabemos cómo controlar cada uno de los motores para que giran hacia adelante y hacia atrás. Con esto, ya podemos definir movimientos más complejos: avance, retroceso, giro a la izquierda, a la derecha, giro sobre sí mismo, etc.

Paso 2: Creación de funciones con movimientos básicos

Cuando se tiene identificado correctamente el movimiento de cada uno de los motores, podemos agrupar los movimientos básicos en funciones. De esta forma, es más sencillo programar el robot.

// Programa que permite controlar el movimiento basico de dos motores DC utilizando el puente H-Bridge L293D o similar.
 
const int switchPin = 2;    // switch input  De momento no se utiliza. Sirve para configuraciones posteriores.
const int motor1Pin = 3;    // H-bridge leg 1 (pin 2, 1A)
const int motor2Pin = 4;    // H-bridge leg 2 (pin 7, 2A)
const int motor4Pin = 5;    // H-bridge leg 4 (pin 10, 4A)
const int motor3Pin = 6;    // H-bridge leg 3 (pin 15, 3A)
const int enablePin12 = 9;    // H-bridge enable pin motor M2
const int enablePin34 = 10;    // H-bridge enable pin motor M1 
 
 
void setup() {
    // set the switch as an input .Se utilizara en otros programas, no en este:
    pinMode(switchPin, INPUT);
 
    // set all the other pins you're using as outputs:
    pinMode(motor1Pin, OUTPUT);
    pinMode(motor2Pin, OUTPUT);
    pinMode(motor4Pin, OUTPUT);
    pinMode(motor3Pin, OUTPUT);
      
    pinMode(enablePin12, OUTPUT);
    pinMode(enablePin34, OUTPUT);
    
 
    // set enablePin high so that motor can turn on:
    digitalWrite(enablePin12, HIGH);
    digitalWrite(enablePin34, HIGH);
  }
   
   
void loop() {
     
     avance();
     delay(1000);
     atras();
     delay(1000);
       
  }


  //   FUNCIONES

  void avance(){
      digitalWrite(motor1Pin, LOW);   // MOtor izquierdo ADELANTE
      digitalWrite(motor2Pin, HIGH);  
      digitalWrite(motor4Pin, LOW); // MOtor derecho ADELANTE 
      digitalWrite(motor3Pin, HIGH);   
  }

  void atras(){
      digitalWrite(motor1Pin, HIGH);   // MOtor izquierdo ATRÁS
      digitalWrite(motor2Pin, LOW);  
      digitalWrite(motor4Pin, HIGH); // MOtor derecho ATRÁS 
      digitalWrite(motor3Pin, LOW);   
  }