Los motores que se utilizan en el robot son de corriente continua.

Estos motores normalmente funcionan con voltajes de 5 a 12 V si se invierte la polaridad cambia el sentido de rotación. Es importante anotar la corriente que necesitan operar, en la mayoría de casos son mayores a los que puede proporcionar el Arduino por lo que es necesario utilizar un controlados de motores.
El controlador de motores L298N.
El modulo L298N es mostrado en la siguiente imagen

Y la vista desde arriba

El controlador posee una bornera de tres pines para la alimentación, y dos borneras de 2 pines para la salida a los motores.
Los pines ENA, IN1, IN2 correspondes a las entradas para controlar el MOTOR A (OUT1 y OUT2), y los pines ENB, IN3, IN4 permiten controlar el MOTOR B (OUT3 y OUT4)
ENA y ENB, sirven para habilitar o deshabilitar sus respectivos motores, generalmente se utilizan para controlar la velocidad, ingresando una señal de PWM por estos pines. Si no se usan se deben de conectar los Jumper para que siempre estén habilitados. La imagen muestra los pines conectados.
Tenemos además otro jumper que está mostrado como Enable Regulator, este se utiliza para definir la forma de alimentar el módulo. De acuerdo a si está o nó el jumper tenemos dos formas de hacer esto:
1. Utilizando una sola fuente, conectada a la entrada de 12V y con el Jumper para habilitar el regulador, aclarando que el voltaje de la fuente es el que soporta el motor. De esta forma la entrada de 5V no debe estar conectada a ninguna fuente, ya que en este pin están presentes 5V a través del regulador interno; pero puedes utilizar este pin como una salida de 5V, pero sin exceder los 500mA de consumo. Se recomienda hacer esta conexión para voltajes menores de 12V para no sobrecalentar el regulador
2. Utilizando dos fuentes, una de 5V conectada a la entrada de 5V (puede ser los 5V de un Arduino) y otra fuente con el valor del voltaje que trabaja el motor, conectada al pin de 12V. Para esto se tiene que desconectar el Jumper lo que deshabilitará al regulador.
¿Cuál de las dos formas es la que vamos a utilizar? Depende de la forma en que se alimenta el Arduino.

La placa Arduino Uno se puede alimentar por dos métodos:
- A través de la conexión USB como se hace cuando se conecta a una computadora para programarla o simplemente para ejecutar el programa. Se puede usar cualquier adaptador USB conectado a la red.
- Con una fuente de alimentación externa. La fuente de alimentación se selecciona automáticamente. La alimentación externa (no USB) puede provenir de un adaptador de corriente de pared o de una batería. El adaptador se puede conectar con un enchufe de centro positivo de 2,1 mm de diámetro en el conector Jack de alimentación de la placa (Marcado como Barrel Jack). Los cables de una batería se pueden insertar en los cabezales de los pines GND y VIN del conector POWER. La placa puede funcionar con una fuente externa de 6 a 20 voltios. Sin embargo, si se alimenta con menos de 7 V, el pin de 5 V puede suministrar menos de cinco voltios y la placa puede volverse inestable. Si usas más de 12V, el regulador de voltaje puede sobrecalentarse y dañar la placa. El rango recomendado es de 7 a 12 voltios.
Desglose de pines de alimentación:
- VIN: El voltaje de entrada a la placa Arduino cuando está usando una fuente de alimentación externa (a diferencia de los 5 voltios de la conexión USB u otra fuente de alimentación regulada). Puedes suministrar voltaje a través de este pin o, si suministras voltaje a través del conector de alimentación, acceder a él a través de este pin.
- 5V: Este pin proporciona 5V regulados desde el regulador interno de la placa. La placa puede recibir alimentación desde el conector de alimentación DC (7 a 12 V), el conector USB (5 V) o el pin VIN de la placa (7-12 V). El suministro de voltaje a través de los pines de 5 V o 3,3 V puentea el regulador y puede dañar la placa si lo haces mal. Por lo tanto ese método alimentación no es recomendable
- 3V3: Proporciona 3.3 Voltios generado por el regulador integrado. El consumo máximo de corriente es 50 mA.
- GND: Pines negativos (masa)
- IOREF: Este pin en la placa Arduino proporciona la referencia de voltaje con la que opera el microcontrolador. Una shield configurada correctamente puede leer el voltaje del pin IOREF y seleccionar la fuente de alimentación adecuada o permitir que los conversores de voltaje (ADC) en las salidas funcionen con 5V o 3.3V.
Ahora usaremos el controlador para alimentar a los motores sin usar el Arduino.

Los jumpers de control de velocidad

El modulo viene con dos jumpers en ENA y en ENB. Cuando los jumpers se encuentran colocados los motores giraran a máxima velocidad, si se retira los motores pueden ser controlados con modulación de ancho de pulso.
Los pines de control de dirección

Los pines IN1 y IN2 sirven para controlar la dirección de giro del motor A en tanto que los pines IN3 e IN4 sirven para controlar la dirección de giro del motor B.
| Input1 | Input2 | Direction de giro |
| Low(0) | Low(0) | Motor OFF |
| High(1) | Low(0) | Adelante |
| Low(0) | High(1) | Retrocede |
| High(1) | High(1) | Motor OFF |
Instalación y código
Es tomado de:
https://lastminuteengineers.com/l298n-dc-stepper-driver-arduino-tutorial

El código es:
// Motor A connections
int enA = 9;
int in1 = 8;
int in2 = 7;
// Motor B connections
int enB = 3;
int in3 = 5;
int in4 = 4;
void setup() {
// Set all the motor control pins to outputs
pinMode(enA, OUTPUT);
pinMode(enB, OUTPUT);
pinMode(in1, OUTPUT);
pinMode(in2, OUTPUT);
pinMode(in3, OUTPUT);
pinMode(in4, OUTPUT);
// Turn off motors – Initial state
digitalWrite(in1, LOW);
digitalWrite(in2, LOW);
digitalWrite(in3, LOW);
digitalWrite(in4, LOW);
}
void loop() {
directionControl();
delay(1000);
speedControl();
delay(1000);
}
void directionControl() {
// Set motors to maximum speed
// For PWM maximum possible values are 0 to 255
analogWrite(enA, 255);
analogWrite(enB, 255);
// Turn on motor A & B
digitalWrite(in1, HIGH);
digitalWrite(in2, LOW);
digitalWrite(in3, HIGH);
digitalWrite(in4, LOW);
delay(2000);
// Now change motor directions
digitalWrite(in1, LOW);
digitalWrite(in2, HIGH);
digitalWrite(in3, LOW);
digitalWrite(in4, HIGH);
delay(2000);
// Turn off motors
digitalWrite(in1, LOW);
digitalWrite(in2, LOW);
digitalWrite(in3, LOW);
digitalWrite(in4, LOW);
}
// This function lets you control speed of the motors
void speedControl() {
// Turn on motors
digitalWrite(in1, LOW);
digitalWrite(in2, HIGH);
digitalWrite(in3, LOW);
digitalWrite(in4, HIGH);
// Accelerate from zero to maximum speed
for (int i = 0; i < 256; i++) {
analogWrite(enA, i);
analogWrite(enB, i);
delay(20);
}
// Decelerate from maximum speed to zero
for (int i = 255; i >= 0; –i) {
analogWrite(enA, i);
analogWrite(enB, i);
delay(20);
}
// Now turn off motors
digitalWrite(in1, LOW);
digitalWrite(in2, LOW);
digitalWrite(in3, LOW);
digitalWrite(in4, LOW);
}
TAREA
Mover el robot combinando los movimientos elementales, cuya estructura del código es:
void setup(){
}
void loop(){
}
void car_front() // hacer que el coche avance hacia adelante
{
}
void car_back() // hacer que el coche retrocedea{
}
void car_left() // el coche gira a la izquierda
{
}
void car_right() // el coche gira a la derecha
{
}
void car_Stop() // el coche se detiene
{
}