Control velocidad y sentido motor de DC

CONTROL VELOCIDAD Y SENTIDO DE MOTOR DC

(26/11/13) 

En este tutorial vamos a controlar la velocidad y el sentido de un motor DC a través de un potenciómetro desde Arduino.

Material

-Arduino Uno

-Motor DC

-Potenciómetro

-L293D (driver motores)

-Fuente alimentación externa

Motor DC

Un motor de corriente continua convierte la energía eléctrica en mecánica. Se compone de dos partes: el estator y el rotor.

El estator es la parte mecánica del motor donde están los polos del imán.

El rotor es la parte móvil del motor con devanado y un núcleo, al que llega la corriente a través de las escobillas.

Cuando la corriente eléctrica circula por el devanado del rotor, se crea un campo electromagnético. Este interactúa con el campo magnético del imán del estator. Esto deriva en un rechazo entre los polos del imán del estator y del rotor creando un par de fuerza donde el rotor gira en un sentido de forma permanente.

Si queremos cambiar el sentido de giro del rotor, tenemos que cambiar el sentido de la corriente que le proporcionamos al rotor; basta con invertir la polaridad de la pila o batería.

L293D

Para controlar un motor DC desde Arduino, tendremos que usar un driver para motores para proporcionarle más corriente al motor ya que las salidas del Arduino sólo dan 40mA. De esta manera, con el driver podemos alimentar el motor con una fuente de alimentación externa.

El L293D es un integrado para controlar motores DC que usa el sistema puente en H. ¿Qué es el puente en H? Es un sistema para controlar el sentido de giro de un motor DC usando cuatro transistores.  En la imagen vemos que los transistores se comportan como interruptores y dependiendo que transistores conducen y cuáles no cambia la polarización del motor, y con esto el sentido de giro.

El L293D tiene dos puentes H y proporciona 600mA al motor y soporta un voltaje entre 4,5V y 36V tal y cómo pone en el datasheet.

En el datasheet también hay el esquema que vamos a usar.

Nosotros usaremos la parte de la izquierda (los diodos externos en el L293D están dentro). Cómo se aprecia en la imagen, los pins 3 y 6 son las salidas y se conectan a los bornes del motor. Y los pins 2 y 7 son las entradas donde conectaremos las salidas del Arduino. Dependiendo que valor ponemos entre los pins 2 y 7 el motor girará en un sentido o en otro.

Control velocidad a través de PWM

Hasta este punto sabemos cómo controlar el sentido de giro del motor DC a través del L293D. Pero ¿y la velocidad de giro? En este proyecto lo que haremos es controlar la velocidad y el giro del motor con un solo potenciómetro.

Para hacerlo utilizaremos el PWM (véase PWM). Sabemos que hay que atacar los pins 2 y 7 del L293D desde dos salidas del Arduino. En estas dos salidas habrá un PWM a cada una. Pero tenemos que invertir un PWM. ¿Qué quiere decir invertir? Pues que cuando en un PWM tengamos un pulso a un valor alto, en el otro PWM el mismo pulso sea valor bajo. En la imagen lo entenderemos de una manera más gráfica.

MONTAJE

-Pins 4,5,12,13 del L293D a masa.

-Juntar las masas del Arduino y de la fuente de alimentación externa.

-Pin 8 del L293D a 9V de la fuente de alimentación externa. Es el voltaje que proporciona al motor.

-Pin 16 del L293D a 5V. Es la alimentación del L293D, pude alimentarse directamente desde la alimentación que proporciona el Arduino.

-El potenciómetro pude ser de cualquier valor.

PROGRAMA

/*
  www.diymakers.es
  by A.García
  Control velocidad y sentido motor DC
  Tutorial en: http://diymakers.es/control-velocidad-y-sentido-de-motor-dc/
*/

int pin2=9;   //Entrada 2 del L293D
int pin7=10;  //Entrada 7 del L293D
int pote=A0;   //Potenciómetro

int valorpote;     //Variable que recoge el valor del potenciómetro
int pwm1;          //Variable del PWM 1
int pwm2;          //Variable del PWM 2

void setup()
{
  //Inicializamos los pins de salida
  pinMode(pin2,OUTPUT);
  pinMode(pin7, OUTPUT);
}

void loop()
{

  //Almacenamos el valor del potenciómetro en la variable
  valorpote=analogRead(pote);

  //Como la entrada analógica del Arduino es de 10 bits, el rango va de 0 a 1023.
  //En cambio, la salidas del Arduio son de 8 bits, quiere decir, rango entre 0 a 255.
  //Por esta razón tenemos que mapear el número de un rango a otro usando este código.
  pwm1 = map(valorpote, 0, 1023, 0, 255);
  pwm2 = map(valorpote, 0, 1023, 255, 0); //El PWM 2 esta invertido respecto al PWM 1

  //Sacamos el PWM de las dos salidas usando analogWrite(pin,valor)
  analogWrite(pin2,pwm1);
  analogWrite(pin7,pwm2);

}


 

Share on Facebook0Tweet about this on TwitterShare on Google+0Share on LinkedIn0Email this to someone

58 thoughts on “Control velocidad y sentido motor de DC

      • Jorge Rodriguez

        No estoy muy seguro, se reemplazaria la entrada de referencia en A0 para colocar alli la entrada de PWM, y asi reemplazar el potenciometro, la pregunta es que en el codigo tendria que tener los valores medidos en osciloscopio del pwm de control para asignar las condiciones para los pwm de salida?

        Reply
        • Jalil Burbara

          La idea parece ser mas para controlarlo con condiciones desde el arduino pero tendria que tener una estrada de referencia como un censor de proximidad o bien un censor de infrarrojo con ordesnes predeterminadas en el arduino mandadas desde un control o bien bluetooth desde un telefono jajaja las posibilidades son infinitas

          Reply
          • Alvaro

            Estoy intentando hacerlo por bluetooth desde el móvil, pero no entiendo muy bien lo de mapear. Desde el teléfono envío un caracter ‘1’, y mi intención es que con cada ‘1’ suba una velocidad y con carácter ‘2’ cambie la polaridad y y con cada carácter ‘2’ suba la velocidad en sentido contrario.
            Agradecería la ayuda de alguien, estoy intentando terminar un proyecto de un grado de telecomunicaciones. Gracias

          • Walter Ramirez

            estoy haciendo un proyecto similar pero no quiero ponerle un potenciometro si no un modulo bluethoo para controlar el motor desde una app android, pero no se que tipo de señal debo usar o como programarla para reemplazar el potenciometro

  • Hector Bonilla Muñoz

    Que tal buenas noches, estoy trabajando con un arduino alejandro, esta no tiene ss/pwm, pin 10 del arduino,(uni el pin 7 del l239d con la entrada 10 pwm) monte el mismo codigo mostrado en la pagina, al girar el potenciometro solo gira el motor en uno solo sentido, en cualquier sentido que gire el potenciometro solo gira el motor para un solo lado. Que puedo hacer???, agradeceria su apoyo.

    Reply
  • Emanuel Chávez

    hola.es justo lo que necesito pero con dos motores….mira quisiera tener dos potenciometros para controlar cada motor, pero lo puedo hacer con un l293D..conectando el otro motor a los mismos pines del otro y pues obvio conectando mas pines al arduino que serian dos mas?????

    Reply
  • Juanjo Pedrajas

    Hola, tengo una duda sobre el L293D. Cuando dices “proporciona 600mA al motor y soporta un voltaje entre 4,5V y 36V” ¿significa que el integrado se puede alimentar de 4,5V a 36V y proporciona al motor el mismo voltaje que le proporciona arduino pero con mayor intensidad?

    Reply
  • Francisco

    Hola, mi duda es el L239D tiene diodos protectores integrados para que cuando cambie el sentido de giro no queme el arduino?

    Reply
  • Pingback: Tema 3 – Conceptos básicos de microcontroladores y electrónica (3) | Aprendiendo Arduino

  • Ivan

    Saludos.

    Mis conocimientos en electronica son bastante buenos, aunque no de ingeniería, pero soy nuevo en esto de arduino y me quedo un poco corto con la programación, mi idea es tomando el modelo de motor dc, añadir un segundo potenciometro que me marque la posición. Había pensado que quizás la opción seria que el sistema calculase la posición según (pot2-pot1), donde pot1 es el que controla el giro y pot2 el que determina la posición del elemento que gira, esto quiere decir que si tengo 2V en pot1 y 2V en pot2 (2-2= 0V), el motor girará y parará al llegar pot2 a 4,5V (2,5v de diferencial) y así con cualquier valor de pot1. Esto a su vez me genera otro problema y es que, cuando tenga pot1 4V y pot2 1V (diferencial 1-4= -3V) no se como lo tomara, teóricamente sera solo un valor calculado y no real, pero no se si habría que hacer alguna corrección.

    Teniendo en cuenta el código que tienes expuesto, he realizado algunas modificaciones, las cuales aunque el software no me da error no se si están bien para el calculo.

    /*
    http://www.diymakers.es
    by A.García
    Control velocidad y sentido motor DC
    Tutorial en: http://diymakers.es/control-velocidad-y-sentido-de-motor-dc/
    */

    int pin2=9; //Entrada 2 del L293D
    int pin7=10; //Entrada 7 del L293D
    int pote1=A0; //Potenciómetro mando
    int pote2=A1; //Potenciometro control
    int pote=(A1-A0); //Diferencial de giro

    int valorpote1; //Variable que recoge el valor del potenciómetro mando
    int valorpote2; //Variable que recoge el valor del potenciometro control
    int valorpote; //Variable control giro diferencial
    int pwm1; //Variable del PWM 1
    int pwm2; //Variable del PWM 2

    void setup()
    {
    //Inicializamos los pins de salida
    pinMode(pin2,OUTPUT);
    pinMode(pin7, OUTPUT);
    }

    void loop()
    {

    //Almacenamos el valor del potenciómetro en la variable
    valorpote1=analogRead(pote1);
    valorpote2=analogRead(pote2);
    valorpote=(pote2-pote1);

    //Como la entrada analógica del Arduino es de 10 bits, el rango va de 0 a 1023.
    //En cambio, la salidas del Arduio son de 8 bits, quiere decir, rango entre 0 a 255.
    //Por esta razón tenemos que mapear el número de un rango a otro usando este código.
    pwm1 = map(valorpote, 0, 1023, 0, 255);
    pwm2 = map(valorpote, 0, 1023, 255, 0); //El PWM 2 esta invertido respecto al PWM 1

    //Sacamos el PWM de las dos salidas usando analogWrite(pin,valor)
    analogWrite(pin2,pwm1);
    analogWrite(pin7,pwm2);

    }

    No se si he duplicado acciones, si las he colocado correctamente, etc. Espero puedan ayudarme.

    Gracias.

    Reply
  • Ignacio

    Deberían dejar un valor en 0 y el otro con pwm, dependiendo para qué lado debe girar.
    además hay que darle un margen de seguridad al punto medio del potenciómetro

    ReadedVal = analogRead(PotPin1); // reads the value of the potentiometer (value between 0 and 1023)
    OutFwdVal = 0;
    OutRevVal = 0;

    if (ReadedVal >= 528)
    {
    OutFwdVal = map(ReadedVal, 520, 1023, 0, 255); // scale it
    }
    if (ReadedVal <= 496)
    {
    OutRevVal = map(ReadedVal, 504, 0, 0, 255); // scale it
    }
    analogWrite(FwdPin1, OutFwdVal);
    analogWrite(RevPin1, OutRevVal);

    Reply
    • Juan Serrano

      Buenas noches soy totalmente novato en el tema arduino aunque ya he puesto en marcha el regulador y estoy de acuerdo contigo el punto central o es muy difícil de encontrar lo que no se como poner tu modificación en el programa anterior.
      No tendras el programa totalmente modificado para solo cargarlo.
      Me harías un gran favor.
      Un saludo

      Reply
  • Pingback: Actuadores y periféricos de salida | Aprendiendo Arduino

    • johnny

      Se puede restringir el numero de vueltas del motor dc. Es que quiero que gire ghasta un cierto numero de vueltas y se detenga, sera posible

      Reply
      • hector

        Con el circuito como esta no es posible hacer eso con precisión.. necesitas alguna forma para contar las vueltas, algo como un sensor.. podrías hacerlo que gire a bajas velocidades por un tiempo determinado pero nada asegura que sean siempre el mismo numero de vueltas..

        Reply
  • Pingback: Tema 5 – Taller de Proyectos con Arduino | Aprendiendo Arduino

  • Carlos Aguilar

    si quisiera indicarle al Motor la velocidad que quiero por medio del teclado, es decir en vez de usar el potenciometro, cambiar la velocidad de giro del motor indicando con los numeros del teclado la velocidad que quiero (obviamente ajustando las velocidades de acuerdo al numero tecleado) se podria hacer ???

    Reply
    • Raul

      Desde el Monitor serial, ingresarías el valor que deseas. Esto haría la funcion del potenciometro !

      Reply
  • manuel

    buenas tardes mi pregunta es que si es cualquier valor de potenciómetro para poder girar a los dos sentido lo que pasa es que solo me gira de un sentido estoy haciendo exactamente lo mismo

    Reply
  • DIego

    buenos dias, quiero realizar el mismo proyecto pero solo tengo un l293b, donde irian puestos los diodos y cuales desde ya muchas gracias!!

    Reply
  • Marcelo

    Hola, llego 2 años despues a su articulo, no sé si este post sigue con “vida”, igual van mis 2 preguntas, cómo hacer en el caso qué quiera utilizar dos motores y cada uno de ellos con su respectivo potenciómetro ?, en mi caso lo utilizaria con motores de mayor potencia , 4 amperes de consumo, recomienda algún puente H con Mosfet en especial ?, dado qué estuve leyendo sobre el tema y hay algunas complicaciones si dichos puentes se cosntruyen con Mosfet complementarios o en su defecto de canal N, gracias por su atención.

    Reply
  • javier

    hola espero me ayuden, la velocidad maxima de un motor es de 255 o se puede incrementar, si es asi me pueden decir como o con que

    Reply
  • maikol

    Buenas Tardes buen proyecto, felicitaciones. Si deseo realizar un embobinador teniendo en cuenta este proyecto como lo podria hacer ?

    Reply
  • MAPRISA

    Hola, solo quería dar a DIYMakers sinceramente mi enhorabuena, es un tutorial muy bien explicado, y me ha ayudado más que suficiente en mi proyecto así que gracias por tus esfuerzos por ayudar a los demás, estos detalles alimentan a que tus seguidores te sean fieles.

    Reply
  • MAPRISA

    Quisiera hacer una pregunta, como se podría implementar el código para enviar las señales analógicas del potenciómetro por bluetooth y como recibirlo para hacer andar el motor, suponiendo que tenemos dos Arduinos, uno para el potenciómetro y otro para el motor, gracias de antemano

    Reply
  • Cinthya Issasi

    Hola me gustó mucho el tutorial, de hecho hasta lo apliqué para dos motores muchas gracias! ahora mi problema es si se puede SOLO controlar la velocidad?, es decir que con el mismo potenciometro solo varies la velocidad sin cambiar el sentido?, simplemente sustraje de la programación las partes que incluian el otro pwm, e intenté hacer las conexiones a la entrada 15 del l293d para el pwm y la salida el pin 14 para el motor. conecto el motor a el pin 14 y a tierra pero no pasa nada, alguien lo ha intentado?

    Reply
  • gustavo mo

    al momento de copiar el codigo, y subirlo me marca erros de que, el sistema no puede encontrar el archivo espesifico, que puede ser??

    Reply
  • Miguel Angel Aguirre

    Oye amigo tengo un motor de impresora que trabaja a 42 voltios de corriente continua y me preguntaba si puedo sustituir en el diagrama tu motor de 9 volt por el mio de 42?
    en si mi pregunta se basa en querer saber si el l293D soportaria ese voltaje y si no le sucederia nada al arduino.
    Saludos.

    Reply
  • Brayan Sandoval

    amigo quiero hacerle control pid a un motor dc, el cual por medio de un sensor optico me diga cuantas rpm tiene el motor y me compare con la señal inicial(claro esto baja porque se le aplicaria una pequeña carga al motor) y si las rpm no son las mismas el pwm me aumente el voltaje de tal forma que vuelva a las rpm inicial sin importar efectos de carga o descarga. si sabe como aplicarlo le agradeceria.

    Reply
  • P.T

    Hola,
    estoy con un proyecto arduino similar y me gustaría saber si se puede invertir la polaridad del motor desde el ordenador es decir sin tener que tocar el motor.
    Gracias de antemano

    Reply
  • fabian torres

    hola me podrian ayudar nesesito que solo controle el giro y no la velocidad pero al momento de hacer todo nunca cambie la velocidad que le podria cambiar

    Reply
  • VictorRV

    Tengo que hacer algo muy parecido, solo que la velocidad del motor se regula según la distancia a la que haya un objeto. La distancia se obtiene con el sensor ultrasonico HC-SR04 y entre menor sea la distancia mas lento debe girar el motor. Que creen que deba cambiarle al código?

    Reply
  • Alvaro

    Hola estoy haciendo un proyecto de grado superior de telecomunicaciones.
    Mi duda es, los pines 2,7 del integrado solo me sirven para dar estados HIGH y LOW(cambiar sentido de giro)?
    Y el pin 1 del integrado me sirve para darle valores para controlar la velocidad?
    Y el problema es que no se que valor es el máximo y el valor de parado.
    Agradezco tus explicaciones, muy detallado y muy buena calidad a la hora de mostrar conexiones.
    Un saludo.

    Reply
  • Eduardo Brandone

    Hola quisiera consultar, para un motor de 13,5 Volts y 15 amperes de arranque necesito acelerarlo gradualmente con un sensor Hall 1301 lineal y con una opción de ajuste de sensibilidad . hay algún circuito que pueda usar con la placa Arduino . Desde ya gracias por vuestra atención.

    Reply
  • tanoful

    Hola, el proyecto es muy bueno y de echo lo e puesto en practica y anda perfecto, pero e aqui que c omo practica necesito pedir como tambien ya pidieron otras personas, si es posible este comando controlado con bluetooth, mi proyecto es hacer funcionar un tren controlado con 2 arduinos y comunicado con 2 HC05, el cual ya los tengo entrelazados, La idea es Arduino Uno con el pote y HC05 master envie este skecht a Arduino Nano con HC05 slave montado en tren con el motor. Desde ya estaria muy agradecido y tambien mostrarles el resultado final.

    Reply
  • Pingback: Motores | Aprendiendo Arduino

  • nestor mallqui

    muy buen tutorial amigo, mira estoy haciendo algo similar solo que necesito controlar solo el sentido del giro pero por comandos de voz será que me puedes ayudar

    Reply
  • Pingback: Uso de Motores | Aprendiendo Arduino

  • Hakim Boudra

    Hola, gracias por este tutorial.

    Queria saber como hacer si utilizamos, almenos de un potenciometro, dos pulsadores, donde estos dos pulsadores el primero, en un tiempo determinado va aumentando la velocidad hasta llegar a un punto y seguidamente diminuye hasta detenerse. Y el segundo, hacer lo mismo pero en otro sentido, es decir, digamos que haria la simulacion de una atracción.

    Reply

Deja un comentario