Hola gente del foro , Actualmente estoy tratando de mover un motor Paso a paso con el driver Pololu a4988 y un Arduino Mega 2560.
Estos son los drivers para quien no los conozca :
Tengo varios motores sacados de viejas impresoras , Uno de ellos en un em 329 , de 48 pasos , que funciona segun su datasheet a 36 V y en la carcaza indica una resistencia de 12 ohms. Lo que da un aproximado de 3A.
El cableado al arduino es sencillo:
-la alimentacion del motor a una fuente de pc 12v
- la alimentación del driver al pin 5V del arduino
-a1,a2 y b1,b2, Conectados a las bobinas del motor
-Reset al pin 4 del arduino
-dirección a 5v
-Step a pin 2
-masas en común
-ms1,ms2,ms3 en LOW (es decir sin micropasos)
El driver esta ajustado para entregar aproximadamente 1.3A , y el motor se mueve (con un torque considerable) , el problema radica en que si lo hago dar por ejemplo 99 pasos , lo das bien , pero cuando quiero que de pocos pasos (por ejemplo 10 pasos) , lo que hace es dar 1 paso en dirección opuesta y los otros 9 en la direccion correcta. Ademas aveces cuando se le da la orden de ir dando de a 1 paso , la primera vez lo hace bien, la segunda tambien , pero ya a partir de aca no se mueve.
En conclusion , dandole una cantidad de pasos considerables todo OK . pero cuando se le pide que realize los pasos de a pocos , se pierden.
Segun tengo entendido puede exigirles a los pololus que entregen 1.7A calentandose pero nose si sera este el problema , ya que el motor tiene un torque considerable con tan solo 1.3A
Tambien probe variando la velocidad , y una velocidad en la cual no hacen ruido ni vibran demasiado es 30500 , aunque a 12500 tambien funcionan ok
int velocidad = 12500;
int pin_paso = 2;
int pin_direccion = 3;
int pin_reset = 4;boolean direccion = false;
void setup()
{
Serial.begin(9600);
Serial.println("Conexion con Arduino OK ...");pinMode(pin_direccion,OUTPUT);
pinMode(pin_paso,OUTPUT);
pinMode(pin_reset,OUTPUT);
digitalWrite(pin_reset,LOW);
}void Realizarorden(int pasos , boolean direccionx,int velocidadx)
{
digitalWrite(pin_reset,HIGH);
digitalWrite(pin_direccion,direccionx);
for(int i=0; i <pasos;i++)
{
digitalWrite(pin_paso, HIGH); // This LOW to HIGH change is what creates thedigitalWrite(pin_paso, LOW); // al A4988 de avanzar una vez por cada pulso de energia.
delayMicroseconds(velocidadx);
}
Serial.println("-Listo");
digitalWrite(pin_reset,LOW);
}
void loop()
{
char comando[2]; // cadena de 3 letras
int bytes_recibidos =0; //variable ayudante//recepción de datos serie
while(bytes_recibidos <3)
{
if(Serial.available() >0)
{
comando[bytes_recibidos++] = Serial.read();
delayMicroseconds(500);}
}Serial.print("Comando seteado a : ");Serial.println(comando);
if(comando[0] =='I' )
{
Serial.println("Direccion seteada a izquierda");
direccion = true;
}
else if(comando[0]=='D')
{
Serial.println("Direccion seteada a derecha");
direccion=false;
}if(comando[0] =='F' )
{
Serial.print("Modo : Paso por paso : ");
int numero_de_pasos = (((comando[1] -'0')*10)+ (comando[2]-'0') );
Serial.println(numero_de_pasos);Realizarorden(numero_de_pasos,direccion,velocidad);
}
}