CONTROL DE MOTORES DC
En el apartado del capítulo anterior correspondiente a los motores no
hablamos de cómo escribir código para controlar motores DC. Esto es
porque no existe una librería Arduino específica para ellos, ya que estos
dispositivos se pueden controlar con simples señales analógicas.
Cuanto mayor sea el valor de la salida PWM enviado al motor, a más
voltaje estará sometido y, por tanto, más rápido girará. Así de simple.
Probaremos este funcionamiento con un circuito tal como el siguiente:
Lo primero que llama la atención es la necesidad de utilizar una
alimentación externa (en este caso, una pila de 9 V) porque los motores
por lo general realizan un elevado consumo, y con los 40 mA y 5 V que
ofrecen los pines de la placa Arduino no es suficiente. Lo segundo que
llama la atención es el transistor. En este circuito lo utilizamos como
simple válvula accionada por la señal PWM proveniente de la placa. Si
esta vale 0, el transistor mantendrá abierto el circuito del motor y este
no girará. A medida que se vaya aumentando el valor de voltaje PWM
enviado a la base del transistor, por esta circulará más corriente. Esto
provocará que entre el colector y el emisor vaya pasando más y más
corriente (o dicho de otra forma, que se vaya reduciendo la resistencia
entre estos dos puntos más y más). Esto provocará a su vez que el
motor vaya siendo sometido a un mayor potencial y por tanto, que vaya
girando más rápido. El caso extremo aparece cuando el transistor actúa
como un simple circuito cerrado; esto ocurre al llegar a un determinado
valor de la señal PWM, el cual provoca la llamada “intensidad de
saturación” en la base del transistor. En ese momento, la resistencia
entre colector y emisor es nula, por lo que el motor se somete a la
tensión íntegra ofrecida por la fuente, y, por tanto, el motor gira a la
máxima velocidad.
Está claro que si en vez de haber sometido el transistor a una señal
PWM, lo sometiéramos a una señal digital, el transistor actuaría como
un interruptor, parando o moviendo el motor según si recibe una señal
LOW o HIGH, respectivamente.
Es importante aclarar que en el esquema hemos utilizado un transistor
NPN de tipo Darlington modelo TIP120 (otro similar sería el BD645). El
TIP120 puede trabajar sometido a tensiones entre el colector y el
emisor (Vce) de hasta 60 V pero admite una corriente por el colector (Ic)
de hasta tan solo 5 A. Por otro lado, hay que tener en cuenta la
ubicación de sus patillas para comprender el diseño del circuito:
mirándolo de frente, la base es su patilla izquierda, el colector es su
patilla central y el emisor es su patilla derecha; en otro modelo de
transistor las patillas pueden estar intercambiadas. A destacar también
el divisor de tensión (2 KΩ sería un buen valor) conectado en serie a su
base.
El mismo circuito lo podríamos haber diseñado utilizando un transistor
de tipo MOSFET (por ejemplo, el RFP30N06LE). En ese caso, la única
diferencia es sustituir la resistencia en serie del circuito anterior por una
resistencia “pull-up” (de 10 KΩ por ejemplo) situada entre el pin de
salida PWM de la placa Arduino y tierra. Y ya está. La ventaja de utilizar
este transistor es que, aunque su Vce máximo admitido sigue siendo de
60 V, la Ic máxima es de 30 A, pudiendo ser usado por tanto en circuitos
con mucho mayor consumo. Podemos utilizar otros transistores
diferentes (incluso un optoacoplador), pero en todo caso deberemos
comprobar en su datasheet que sus Vce e Ic máximos sean valores
dentro del rango de trabajo del circuito.
Por otro lado, la resistencia que conectemos en serie a la base del
transistor (necesaria para no dañarla) debe ser de un valor lo
suficientemente pequeño como para poder alcanzar la corriente mínima
con la que se llega al estado de saturación del transistor. El valor
adecuado de esta resistencia se puede calcular mediante la expresión
(Vpin – 0,7)/Ibsat , donde Vpin es la tensión que proporciona el pin de la
placa Arduino donde está conectada la base (en nuestro caso, es
siempre 5 V), 0,7 V es la caída de tensión típica entre la base y el emisor
del transistor (aunque se puede mirar en el datasheet del transistor
como Vbe) e Ibsat es precisamente la corriente mínima con la que se llega
al estado de saturación del transistor, más allá de la cual no se obtiene
más amplificación en Ic . Si Ibsat no nos lo proporcionaran en el
datasheet, se podría calcular fácilmente a partir de la expresión Ibsat =
Icmax/hFE , donde tanto Icmax como hFE sí que son consultables en el
datasheet (hFE es la llamada ganancia de corriente del transistor: si hay
varios valores se ha de elegir el más pequeño).
Lo importante del circuito anterior es fijarse en que hemos utilizado un
transistor para “desacoplar” dos circuitos que funcionan a diferentes
voltajes para que no haya peligro de dañarlos. Es decir, los 9 V
utilizados para alimentar el motor no son nunca percibidos por la placa
Arduino, la cual continúa trabajando como siempre a 5 V. El transistor
hace pues de barrera entre los dos circuitos, de tal forma que uno
(sometido a 5 V) simplemente sirve para controlar el funcionamiento
del otro (sometido a 9 V) pero sin peligro para el primero. Si se desea
una protección algo más sofisticada, se puede sustituir el transistor por
un optoacoplador, pero en el circuito anterior esto no es necesario.
Es interesante conocer la potencia consumida por el transistor en un
circuito como este, calculable mediante la expresión P = Ic ·VCE. En el
modo de corte, Ic = 0, por lo que la potencia consumida es 0, y en el
modo de saturación VCE = 0 (aproximadamente), por lo que la potencia
también es prácticamente nula. Esto quiere decir que el transistor no
debería calentarse en ningún rango de su uso y no se necesita tener en
cuenta ninguna potencia máxima de trabajo.
Por último, la presencia del diodo tiene una razón: hace de diodo “fly-
back”. Ya hemos comentado en el capítulo anterior que cuando se deja
de alimentar una bobina (y los motores están hechos de bobinas)
durante unos milisegundos entre los bornes del motor aparece un
voltaje de hasta varios centenares de voltios polarizado a la inversa del
de la fuente. Cuando hay alimentación, el diodo está situado “al revés” y
no hace nada, pero cuando aparece ese voltaje inverso, el diodo
permite que la corriente generada retorne al motor y no se dirija al
transistor (ya que si no, lo freiría). Necesitamos por tanto un diodo lo
suficientemente rápido para reaccionar al voltaje inverso y lo
suficientemente fuerte para resistirlo: el modelo 1N4001 o SB560 son
buenas opciones.
Un error común en el principiante es olvidarse de conectar el emisor del
transistor, además de al polo negativo de la fuente, al pin GND de la
placa. Esta conexión es necesaria porque que la señal PWM necesita un
camino de retorno.
Otro detalle que debemos tener en cuenta es que aunque podemos
considerar que el montaje anterior se compone de dos circuitos
separados por el transistor (el circuito del motor y el circuito de la señal
PWM), estos están interrelacionados, por lo que es fundamental que las
tierras de ambos sean comunes. Es por eso que el polo negativo de la
fuente está conectado al pin GND de la placa Arduino.
Añadiremos ahora al circuito anterior un potenciómetro (en el pin de
entrada analógica nº 2, por ejemplo), de tal manera que la velocidad de
giro del motor venga ahora dada por el valor leído de la resistencia
variable. El esquema eléctrico del nuevo diseño ha de ser así:
El código anterior es perfectamente válido para cualquier otra tipo de
entrada analógica, como las que veremos en el capítulo siguiente. Así,
un termistor o un fotorresistor se comportan de forma equivalente a un
potenciómetro, por lo que podríamos diseñar circuitos que pudieran en
marcha un motor cuando se detectara cierta cantidad de luz (para por
ejemplo, bajar una persiana) o cuando se detectara una cierta
temperatura (para por ejemplo activar un ventilador) ,etc.
No debería costar demasiado sustituir el potenciómetro del diseño
anterior por un pulsador, y conseguir que el motor solamente gire
cuando se mantenga apretado el pulsador. Se deja como ejercicio.
Otro ejercicio podría ser probar de enviar, tal como ya hicimos con los
servomotores, un dato numérico a través del canal serie para, en este
caso, especificar la velocidad a la que deseamos girar el motor. Se deja
como ejercicio.