Automatizando una cuadriga

Objetivos

  • Presentaremos el chip L298, dual full bridge para control de motores.
  • Presentar el Shield Ardumoto.
  • Consumo de hasta 2 Amperios por cada motor.
  • Utilización del bluetooth.
  • Programación de aplicación de conducción con Appinventor.
  • Programar dos formas de conducción:
    • Conducción manual
    • Conducción automática.

Material necesario

# Material Descripción
1 placa arduino Arduino Uno o similar. Esta sesión acepta cualquier otro modelo de Arduino.
2 placa arduino Algunos cables de Protoboard.
3 placa arduino Un Shield Ardumoto.
4 placa arduino Un par de motores CC.
5 placa arduino Bluetooth HC-06.
6 placa arduino Portapilas para 2 baterías 18650 de litio.
7 placa arduino Baterías recargables 18650.

Impresión 3D para construir tu propia cuadriga.

Aquí tenéis los enlaces para que os descarguéis los archivos en 3D

placa arduino

Montaje y esquema

Este shield para Arduino es capaz de controlar dos motores de corriente continua. Esta basado en el robusto chip L298 y puede proporcionar hasta 2A por canal. La placa toma la alimentación del pin VIN de Arduino e incluye un LED azul y otro amarillo para indicar el sentido de giro en todo momento. Todas las lineas del driver están protegidas por diodos para evitar corrientes inversas que puedan dañarlo. Originalmente diseñado por SparkFun.

placa arduino

Incluye dos únicos bridge, lo que nos limita a dos motores CC o a un único paso a paso, pero a cambio tenemos todo el control mediante pines directos de Arduino.

También podemos apreciar que dispone de una pequeña área de pruebas y prototipos, donde podremos soldar componentes el bluetooth.

El shield utiliza 2 pines de Arduino para controlar cada motor. Uno regula la dirección de giro y el otro la velocidad mediante una señal PWM, lo que hacen un total de 4 pines dejando libres el resto.

placa arduino

El Ardumoto Shield se reserva los pines 12 y 13 para controlar la velocidad, y los pines 3 y 11, para controlar el sentido de giro de los motores A y B respectivamente.

PIN ARDUINO USO NOTAS
3 PWM Motor A Valores de 0 a 255
11 PWM Motor B Valores de 0 a 255
12 Sentido Motor A Es un Bool True / False
13 Sentido Motor B Es un Bool True / False

En el lado izquierdo de Ardumoto se pueden ver las conexiones para los motores A y B, así como un conector para alimentar los motores independientemente de la alimentación de Arduino.

placa arduino

No tiene demasiada importancia en qué orden conectáis los cables de los motores, siempre y cuando lo tengáis claro. Os recomiendo que os fijéis en los colores de los cables y conectéis ambas pares de igual modo para evitar sorpresas.

Fijaros también, que a los laterales de donde conectamos los motores hay un par de LEDs de colores que indican el estado del motor y su sentido de giro.

Las primeras conexiones y mientras hacemos nuestra base son las siguientes:

placa arduino

Imprimimos la base de la cuadriga:

placa arduino

Soldamos y conectamos el bluetooth. No os preocupéis, abajo pongo el esquema.

placa arduino

Y el esquema del circuito:

placa arduino

Porgrama de conducción.

Código del App Inventor 2.

placa arduino placa arduino

Pantalla principal, utilizaremos un botón con un a imagen como presentación si el usuario pulsa el botón pasaremos a la siguiente pantalla, si no lo hace pasados 3 segundos pasaremos de forma automática

placa arduino placa arduino

Segunda pantalla, el usuario podrá seleccionar el modo de conducción: manual o automática. Utilizaremos dos botones con sus correspondientes eventos para acceder a una pantalla o a otra:

placa arduino placa arduino

Pantalla de conducción manual, necesitaremos:

placa arduino
  • 1 SelectorDeLista, lo llamamos conectar.
  • 1 Botón, lo llamamos desconectar.
  • Una disposición en tabla (3 filas y 3 columnas).
  • 5 Botones, adelante, atras, derecha, izquierda y parar.
  • Un ClienteBluetooh1.
  • Un Notificador1.

Y su código:

placa arduino
placa arduino
placa arduino

Y para finalizar veremos la pantalla de conducción automática, necesitaremos:

placa arduino
  • 1 SelectorDeLista, lo llamamos conectar.
  • 1 Botón, lo llamamos desconectar.
  • Para la animación se ha optado por subir varias imágenes e ir cambiándolas mediante un reloj.
  • 1 botón de inicio y parar, un solo botón con las dos funcionalidades.
  • Un ClienteBluetooh1.
  • Un Notificador1.

Y el código:

Puedes descargar el código de la aplicación en AppInventor2 en el siguiente enlace: código

Puedes descargar la aplicación e instalarla en tu móvil, en el siguiente enlace: aplicación

El programa de control

El shield Ardumoto usa simplemente los pines de control que se muestra en la tabla de más arriba, por lo que no requiere ninguna librería especial para mover los motores sino que usamos Arduino y sus pines para controlar el L298N y por tanto la velocidad y sentido de los motores conectados.

El programa que nos presenta SparkFun es de lo más sencillo y lo vamos a usar como ejemplo de control. Empezamos con algunas definiciones:

    #include 
// definimos nuestro bluetooth
SoftwareSerial btl (4, 2);
int val;

#define CW  0     //Sentido 1
#define CCW 1    //Sentido 2

#define MOTOR_A 0
#define MOTOR_B 1

const byte PWMA = 3;   // control velocidad motor A
const byte PWMB = 11; // control velocidad motor B
const byte DIRA = 12;    // Dirección motor A
const byte DIRB = 13;    // Dirección motor B


void setup()
{
  // definimos los pines como salida
  pinMode(PWMA, OUTPUT);
  pinMode(PWMB, OUTPUT);
  pinMode(DIRA, OUTPUT);
  pinMode(DIRB, OUTPUT);
 
 // ponemos a low los pines del ardumoto
  digitalWrite(PWMA, LOW);
  digitalWrite(PWMB, LOW);
  digitalWrite(DIRA, LOW);
  digitalWrite(DIRB, LOW);

  // inicializamos el bluetooth
  btl.begin(9600);
}
        

Y ahora vamos a definir un par de funciones sencillas. La primera la usaremos para arrancar uno de los motores (parámetro motor) con un sentido (dir) y velocidad dados (spd):

 void accionMotor(byte motor, byte dir, byte spd){ 

if (motor == MOTOR_A){
   digitalWrite(DIRA, dir);
   analogWrite(PWMA, spd);
  }
  else if (motor == MOTOR_B){
            digitalWrite(DIRB, dir);
            analogWrite(PWMB, spd);
       }
}
        

Y la segunda es aún más sencilla, para parar un motor:

void stopMotor(byte motor){
  accionMotor(motor, 0, 0); }
        

Ahora haremos varias funciones para hacer que circule hacia adelante, atrás, derecha, izquierda y parar:

void adelante(){
  accionMotor(MOTOR_A, CCW, 255);
  accionMotor(MOTOR_B, CCW, 255);
}

void atras(){
  accionMotor(MOTOR_A, CW, 255);
  accionMotor(MOTOR_B, CW, 255);
}

void derecha(){
  accionMotor(MOTOR_B, CCW, 255);
  accionMotor(MOTOR_A, CCW, 0);
}
void izquierda(){
  accionMotor(MOTOR_A, CCW, 255);
  accionMotor(MOTOR_B, CCW, 0);
}

void parar(){
  stopMotor(MOTOR_A);
  stopMotor(MOTOR_B);
}
        

Para terminar el cuerpo principal del programa, leerá las entradas por bluetooth y ejecutaremos las acciones correspondientes

void loop() {  
        if (btl.available() ){
                                  val = btl.read();
                                 delay(25);
        }
        if (val == '1'){
                 adelante();
        }
        if (val == '2'){
                         atras();
        }
        if (val == '3'){
                         izquierda();
        }
        if (val == '4'){
                        derecha();
        }
        if (val == '5'){
                       parar();
        }
       if (val == '6'){
               adelante();
               delay(3000);
               izquierda();
               delay(1000);
       }
   }
        

Podemos conectar un módulo de bluetooth, y poder controlar nuestra cuadriga con una aplicación de móvil.

Conectando el módulo en los pines 2 y 4 el programa quedaría así:

#include 
SoftwareSerial btl (4, 2);
int val;
#define CW  0     //Sentido 1
#define CCW 1     //Sentido 2

#define MOTOR_A 0
#define MOTOR_B 1

const byte PWMA = 3; //control velocidad motor A
const byte PWMB = 11; //control velocidad motor B
const byte DIRA = 12; //Dirección motor A
const byte DIRB = 13; //Direction motor B




void setup()
{
  // definimos los pines como salida
  pinMode(PWMA, OUTPUT);
  pinMode(PWMB, OUTPUT);
  pinMode(DIRA, OUTPUT);
  pinMode(DIRB, OUTPUT);

  // ponemos a low los pines del ardumoto
  digitalWrite(PWMA, LOW);
  digitalWrite(PWMB, LOW);
  digitalWrite(DIRA, LOW);
  digitalWrite(DIRB, LOW);

  // inicializamos el bluetooth
  btl.begin(9600);
}

void stopMotor(byte motor) {
  accionMotor(motor, 0, 0);
}

void accionMotor(byte motor, byte dir, byte spd) {
  if (motor == MOTOR_A) {
    digitalWrite(DIRA, dir);
    analogWrite(PWMA, spd);
  }
  else if (motor == MOTOR_B) {
    digitalWrite(DIRB, dir);
    analogWrite(PWMB, spd);
  }
}

void adelante() {
  accionMotor(MOTOR_A, CCW, 255);
  accionMotor(MOTOR_B, CCW, 255);
}

void atras() {
  accionMotor(MOTOR_A, CW, 255);
  accionMotor(MOTOR_B, CW, 255);
}

void derecha() {
  accionMotor(MOTOR_B, CCW, 255);
  accionMotor(MOTOR_A, CCW, 0);
}
void izquierda() {
  accionMotor(MOTOR_A, CCW, 255);
  accionMotor(MOTOR_B, CCW, 0);
}

void parar() {
  stopMotor(MOTOR_A);
  stopMotor(MOTOR_B);
}

void loop() {
  if (btl.available() ) {
    val = btl.read();
    delay(25);
  }
  if (val == '1') {
    adelante();
  }
  if (val == '2') {
    atras();
  }
  if (val == '3') {
    izquierda();
  }
  if (val == '4') {
    derecha();
  }
  if (val == '5') {
    parar();
  }
  if (val == '6') {
    adelante();
    delay(3000);
    izquierda();
    delay(1000);
  }
}