### Proyecto 8: Control de Motor y Velocidad
#### **(1)Descripción:**
Existen muchas formas de controlar motores. Nuestro carro inteligente utiliza la solución más común llamada L298P. El L298P, fabricado por STMicroelectronics, es un excelente chip de control especialmente diseñado para manejar motores de alta potencia.
Puede controlar directamente motores de corriente continua, motores de dos fases y cuatro fases con una corriente de control de hasta 2A. Y el terminal de salida del motor adopta 8 diodos Schottky de alta velocidad como protección.
Hemos diseñado una placa de expansión basada en el circuito L298P cuyo diseño apilable puede conectarse directamente a la placa UNO R3, reduciendo las dificultades técnicas para los usuarios al usar y controlar el motor.
Apile la placa de expansión sobre la placa, alimente la BAT, gire el interruptor DIP al extremo ON y alimente la placa de expansión y la placa UNO R3 al mismo tiempo mediante una fuente de alimentación externa.
Para facilitar el cableado, la placa de expansión está equipada con interfaz anti-inversión (PH2.0 -2P -3P -4P -5P) y por lo tanto puede conectarse directamente con motores, fuente de alimentación y sensores/módulos.
La interfaz Bluetooth de la placa de expansión de control es totalmente compatible con el módulo Bluetooth Keyestudio HM-10. Por lo tanto, solo necesitamos insertar el módulo Bluetooth HM-10 en la interfaz correspondiente al conectarlo.
Al mismo tiempo, la placa de extensión de control también usa conectores de pines 2.54 para extender algunos puertos digitales y analógicos disponibles, de modo que pueda continuar añadiendo otros sensores y realizar experimentos de expansión.
La placa de expansión puede conectarse a 4 motores de corriente continua. En el modo de conexión predeterminado con jumper, los motores de las interfaces A y A1, B y B1 están conectados en paralelo y su patrón de movimiento es el mismo. Se pueden usar 8 jumpers para controlar la dirección de rotación de las 4 interfaces de motor.
Por ejemplo, cuando los dos jumpers frente a la interfaz del motor A cambian de una conexión horizontal a una conexión vertical, la dirección de rotación del motor A ahora es opuesta a la dirección original.


#### **(2)Parámetros:**
- Voltaje de entrada de la parte lógica: DC 5V
- Voltaje de entrada de la parte de control: DC 7-12V
- Corriente de trabajo de la parte lógica: ≤36mA
- Corriente de trabajo de la parte de control: ≤ 2A
- Potencia máxima de disipación: 25W (T=75℃)
- Nivel de entrada de señal de control:
Nivel alto: 2.3V ≤ Vin ≤ 5V
Nivel bajo: 0V ≤ Vin ≤ 1.5V
- Temperatura de trabajo: -25℃~+130℃
#### **(3)Control del movimiento del robot**
El pin de dirección del motor A es D2, el pin de control de velocidad es D5; el pin de dirección del motor B es D4 y el pin de control de velocidad es D6.
De acuerdo con la tabla a continuación, podemos saber cómo controlar el movimiento del robot controlando la rotación de dos motores a través de los puertos digitales y puertos PWM. Entre ellos, el rango del valor PWM es 0-255. Cuanto mayor sea el valor, más rápido girará el motor.
| Función | D4 | D6(PWM) | Motor(izquierdo)B | D2 | D5(PWM) | Motor(derecho)A |
| :--------------: | :--: | :-------: | :-----------------: | :--: | :-------: | :---------------: |
| Avanzar | HIGH | 255-200 | Girar izquierda | HIGH | 255-200 | Girar izquierda |
| Retroceder | LOW | 200 | Girar derecha | LOW | 200 | Girar derecha |
| Girar izquierda | LOW | 200 | Girar derecha | HIGH | 255-200 | Girar izquierda |
| Girar derecha | HIGH | 255-200 | Girar izquierda | LOW | 200 | Girar derecha |
| Detener | LOW | 0 | Detener | LOW | 0 | Detener |
#### **(4)Diagrama de Conexión:**

Nota:
El conector de 4 pines está marcado con A, A1, B1 y B. El motor trasero derecho está conectado a B de la placa 8833 y el delantero izquierdo está conectado al puerto A.
#### **(5)Código de Prueba:**
(**Nota:** No conecte el módulo Bluetooth antes de cargar el código, porque la carga del código también usa comunicación serial, y puede haber conflictos con la comunicación serial Bluetooth, lo que puede causar que la carga falle.)
```C
/*
Keyestudio Mini Tank Robot V3 (Popular Edition)
lesson 8.1
motor driver
http://www.keyestudio.com
*/
#define ML_Ctrl 4 // Definir el pin de control de dirección del motor izquierdo
#define ML_PWM 6 // Definir el pin de control PWM del motor izquierdo
#define MR_Ctrl 2 // Definir el pin de control de dirección del motor derecho
#define MR_PWM 5 // Definir el pin de control PWM del motor derecho
void setup()
{
pinMode(ML_Ctrl, OUTPUT);// Definir el pin de control de dirección del motor izquierdo como OUTPUT
pinMode(ML_PWM, OUTPUT);// Definir el pin de control PWM del motor izquierdo como OUTPUT
pinMode(MR_Ctrl, OUTPUT);// Definir el pin de control de dirección del motor derecho como OUTPUT
pinMode(MR_PWM, OUTPUT);// Definir el pin de control PWM del motor derecho como OUTPUT
}
void loop()
{
// adelante
digitalWrite(ML_Ctrl, HIGH); // Establecer la velocidad de control de dirección del motor izquierdo en HIGH
analogWrite(ML_PWM, 55); // La velocidad de control PWM del motor izquierdo es 55
digitalWrite(MR_Ctrl, HIGH); // Establecer la velocidad de control de dirección del motor derecho en HIGH
analogWrite(MR_PWM, 55); // La velocidad de control PWM del motor derecho es 55
delay(2000);// retardo de 2s
// atrás
digitalWrite(ML_Ctrl, LOW); // Establecer la velocidad de control de dirección del motor izquierdo en LOW
analogWrite(ML_PWM, 200); // La velocidad de control PWM del motor izquierdo es 200
digitalWrite(MR_Ctrl, LOW); // Establecer la velocidad de control de dirección del motor derecho en LOW
analogWrite(MR_PWM, 200); // La velocidad de control PWM del motor derecho es 200
delay(2000);// retardo de 2s
// girar izquierda
digitalWrite(ML_Ctrl, LOW); // Establecer la velocidad de control de dirección del motor izquierdo en LOW
analogWrite(ML_PWM, 200); // La velocidad de control PWM del motor izquierdo es 200
digitalWrite(MR_Ctrl, HIGH); // Establecer la velocidad de control de dirección del motor derecho en HIGH
analogWrite(MR_PWM, 55); // La velocidad de control PWM del motor derecho es 55
delay(2000);// retardo de 2s
// girar derecha
digitalWrite(ML_Ctrl, HIGH); // Establecer la velocidad de control de dirección del motor izquierdo en HIGH
analogWrite(ML_PWM, 55); // La velocidad de control PWM del motor izquierdo es 55
digitalWrite(MR_Ctrl, LOW); // Establecer la velocidad de control de dirección del motor derecho en LOW
analogWrite(MR_PWM, 200); // La velocidad de control PWM del motor derecho es 200
delay(2000);// retardo de 2s
// detener
digitalWrite(ML_Ctrl, LOW);
analogWrite(ML_PWM, 0); // La velocidad de control PWM del motor izquierdo es 0
digitalWrite(MR_Ctrl, LOW);
analogWrite(MR_PWM, 0); // La velocidad de control PWM del motor derecho es 0
delay(2000);// retardo de 2s
}
```
#### **(6)Resultados de la Prueba:**
Después de cablear según el diagrama, cargar el código de prueba y encenderlo.

el carro inteligente avanza durante 2s, retrocede durante 2s, gira a la izquierda durante 2s, gira a la derecha durante 2s y se detiene durante 2s, repitiendo esta secuencia.
#### **(7)Explicación del Código:**
**digitalWrite(ML_Ctrl,LOW);**
El cambio entre niveles alto y bajo puede hacer que los motores giren en sentido horario o antihorario. Los pines digitales generales pueden usarse para controlar estos movimientos.
**analogWrite(ML_PWM,200);**
El ajuste de velocidad del motor se realiza mediante PWM, y el pin que controla la velocidad del motor debe ser el pin PWM de Arduino.
#### **(8)Proyecto de Expansión:**
Ajustamos la velocidad de los motores controlando PWM y el cableado permanece igual.
**Código de Prueba**
(**Nota:** No conecte el módulo Bluetooth antes de cargar el código, porque la carga del código también usa comunicación serial, y puede haber conflictos con la comunicación serial Bluetooth, lo que puede causar que la carga falle.)
```C
/*
Keyestudio Mini Tank Robot V3 (Popular Edition)
lesson 8.2
motor driver pwm
http://www.keyestudio.com
*/
#define ML_Ctrl 4 // Definir el pin de control de dirección del motor izquierdo
#define ML_PWM 6 // Definir el pin de control PWM del motor izquierdo
#define MR_Ctrl 2 // Definir el pin de control de dirección del motor derecho
#define MR_PWM 5 // Definir el pin de control PWM del motor derecho
void setup()
{
pinMode(ML_Ctrl, OUTPUT);// Definir el pin de control de dirección del motor izquierdo como OUTPUT
pinMode(ML_PWM, OUTPUT);// Definir el pin de control PWM del motor izquierdo como OUTPUT
pinMode(MR_Ctrl, OUTPUT);// Definir el pin de control de dirección del motor derecho como OUTPUT
pinMode(MR_PWM, OUTPUT);// Definir el pin de control PWM del motor derecho como OUTPUT
}
void loop()
{
// adelante
digitalWrite(ML_Ctrl, HIGH); // Establecer la velocidad de control de dirección del motor izquierdo en HIGH
analogWrite(ML_PWM, 155); // La velocidad de control PWM del motor izquierdo es 155
digitalWrite(MR_Ctrl, HIGH); // Establecer la velocidad de control de dirección del motor derecho en HIGH
analogWrite(MR_PWM, 155); // La velocidad de control PWM del motor derecho es 155
delay(2000);// retardo de 2s
// atrás
digitalWrite(ML_Ctrl, LOW); // Establecer la velocidad de control de dirección del motor izquierdo en LOW
analogWrite(ML_PWM, 100); // La velocidad de control PWM del motor izquierdo es 100
digitalWrite(MR_Ctrl, LOW); // Establecer la velocidad de control de dirección del motor derecho en LOW
analogWrite(MR_PWM, 100); // La velocidad de control PWM del motor derecho es 100
delay(2000);// retardo de 2s
// izquierda
digitalWrite(ML_Ctrl, LOW); // Establecer la velocidad de control de dirección del motor izquierdo en LOW
analogWrite(ML_PWM, 100); // La velocidad de control PWM del motor izquierdo es 100
digitalWrite(MR_Ctrl, HIGH); // Establecer la velocidad de control de dirección del motor derecho en HIGH
analogWrite(MR_PWM, 155); // La velocidad de control PWM del motor derecho es 155
delay(2000);// retardo de 2s
// derecha
digitalWrite(ML_Ctrl, HIGH); // Establecer la velocidad de control de dirección del motor izquierdo en HIGH
analogWrite(ML_PWM, 155); // La velocidad de control PWM del motor izquierdo es 155
digitalWrite(MR_Ctrl, LOW); // Establecer la velocidad de control de dirección del motor derecho en LOW
analogWrite(MR_PWM, 100); // La velocidad de control PWM del motor derecho es 100
delay(2000);// retardo de 2s
// detener
digitalWrite(ML_Ctrl, LOW); // Establecer la velocidad de control de dirección del motor izquierdo en LOW
analogWrite(ML_PWM, 0); // La velocidad de control PWM del motor izquierdo es 0
digitalWrite(MR_Ctrl, LOW); // Establecer la velocidad de control de dirección del motor derecho en LOW
analogWrite(MR_PWM, 0); // La velocidad de control PWM del motor derecho es 0
delay(2000);// retardo de 2s
}
```
Cargue el código, la velocidad del motor es más lenta.
Una corriente baja hará que el motor gire lentamente.