Antes de poder escribir la función para el control de motores de nuestro robot debemos realizar la prueba de motores con el objetivo de:
Identificarlos (IZQ-DER)
Establecer los estados para el sentido de giro de cada uno.
Comprobar cambios de velocidad.
Configurar la tabla de GPIO vinculados al driver.
Vista posterior - Motor IZQ - Motor DER
☼ Las pruebas fueron realizadas en el Robot MECHA 22, los resultados fueron:
► Motor Izquierdo ► Motor Derecho
▬ PWMA - GPIO D3 ▬ PMWB - GPIO D9
▬ AIN 1 - GPIO D5 ▬ BIN1 - GPIO D6
▬ AIN2 - GPIO D4 ▬ BIN2 - GPIO D7
Estos datos vamos a usarlos para las etiquetas de los pines en el código general y los modos de pin .
El encabezado del código:
// ► ETIQUETAS FUNCION MOTOR //
#define pwmi 3 // velocidad motor izq
#define mot_izq_A1 5
#define mot_izq_A2 4
#define pwmd 9 // velocidad motor der
#define mot_der_B1 7
#define mot_der_B2 6
void setup() {
// ► SET DE PINES LIBRERÍA MOTOR //
pinMode(mot_izq_A1,OUTPUT);
pinMode(mot_izq_A2,OUTPUT);
pinMode(mot_der_B1,OUTPUT);
pinMode(mot_der_B1,OUTPUT);
}
☼ Resultados de la prueba de sentido de giro de los motores.
► MOTOR IZQUIERDO - Velocidad PWMA (0 - 255)
☼ Adelante ☼ Atrás
▬ AIN1 - HIGH ▬ AIN1 - LOW
▬ AIN2 - LOW ▬ AIN2 - HIGH
► MOTOR DERECHO - Velocidad PWMB (0 - 255)
☼ Adelante ☼ Atrás
▬ BIN1 - LOW ▬ BIN1 - HIGH
▬ BIN2 - HIGH ▬ BIN2 - LOW
Con estos datos podemos escribir el código de la función para controlar la velocidad y el sentido de giro de los motores.
La velocidad de los mismos estará calculado por el control PID.
☼ Observación: los cálculos de velocidad del control PID pueden darnos valores positivos o negativos.
Positivos - Hacia adelante.
Negativos - Hacia atrás.
▬ Tenemos que programar nuestra función de manera que esta pueda controlar el sentido de giro de los motores aun con valores negativos, ya que el PWM del micro solo toma valores positivos.
☼ Función para control de motores:
/*creamos la función motores con dos variables tipo entero VmIzq - VmDer cunado llamemos a la función, podemos darle valor a estas variables*/
void motores (int VmIzq, int VmDer) {
/*Dirección Motor Izquierdo*/
if (VmIzq >= 0) { //si la velocidad calculada es mayor o igual a 0, el giro es adelante
digitalWrite(mot_izq_A1,HIGH); //colocamos los estados para sentido de giro adelante en el motor izq.
digitalWrite(mot_izq_A2,LOW);
}
else { // si la velocidad no es mayor a 0, esta será negativa, giro atrás
digitalWrite(mot_izq_A1,LOW); // colocamos los estados para sentido de giro atrás en el motor izq.
digitalWrite(mot_izq_A2,HIGH);
VmIzq = VmIzq * -1; // la velocidad no puede ser negativa, así que le cambiamos el signo
} // por que el sentido de giro atrás ya fue establecido.
/*Dirección Motor Izquierdo*/
if (VmDer >= 0) { // si la velocidad calculada es mayor o igual a 0, el giro es adelante
digitalWrite(mot_der_B1,HIGH); // colocamos los estados para sentido de giro adelante en el motor der.
digitalWrite(mot_der_B2,LOW);
}
else { // si la velocidad no es mayor a 0, esta será negativa, giro atrás
digitalWrite(mot_der_B1,LOW); // colocamos los estados para sentido de giro atrás en el motor der.
digitalWrite(mot_der_B2,HIGH);
VmDer = VmDer * -1; // la velocidad no puede ser negativa, así que le cambiamos el signo
} // por que el sentido de giro atrás ya fue establecido.
analogWrite(pwmi,VmIzq); // escribimos la velocidad en la salida PWM del micro para motor izq.
analogWrite(pwmd,VmDer); // escribimos la velocidad en la salida PWM del micro para motor der.
}
/* Con el nuevo bucle del código los valores y sentidos se ajustaran a lo que fue calculado por el PID*/
► Función de motores en el bucle de marcha.
Para llamar a la función y cargarle los valores tenemos que colocar la siguiente linea de código:
motores(0,0); // en este caso la velocidad será 0 en cada motor.
Ejemplos de la función motores:
motores(120,0); // motor izq hacia adelante a 120 de velocidad - motor der en 0
motores(0,120); // motor izq en 0 - motor der hacia adelante a 120 de velocidad
motores(-120,0); // motor izq hacia atrás a 120 de velocidad - motor der en 0
motores(0,-120); // motor izq en 0 - motor der hacia atras a 120 de velocidad
☼ Comprobación de la función en el Robot MECHA 22.
motores(120,0);
motores(0,120);
motores(-120,0);
motores(0,-120);