4.-MOTOR DC+L293D


MOTORES DC

ÍNDICE:
0.- TEORÍA: MOTOR DC
1.- PRÁCTICA: MOTOR CON TRANSISTOR
2.- PRÁCTICA: MOTOR CON CIRCUITO INTEGRADO.





0.-TEORÍA: MOTORES DC


Arduino (UNO) no proporciona corriente suficiente para hacer funcionar, en condiciones "dignas", un motor de corriente continua de los que solemos usar en el aula-taller de Tecnologías (motor DC). 

Conviene alimentar Arduino con una fuente externa (7 -12 V) para poder proporcionar intensidad necesaria para el par motor requerido en los proyectos.

Existen "shields" o tarjetas que se encajan sobre Arduino y le añaden funciones específicas como mover motores DC.
 
Además de utilizar una shield específica de motores DC, tenemos otras posibilidades para ponerlo en marcha: 







1.- PRÁCTICA: MOTOR CON TRANSISTOR



El transistor es un componente analógico con infinidad de aplicaciones.

Como se observa en la imagen, es un dispositivo con tres pines llamados emisor (E), colector (C) y base (B). El funcionamiento a groso modo es sencillo: Si suministramos "cierta" cantidad de corriente al terminal llamado base, entre los terminales emisor y colector circulará una corriente proporcional a la que entra por la base. 

Puede ser unas 100 veces mayor (este valor dependerá del transistor y se llama ganancia), por lo tanto, lo que tenemos es un amplificador de corriente, o sea, que con una intensidad pequeña podemos obtener una más grande entre los terminales emisor y colector. 

Si a estos dos terminales conectamos un motor DC conseguiremos hacerlo girar con garantías. Cuando no hay corriente en la base (o es muy pequeña) el colector y emisor están desconectados y no circulará corriente entre ellos.

Desde Arduino (salida digital) actuamos sobre la base si enviamos un HIGH al pin digital donde la conectemos (pin 6 en el esquema). El transistor tiene que tener suficiente ganancia. 




Se conecta un diodo de protección en antiparalelo (1N004). Cuando el motor se para las bobinas se desmagnetizan y se descargan de energía eléctrica. El diodo proporciona un camino para su descarga (la energía se disipa en forma de calor en el diodo) y así se evita que sufra el transistor.








(  Otra posibilidad que protege el transistor es, en vez de conectar directamente el motor al colector del transistor, ubicar un relé en esa posición y accionar el motor con alimentación independiente con la conmutación del relé. O también, usar un par de transistores según el  ejemplo de montaje con TIP121 (NPN, par Darlington):
 https://www.fairchildsemi.com/datasheets/TI/TIP120.pdf
)

CÓDIGO DEL PROGRAMA:
// Activa y desactiva un 
// motorDC conectado al pin6 
// durante 2 segundos

void setup() {
  pinMode(6, OUTPUT);
}

void loop() {
  digitalWrite(6, HIGH);
  delay(2000);
  digitalWrite(6, HIGH);
  delay(2000);
}

ACTIVIDADES:
1.. Diseña el montaje mediante  un relé conectado en el colector del transistor.


 





2.- PRÁCTICA: MOTOR DC CON EL CIRCUITO INTEGRADO L293.



El circuito integrado L293 permite controlar motoresDC de pequeña potencia. Para utilizarlo hay que hacer un montaje externo a Arduino, en una placa de pruebas, y alimentar a los motores a través de este circuito integrado.


El CI L293 tiene las siguientes características:

  • Se pueden controlar hasta 2 motores.
  • Proporciona 1A a los motores (en total) y permite cambiar el sentido de giro.
  • Utiliza un puente en H que funciona según se observa en las figuras (internamente utiliza transistores para conmutar*) :

Modos de operación para invertir el sentido de giro:

(
Datasheet: http://www.me.umn.edu/courses/me2011/arduino/technotes/dcmotors/L293/l293.pdf
)

Como vimos en la sección de Alimentación eléctrica de Arduino NO es recomendable alimentar Arduino, cuando se trabaja con elementos de "alto" consumo como pueden ser los motores DC, con el cable USB. Tenemos la posibilidad de proporcionar más (mili)amperios a través de la conexión jack de Arduino. En el pin Vin tendremos una salida del voltaje que apliquemos por el jack que servirá para alimentar a los motores a través del integrado mediante el pin 8 (VC ó Vcc2). Para ver los márgenes de voltaje de trabajo del CI consultar la hoja de datos del fabricante.


Vamos a ver de qué manera se pueden activar los motores DC para hacer una secuencia sencilla de giro. Primero de todo vamos a ver cómo se conecta todo.


Las conexiones del circuito integrado según podemos ver en la hoja de datos del fabricante son las siguientes:


Vcc2(VC), pin 8 del L293:  El voltaje que se introduzca aquí 
alimentará a los motores (Vin de Arduino

Vcc1(VSS), pin 18 del L293: El voltaje que se introduzca aquí 
alimentará al propio circuito integrado (+5V de Arduino)

 
Las conexiones del circuito con Arduino las podemos ver en el siguiente esquema:



Vamos a detallar la correspondencia entre pines de Arduino y del circuito L293


Para saber la orientación del sentido de giro disponemos de la siguiente tabla de verdad:



El programa hace que el motor gire en un sentido durante 1 segundo, cambie de sentido y gire durante otro segundo. Esta secuencia la repite 5 veces y después el motor se para.


CÓDIGO: 
#define ENABLE 3
#define DIRB 4
#define DIRA 5

void setup() {
  int i = 0;
  pinMode(ENABLE,OUTPUT);
  pinMode(DIRA,OUTPUT);
  pinMode(DIRB,OUTPUT);
  digitalWrite(ENABLE,HIGH);
  for (i=0;i<5;i++) {
    digitalWrite(DIRA,HIGH); 
    digitalWrite(DIRB,LOW);
    delay(1000); 
    digitalWrite(DIRA,LOW);  
    digitalWrite(DIRB,HIGH);
    delay(1000); 
  }
  digitalWrite(ENABLE,LOW); 

}
void loop(){
  
}


Pregunta Verdadero-Falso

Con el CI L293 podemos activar también relés, bobinas y cualquier otro dispositivo que requiera una corriente considerable además de los motores DC

Para el L293: alimentando con un nivel ALTO el pin 1, un nivel BAJO el pin 2 y un nivel ALTO el pin 7 hacemos que el motor gire a favor de las agujas del reloj.

Con el CI L293 puedo accionar hasta 6 motores DC simultáneamente.

La instrucción digitalWrite(ENABLE,LOW); del programa anterior, para el motor DC independientemente del resto de señales.




3.- PRÁCTICA: MOTOR DC CON UNA SHIELD (L293D)

Una shield (o mochila) es un accesorio  de Arduino que nos ahorra tener que usar muchas conexiones. En esta ocasión  es un aparato que se usa para suministrar mayores potencias en  tecnología lógica DTL o TTL tanto a motores DC, como  a relés, motores paso a paso, etc.

Esta mochila utiliza el chip L293D basado en dos puentes para conectar dos posibles motores. Una alimentación externa suministrará la potencia que queramos. Los diodos de protección están incluidos.

Este aparato es adecuado para hacer aplicaciones de conmutacion a una  frecuencia superior  a 5Hz.



CARACTERÍSTICAS DE ESTA MOCHILA:
*New L293D motor shield, the input voltage DC4.5-25V,
*600mA OUTPUT CURRENT CAPABILITY PER CHANNEL
*1.2A PEAK OUTPUT CURRENT (non repetitive)PER CHANNEL
*ENABLE FACILITY
*OVERTEMPERATURE PROTECTION
*LOGICAL "0" INPUT VOLTAGE UP TO 1.5 V(HIGH NOISE IMMUNITY)
*INTERNAL CLAMP DIODES


Pines de conexión por canal:
Functionpins per Ch. Apins per Ch. B
DirectionD12(IN1)D13(IN2)
PWMD3D11
BrakeD9D8
Current SensingA0A1

Ejemplo:
  • D12(IN1)= HIGH Y D13(IN2)=LOW >>>MOTOR1 AVANZA
  • D13(IN1)= LOW Y D13(IN2)=HIGH >>>MOTOR1 RETROCEDE.
  • D12(IN1)=LOW Y D13(IN2)=LOW >>> MOTOR1 PARA
Si no se necesitan el Brake (freno) ni la Current Sensing (detección de corriente) y se quiere usar  más pines para otras aplicaciones, se puede desactivar estas características quitando el respectivo jumper de la shield. 

Las otras conexiónes que ofrece la shield son:
  • Terminales con tornillo para los dos motores y la alimentación externa.
  • 2 conectores TinkerKit de dos entradas analógicas (en blanco), conectados a A2 y A3.
  • 2 conectores TinkerKit de dos salidas analógicas (en naranja en el centro), conectados a las salidas PWM en los pines D5 y D6. 
  • 2 conectores TinkerKit de la interfaz TWI (en blanco con 4 pines), uno de entrada y otro de salida para uno.


CÓDIGO SIMPLE Y FUNCIONAL
void setup() {
  pinMode(12, OUTPUT); 
  pinMode(9, OUTPUT);
 }
void loop() {
  digitalWrite(12, HIGH);
  digitalWrite(9, LOW);  
  delay(1000);
  digitalWrite(12,LOW);
  delay(2000);
  digitalWrite(12, LOW);
  digitalWrite(9, HIGH);  
  delay(3000);
  digitalWrite(9,LOW);
  delay(6000);
}

ACTIVIDADES:
1.- Ahora varía la velocidad del motor cambiando el comando digitalWrite(9,HIGH) por el de analogWrite(9,50) del tipo PWM. Prueba con distintos valores entre0 y 255 para ver el abanico de todas las velocidades posibles.


4.- PRÁCTICA: CONTROL VELOCIDAD MOTOR CON UN POTENCIÓMETRO.

Vamos a controlar el sentido de giro y la velocidad de un motor mediante un solo potenciómetro conectado en la  entrada analógica A0.

El valor leído en el potenciómetro estará entre 0 y 1023, mientras que el valor que se puede entregar en la salida de Arduino PWM debe estar entre 0 y 255. Por esta razón hay que mapearlo.


El valor pwm2 siempre debe ser contrario al pwm1. Así, cuando una entrada del chip L923D esté HIGH, la otra estará en LOW, y el motor girará en un  sentido u otro.

CÓDIGO DEL PROGRAMA:
#define DCHA_PIN 6  // pin6 de Arduino como entrada PWM
#define IZDA_PIN 5  //pin5 de Arduino como  la otra entrada PWM inversa a la anterior
#define POT_PIN A0   //entrada analógica del potenciómetro

void setup() {
   pinMode(DCHA_PIN, OUTPUT);
    pinMode(IZDA_PIN, OUTPUT);   
    pinMode(POT_PIN, INPUT);
}
void loop() {
   int lectura=analogRead(POT_PIN);    //leemos el potenciometro
   int pwm1= map(lectura,0,1023,0,255);  //hacemos  escala de valores
    int pwm1= map(lectura,0,1023,255,0);   //invertimos la escala en la otra entrada
   analogWrite(DCHA_PIN,pwm1);   //pasamos la potencia al motor
   analogWrite(IZDA_PIN,pwm2);    
   delay(100);
}