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