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.

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); }