13 - Electrónica para E/S analógicas: Control de motores

Volver al curso

Motor DC con driver L293; servomotor con protocolo I2C; motor paso a paso con driver ULN2003
Motor DC con driver L293; servomotor con protocolo I2C; motor paso a paso con driver ULN2003

Tipos de motores:

Conexión básica de un motor de corriente alterna con relé:

  1. La salida digital se pone en HIGH y da tensión a la base del transistor.
  2. Éste satura y provoca un cortocircuito (0,2V) entre colector y emisor, haciendo pasar corriente por la bobina del relé. (parte de control)
  3. En la parte de potencia, el contacto asociado a la bobina se cierra, cerrando el circuito de corriente alterna. El motor gira!
  4. Al poner la salida digital a LOW el transistor “abre” entre colector y emisor, provocando que la bobina del relé deje de tener corriente.
  5. El contacto se abre y por tanto el motor se para.
  6. El diodo de libre circulación descarga la bobina de forma segura.

Coche de radiocontrol

Renault 5 Turbo Rally - marca Tamiya
Renault 5 Turbo Rally - marca Tamiya

Consta de:

Motores DC - driver L293

Sirve para controlar marcha/paro y sentido de giro de hasta dos motores de DC. Se vende de un circuito integrado DIP16.

Se controla mediante tres pines:

Ejemplo detallado del L293.

Manual del L293.

Es probable que la alimentación USB no baste para mantener Arduino + motores.

Control DC - Puente en “H” (“H-bridge”)

Los H-bridges son circuitos diseñados para cambiar el sentido de giro de motores DC. Recuerdan mucho a los rectificadores de onda completa por puente de Graetz:

Cuando cerramos S1 y S4, tenemos un sentido de giro, cuando cerramos S3 y S2, el sentido es el contrario
Cuando cerramos S1 y S4, tenemos un sentido de giro, cuando cerramos S3 y S2, el sentido es el contrario

El L293 es un puente en H con los diodos (en el dibujo transistores) integrados:

13.1 - Motor DC con control todo/nada

Realiza un control todo/nada de un motor DC usando un L293. Programa la siguiente secuencia:

  1. 5 segundos girando en sentido horario.
  2. 2 segundos de parada.
  3. 5 segundos girando en sentido antihorario.
  4. 2 segundos de parada.
  5. Repetir.

Tabla de funcionamiento del L293:

13.2 - Motor DC con control proporcional

Ahora cablea el motor usando una salida PWM (~) en la pata ENABLE. Modifica el programa para tener 5 tramos de velocidad (0, 51, … 255). La secuencia será:

  1. 5 segundos girando en sentido horario (un segundo en cada tramo de velocidad).
  2. 2 segundos de parada.
  3. 5 segundos girando en sentido antihorario (un segundo en cada tramo de velocidad).
  4. 2 segundos de parada.
  5. Repetir.

Servomotores

Son más caros, pero mucho más par que los motores DC. Se utilizan, por ejemplo, en coches teledirigidos (en la dirección o en el acelerador). En industria los hay con muchísimo más “par”. Según el ancho de pulso, se colocan en una posición u otra.

La programación es complicada… pero alégrate, alguien ha escrito la librería Servo.h

Una librería es una colección de funciones que sirven para facilitar la vida al programador al usar programas orientados a un ámbito concreto. Por ejemplo, matemáticas math.h, o periféricos como tarjetas de red ethernet.h

Esta es la idea: vinvular ángulo al ancho de pulso. Aparentemente se podría hacer con analogWrite(), pero el periodo no es válido, así que hay que hacer "bit banging" o mejor, usar una librería de alguien que ya lo haya programado.
Esta es la idea: vinvular ángulo al ancho de pulso. Aparentemente se podría hacer con analogWrite(), pero el periodo no es válido, así que hay que hacer "bit banging" o mejor, usar una librería de alguien que ya lo haya programado.
Conexión
Conexión

13.3 - Servo con control mediante potenciómetro

Prueba el ejemplo Knob para comprender el uso de Servo.h:

/*
 Controlling a servo position using a potentiometer (variable resistor)
 by Michal Rinott <http://people.interaction-ivrea.it/m.rinott>

 modified on 8 Nov 2013
 by Scott Fitzgerald
 http://www.arduino.cc/en/Tutorial/Knob
*/

#include <Servo.h>

Servo myservo;  // create servo object to control a servo

int potpin = 0;  // analog pin used to connect the potentiometer
int val;    // variable to read the value from the analog pin

void setup() {
  myservo.attach(9);  // attaches the servo on pin 9 to the servo object
}

void loop() {
  val = analogRead(potpin);            // reads the value of the potentiometer (value between 0 and 1023)
  val = map(val, 0, 1023, 0, 180);     // scale it to use it with the servo (value between 0 and 180)
  myservo.write(val);                  // sets the servo position according to the scaled value
  delay(15);                           // waits for the servo to get there
}

13.4 - Servo con control mediante teclado (serial)

Hacer un programa que reciba por puerto serie una posición (izquierda, centro, derecha) y coloque el servo en consecuencia.

Recuerda: Serial.available(), caracter = Serial.read()

 Motores paso a paso

Aportan el control más preciso. Se usan en impresoras. Tienen muchas bobinas que colocan y bloquean el motor en una posición concreta.

Usaremos la librería Stepper.h para programar.

13.5 - Stepper con control mediante potenciómetro

Básate en este: https://www.tinkercad.com/things/ik4eHFlIzxe-nivel-basico-motor-paso-a-paso-1

Prueba el ejemplo stepper motor knob.

/*
 * MotorKnob
 *
 * A stepper motor follows the turns of a potentiometer
 * (or other sensor) on analog input 0.
 *
 * http://www.arduino.cc/en/Reference/Stepper
 * This example code is in the public domain.
 */

#include <Stepper.h>

// change this to the number of steps on your motor
#define STEPS 100

// create an instance of the stepper class, specifying
// the number of steps of the motor and the pins it's
// attached to
Stepper stepper(STEPS, 8, 9, 10, 11);

// the previous reading from the analog input
int previous = 0;

void setup() {
  // set the speed of the motor to 30 RPMs
  stepper.setSpeed(30);
}

void loop() {
  // get the sensor value
  int val = analogRead(0);

  // move a number of steps equal to the change in the
  // sensor reading
  stepper.step(val - previous);

  // remember the previous value of the sensor
  previous = val;
}

13.5 - Stepper con driver ULN2003 (Voluntaria)

+0,25 en nota del trimestre

Pídeme el motor, programa una aplicación que permita gobernar un stepper por teclado con Serial.read(), muéstramela en funcionamiento y envíame el código.

https://www.inventable.eu/2018/02/09/uln2003-driver-salida-microcontroladores/

El controlador Adafruit

¡Qué pena haberlo descubierto tarde! https://learn.adafruit.com/adafruit-motor-shield-v2-for-arduino?view=all

Más adelante: LCDs, ethernet:


Fuente: “Introducción ao Arduino” - David Touceda Bugallo, 2014


Volver al curso