Introduction: ¡Controlemos Ese Motor!

About: Somos el espacio de imaginación, experimentación y prototipado de la PUCV.

¡Hola chic@s! En esta oportunidad armaremos un control para manejar la velocidad y dirección mediante Arduino y un circuito simple que consta de un controlador (puente H), potenciómetro, un par de botones, leds y diodos. Los objetivos son:

  • Aprender a manejar motores DC con Arduino mediante una interfaz física (potenciómetro y botones).

Puedes revisar la simulación lista acá.

¿List@?

Supplies

Los materiales son:

  • 1 x Arduino UNO.
  • 1 x Motor dc.
  • 1 x L293D.
  • 1 x Potenciómetro 10k Ohm.
  • 1 x Batería 9 V.
  • 2 x Pulsadores.
  • 2 x Condensadores 1 uF.
  • 2 x Resistencia 1k Ohm.
  • 2 x Resistencia 10k Ohm.
  • 2 x Resistencias 220 Ohm.
  • 2 x Leds Rojos.
  • 4 Diodos 1N1004

Step 1: ¡Preparemos La Base Para Trabajar!

Primero que nada debemos abrir Tinkercad Circuits y poner nuestra Arduino y protoboard para trabajar, entonces:

  1. Dirigite a la pestaña de componentes Básicos y selecciona Arduino, tal cual se ve en la imagen 1.
  2. Arrastra el Arduino + placa de pruebas al espacio de trabajo (imagen 2 como referencia).
  3. Quitamos el cable rojo que conecta la linea de 5 V de arriba con la de abajo de la protoboard (imagen 3).
  4. Luego vamos a todos los componentes (imagen 4).
  5. Buscamos una pila de 9 V, la agregar y conectamos a la protoboard tal cual se ve en la imagen 5.

Si estas trabajando con una Arduino real solo debes conectar los jumpers/cables como se muestra en la imagen 2.

¡Listo!

Step 2: ¡Agreguemos Los Componentes! - Control De Motor + Motor

Los pasos a seguir son:

  1. Buscamos el L293D y lo arrastramos a la protoboard (imagen 1).
  2. Conectamos a las lineas de alimentación y Arduino (imagen 2).
  3. Buscamos y arrastramos un diodo al espacio de trabajo para rotarlo apretando el botón de giro 6 veces (imagen 3).
  4. Luego lo posicionamos en los lugares mostrados en la imagen 4.
  5. Por último agregamos un motor dc y realizamos las conexiones entre el motor y el controlador, tal cual se aprecia en la imagen 5.

¡Listo!

Step 3: ¡Agreguemos Los Componentes! - Potenciómetro + Leds

Los pasos a seguir para esta sección son:

  1. Buscar y arrastrar dos resistencias a la protoboard, luego cambiar sus valores a 220 Ohm (imagen 1).
  2. Buscar y arrastrar dos Leds rojos a la protoboard (imagen 2).

  3. Buscar y arrastrar un potenciómetro al espacio de trabajo, rotarlo apretando 6 veces el botón de girar (imagen 3).
  4. Hacer las conexiones a las lineas de alimentación y Arduino, ve la imagen 4 como referencia.

Si usas una Arduino real solo fijate en la imagen 4 para ver como deben quedar puestos los componentes.

Step 4: ¡Agreguemos Los Componentes! - Botones

Los pasos a seguir para esta parte son:

  1. Buscamos y arrastramos los pulsadores a la protoboard (imagen 1).
  2. Buscamos y arrastramos los capacitores a los lados de los pulsadores, les cambiamos los valores a 1 uF (imagen 2).
  3. Arrastramos una resistencia al espacio de trabajo, la rotamos apretando el botón de giro 3 veces y le cambiamos el valor a 1k Ohm (imagen 3).
  4. Luego lo llevamos a las posiciones mostradas en la imagen 4.
  5. Buscamos y arrastramos dos resistencias a la posición de la protoboard indicada en la imagen 5, les cambiamos sus valores a 10k Ohm.
  6. Realizamos las conexiones a la Arduino y lineas de alimentación tal cual se ve en la imagen 6.

¡Listo!

Step 5: ¡Hora De Programar!

Ahora revisaremos y entenderemos el código que se usará en la Arduino, el cual es:

int   direccion         = 0;
float control_velocidad = 0;

void setup()
{
pinMode(12, INPUT );
pinMode(11, INPUT );
pinMode(10, OUTPUT);
pinMode(9 , OUTPUT);
pinMode(6 , OUTPUT);
pinMode(5 , OUTPUT);
Serial.begin(9600);
}

void loop()
{
control_velocidad = analogRead(A5)/1023.0;
Serial.println(control_velocidad);
if (digitalRead(12) == LOW) direccion = 1;
else if(digitalRead(11) == LOW) direccion = -1;
else direccion = 0;
switch(direccion)
{
case 1:
digitalWrite(10,HIGH);
digitalWrite(9 ,LOW );
analogWrite(6, 0);
analogWrite(5, 255*control_velocidad);
break;
case -1:
digitalWrite(10,LOW );
digitalWrite(9 ,HIGH);
analogWrite(6, 255*control_velocidad);
analogWrite(5, 0);
break;
default:
digitalWrite(10,LOW);
digitalWrite(9 ,LOW);
analogWrite(6, 0);
analogWrite(5, 0);
}
delay(25);
}

Hay dos variables globales,una de tipo int (entero) y otra float (con decimales):

int   direccion         = 0;
float control_velocidad = 0;

La primera es direccion, la cual si es 1 o -1 hará que el motor gire a un lado u otro, cuando es 0 nada se mueve, el segundo es control_velocidad, en el cual regulará la velocidad del motor.

En el void setup(){} están las siguientes instrucciones:

void setup()
{
pinMode(12, INPUT );
pinMode(11, INPUT );
pinMode(10, OUTPUT);
pinMode(9 , OUTPUT);
pinMode(6 , OUTPUT);
pinMode(5 , OUTPUT);
}

Es una cosa que se realiza, con pinMode(A,B) le decimos a la Arduino que el pin A sea usado como entrada (INPUT) o salida (OUTPUT).

Para void loop(){} se tiene que:

void loop()
{
control_velocidad = analogRead(A5)/1023.0;
if (digitalRead(12) == LOW) direccion = 1;
else if(digitalRead(11) == LOW) direccion = -1;
else direccion = 0;
switch(direccion)
{
case 1:
digitalWrite(10,HIGH);
digitalWrite(9 ,LOW );
analogWrite(6, 0);
analogWrite(5, 255*control_velocidad);
break;
case -1:
digitalWrite(10,LOW );
digitalWrite(9 ,HIGH);
analogWrite(6, 255*control_velocidad);
analogWrite(5, 0);
break;
default:
digitalWrite(10,LOW);
digitalWrite(9 ,LOW);
analogWrite(6, 0);
analogWrite(5, 0);
}
delay(25);
}

Dividiremos esta parte en dos, la primera es:

  control_velocidad = analogRead(A5)/1023.0;
if (digitalRead(12) == LOW) direccion = 1;
else if(digitalRead(11) == LOW) direccion = -1;
else

En esta sección asignamos un valor de 0.0 a 1.0 a control_velocidad, luego mediante la función de decisión if(digitalRead(12) == LOW) direccion = 1 indicamos que si el botón conectado al pin 12 esta apretado, la variable direccion será 1, de no cumplirse la condición se evalua la siguiente con else if(digitalRead(11) == LOW) direccion = -1 donde si el botón anterior no está apretado, pero el conectado al pin 11 si, la direccion será -1, si nada de esto pasa else dice que nada se realizará.

La segunda parte consta de las siguiente instrucciones:

  switch(direccion)
{
case 1:
digitalWrite(10,HIGH);
digitalWrite(9 ,LOW );
analogWrite(6, 0);
analogWrite(5, 255*control_velocidad);
break;
case -1:
digitalWrite(10,LOW );
digitalWrite(9 ,HIGH);
analogWrite(6, 255*control_velocidad);
analogWrite(5, 0);
break;
default:
digitalWrite(10,LOW);
digitalWrite(9 ,LOW);
analogWrite(6, 0);
analogWrite(5, 0);
}

La función switch(A){ case B: } que evalua el valor de la varaible A, entonces si coincide con el valor B, las instrucciones dentro de case B: serán ejecutadas, sino evaluará otros casos hasta que llegue a default, la que se ejecuta cuando la variable no coincide con ni un caso, entonces si direccion es 1 el motor se moverá a la izquierda y se prenderá el el led conectado al pin 10, si es -1 el motor se mueve a la derecha y se prende el led de la derecha, si no es ni uno de los valores anteriores los leds no se prenden ni el motor se mueve.

Step 6: ¡Veamos Nuestro Resultado!

¡Listo!