We choose the Moon

Arduino + motor DC: circuito PWM

Jorge García Tíscar| July 21, 2011

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:

Esquema del montaje real

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à!

avatar Thanks for reading! To share this post, use this permalink

Comments