“Engineers like to solve problems. If there are no problems handily available, they will create their own problems.”

~ Scott Adams

Arduino + motor DC: circuito PWM


Jueves, 21 de julio de 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. El esquema de la fase de potencia es:

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.

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:

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.

Categoría: Cosas "útiles", Engineer-It-Yourself, Tutoriales | Etiquetas: , , , | Comentarios: 2 Comentarios »


2 Comentarios on “Arduino + motor DC: circuito PWM”

  1. 1 El Rey Del Mundo  dijo a las 6:56 del 10/06/2012:

    Parese que no funciona…. le doy cualquier valor y solo prende, no cambia de intenciadad

  2. 2 Rodolfo Escobar  dijo a las 2:13 del 17/10/2012:

    Tengo el mismo problema con el programa. En general he estado teniendo problemas con la función analogWrite(pin,value) cuando value es una lectura serial. El pin ignora cualquier valor que envío desde el monitor seria o desde Matlab con fwrite(s,’n',’uint8′). ¿Hay algo que no estoy tomando en cuenta?

Anímate y deja un comentario, it's free!

Puedes iniciar sesión con Twitter, Faccebook o WordPress o bien introducir un nombre y dirección de correo (y una página, si quieres!). Sólo tienen que ser verdaderos si quieres que te podamos contestar!