Arduino. Motor CC usando Integrado L293D

Control de velocidad y direccion de Motor CC

Tengo en mente proyecto de robotica que voy a tratar en este blog: Usando Arduino Uno, construir un carrito de carreras totalmente autonomo. Me gusta trabajar con Arduino principalmente por su simplicidad en implementacion de distintos tipos de aplicaciones de hardware y software, ademas de su programacion minimalista de C!.

Motor cc

El motor de corriente continua (DC) es un dispositivo sencillo con dos cables conectados a los cepillos (contactos) que controlan el campo magnético de las bobinas que impulsa un núcleo metálico (inducido). La dirección de rotación puede ser invertida por la inversión de la polaridad de la tensión en los contactos. Los motores de corriente continua están disponibles en diferentes tamaños, pero aún el más pequeño (por ejemplo, motores de vibración usado en los teléfonos celulares) requiere un transistor o de otro tipo de control externo para proporcionar la corriente adecuada. En este ejemplo veremos el control de un motor usando un transistor o un circuito de control externo llamado H-Puente. Usando Arduino y un puente H-L293D podemor implementar la conexion. El integrado L293D incluye cuatro circuitos para manejar cargas de potencia media, en especial pequeños motores y cargas inductivas, con la capacidad de controlar corriente hasta 600 mA en cada circuito y una tensión entre 4,5 V a 36 V. El integrado permite formar, entonces, dos puentes H completos, con los que se puede realizar el manejo de dos motores. En este caso el manejo será bidireccional, con frenado rápido y con posibilidad de implementar fácilmente el control de velocidad.

Conoctemos a Arduino y el motor cc atravez del integrado L293D de esta forma

Podemos observar que la velocidad del motor es proporcional a la cantidad de corriente suministrada para el funcionamiento optimo del motor, pero no te exedas de voltaje, podrias dañar el motor.

Un punto a tomar en cuenta es el PWM (pulse-width modulation) es una técnica en la que se modifica el ciclo de trabajo de una señal periódica (unasenoidal o una cuadrada), para controlar la cantidad de energía que se envía a una carga, la mayoría de los controladores sólo atacan el ajuste de velocidad y no consideran el torque el cual puede permitir el acelerar/desacelerar a mayor precision. Normalmente entre mas grande y/o pesado sea un motor posee mayor torque. Una vez implementado y entendido la parte fisica podemos abordar la parte logica o software, tome el codigo del libro Arduino_cookbook capitulo 8.10 dado que es un ejemplo claro y practico para comenzar.

/*

* Brushed_H_Bridge sketch

*comandos desde puero serie para control de direccion y velocidad

*’0′ a ‘9’ para la velocidad tomando a ‘0’ apagado, ‘9’ maxima velocidad

* + y – para asignar la direccion

*/

const int enPin = 5; // PWM se conecta al pin 1 del puente-H

const int in1Pin = 7; // Entrada 2 del puente-H

const int in2Pin = 4; // Entrada 7 del puente-H

void setup() //Inicializa y prepara los valores

{

Serial.begin(9600); //Abre el puerto serie a 9600 bps

pinMode(in1Pin, OUTPUT); //Configura in1Pin como salida

pinMode(in2Pin, OUTPUT); //Configura in2Pin como salida

Serial.println(«Speed (0-9) or + – to set direction»); //Imprime en la consola puerto serie

}

void loop() //La funcion loop se ejecuta consecutivamente

{ //permitiendole al programa variar y responder

if ( Serial.available()) { //Si el puerto serie esta disponible?

char ch = Serial.read(); //variable tipo char desde puerto serial

if(ch >= ‘0’ && ch <= ‘9’) //Si ch es un numero?

{

int speed = map(ch, ‘0’, ‘9’, 0, 255); //Re-mapea un numero desde un rango a otro

analogWrite(enPin, speed); //’0′ a 0 ‘9’ a 255

Serial.println(speed); //Escribe el valor analogico PWM enPin

}

else if (ch == ‘+’) //Si el caracter es ‘+’

{ //el motor avanza Clockwise

Serial.println(«CW»);

digitalWrite(in1Pin,LOW);

digitalWrite(in2Pin,HIGH);

}

else if (ch == ‘-‘) //Si el caracter es –

{ //el motor avanza CounterClockwise

Serial.println(«CCW»);

digitalWrite(in1Pin,HIGH);

digitalWrite(in2Pin,LOW);

}

else //Cualquier otro caracter es omitido

{

Serial.print(«Unexpected character «);

Serial.println(ch);

}

}

}

Veamos la implementacion ::

25 Comentarios Agrega el tuyo

  1. Humberto dice:

    gracias, fue de gran ayuda

    1. Javier dice:

      no me corre, dice stray ‘\’ in program

    1. El programa?? si hiciste copy and paste seguramente no va a funcionar, la razon puede ser los signos de puntuacion ( como comillas simples ) que estan en otro formato a las que el Arduino reconoce

  2. no , el programa lo arregle y todo, no se que será

  3. santos dice:

    El programa esta correcto en el libro Arduino Cookbook , esta en pdf «por tos laos»

  4. santos dice:

    Me estoy dando cuenta que mucha gente que sube artículos similares, sube las secuencias con errores a base de bien, algunos parecen hasta intencionados, espero que solo lo parezcan

  5. Voy a modificar el programa este fin de semana.. no veo que esta mal porque fue el que yo ocupe. De igual forma lo reparo este fin.

  6. lrq_dtb dice:

    como estas, sabes que quiero preguntarte si emulaste en VirtualBreadBoard, ya que quiero emularlo ahi pero no encuentro el L293D en la libreria DIP

    1. No, utilize solo utilize fritzing para los diagramas pero no hice simulaciones

    2. juan jose dice:

      Muchas gracias por toda la explicación una pregunta hay q abrir el cuadrito chiquito q aparece en el serial o eso ya queda configurado y otra pregunta es q yo lo necesitó para hacer un movimiento de eje x e y para una maquina de cojer peluches entonces necesito conectar otros motores y a su vez manejarlos desde arruinó con el serial si me puede ayudar te lo agradecería gracias

  7. jorge dice:

    hola lo arme y me funciono, pero al momento de realizar un cambio de direccion quemo el driver lm293 por eso recomiendo no realizar cambios de giro inesperados

  8. Matias dice:

    y como seria el codigo si yo quiero controlar la direccion del giro?

    1. Matias dice:

      quiero decir con un potenciometro de 10kOhm

  9. kenneth matzar dice:

    y para utilizar dos motores me puedes ayudar por favor

  10. cris dice:

    muchas!!!! gracias funciona de maravilla!! solo no hagan copy, paste porque si no no funciona , a mi las comillas es lo que me fallaron » se ponen estas en ves de estas » y estas ´´

    1. Eso tal vez es debido a que los caracteres del blog estan en formato WCHAR que se parece mucho a los caracteres ASCII que utiliza el IDE de Arduino pero no son iguales.

  11. Erik Cortes dice:

    oye se puede hacer sin el puerto
    con una pila

    1. En teoría si, solo que deberías tomar en cuenta el valor que devuelve el puerto de 1 Lógico (HIGH) que es de alrededor de 3 V

  12. Ok.
    El programa funciona perfectamente.
    Basta cambiar los caracteres de comillas dobles y simples a los valores correctos.
    Las comillas dobles y simples usadas en el programa, en C tampoco son validas. Yo lo he editado previamente en gedit y también había problemas con esos caracteres.

  13. Ivan dice:

    Hola, me interesa mucho tu post… No se mucho sobre puente H y te queria preguntar que si yo quiero controlar la velocidad de 4 motores, cuantos L293D Necesito? El PWM esta incluido en el arduino? Ya sea de manera fisica o via programacion

    1. Usarías 1 L293D por cada dos motores, o un L298D que para manejar mayor corriente (si los motores son muy grandes), el PWM ya lo hace el Arduino sin problema

  14. Alejandro Gil Restrepo dice:

    Hola amigo, una pregunta sobre el puente H, en vez de usar el integrado yo lo quiero hacer con los transistores 2N2222A, yo estoy manejando un motor DC pequeño de 3v, mi pregunta es si aguanta la corriente que necesita el motor o hay problemas al usar los transistores?
    O tendria que comprar el integrado?

    1. Si es un motor pequeño los transistores deberian funcionar sin problemas, puedes medir la corriente del motor con un amperímetro y compararla con la que soportan los transoportes

  15. JC dice:

    Amigo, gracias. Hemos salvado el semestre gracias a ti.

    Mi compañero y yo nos hemos hecho tus fans.
    Excelente página.

Replica a Rafael Cordano Cancelar la respuesta