Arduino + motor DC: circuito PWM
Un Arduino, como cualquier microcontrolador, es incapaz de proporcionar la potencia (el amperaje) que necesita un motor para funcionar, por lo que debemos emplear una fuente externa y una fase de potencia: la más simple posible se basa en un transistor MOSFET de nivel lógico.
Su funcionamiento es el siguiente: una señal lógica alta (5V) abre la puerta y permite el paso de la corriente, una señal de nivel bajo (0V) cierra la puerta e impide el paso de corriente. Esta señal que se debe transmitir tiene la ventaja de emplear un amperaje mínimo, del orden de mili o nanoamperios, asumible por el Arduino.
A la derecha un esquema del montaje donde se puede ver el Arduino, el MOSFET y el motor. También se incluye una resistencia en la puerta y un diodo de protección.
El tren de pulsos PWM
El lector avispado, no obstante, señalará que esto sólo permite al Arduino mantener el motor apagado o a máxima potencia (señal binaria), mientras que nosotros pretendíamos obtener una señal analógica, esto es, variable a voluntad entre 0V y 5V; y es más, tendrá toda la razón! Pero, afortunadamente, hay una manera de obtener lo segundo a partir de lo primero: el tren de pulsos PWN (pulse width modulation):
Se emite una señal de pulsos como la representada arriba, donde sea posible variar la relación \(D\) entre tiempo de señal alta y tiempo de señal baja (\(D=\frac{\text{pulse width}}{\text{period}}\in [0,1]\) en la figura). Los dispositivos analógicos que se encuentren esta señal la percibirán como una señal constante, cuyo voltaje será el valor medio de la función de pulsos:
%%% V_{\text{medio}}=\frac{1}{T}\int_0^T f(t)\ dt=D\cdot V^++(1-D)\cdot 0=D\cdot V^+ %%%
Montaje
Lo importante de esta soloción es que el MOSFET es lo suficientemente rápido como para “transmitir” la señal PWM, es decir, se abre y se cierra según se lo indica el Arduino, con lo que la señal PWM se mantiene intacta (pero ya a mayor voltaje e intensidad) hasta llegar al motor, donde actúa como un valor analógico constante. El montaje sería pues el siguiente:

Nótese el diodo de protección contra corrientes de retorno del motor, importante! A modo de ejemplo, los componentes utiliados en nuestro montaje son (se incluyen sus datasheets en los enlaces):
- Diodo MOSFET: modelo BUZ11
- Diodo protección: diodo Schottky SB320
- Resistencia: entre 10K ~ 1M
- Motor: motor DC de 12V
Utilización
Una vez conectado correctamente y alimentado el montaje, ya podemos controlar el motor mediante el Arduino, en concreto, haciendo uso de la función analogWrite(pin,value), que manda al pin designado una señal PWM con una \(D\) controlada por el argumento value, que admite valores entre 0 (\(D=0\)) y 255 (\(D=1\)). Si por ejemplo este valor entre 0 y 255 lo recibiéramos como un byte a través del puerto serie, podríamos hacer:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
int in = 0;
byte pinOut = 10;
void setup() {
// inicializar puerto serie
Serial.begin(9600);
// preparar output
pinMode(pinOut, OUTPUT);
}
void loop() {
// leer dato si disponible
if(Serial.available()){
in = Serial.read();
// escribir en el pin
analogWrite(pinOut, in);
}
}
Con este código se recibe un valor ente 0 y 255 a través del puerto serie, cuando está disponible, y lo pasa como argumento a la función analogWrite() de tal manera que se genera la señal PWM correspondiente en el pin 10, tal y como corresponde en el esquema de montaje propuesto. Et voilà!
