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
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 ::
gracias, fue de gran ayuda
no me corre, dice stray ‘\’ in program
no me funciona
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
no , el programa lo arregle y todo, no se que será
El programa esta correcto en el libro Arduino Cookbook , esta en pdf «por tos laos»
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
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.
como estas, sabes que quiero preguntarte si emulaste en VirtualBreadBoard, ya que quiero emularlo ahi pero no encuentro el L293D en la libreria DIP
No, utilize solo utilize fritzing para los diagramas pero no hice simulaciones
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
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
y como seria el codigo si yo quiero controlar la direccion del giro?
quiero decir con un potenciometro de 10kOhm
y para utilizar dos motores me puedes ayudar por favor
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 ´´
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.
oye se puede hacer sin el puerto
con una pila
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
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.
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
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
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?
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
Amigo, gracias. Hemos salvado el semestre gracias a ti.
Mi compañero y yo nos hemos hecho tus fans.
Excelente página.