Pages: 1 [2]   Go Down
Author Topic: Cambio de sentido motor pap  (Read 5926 times)
0 Members and 1 Guest are viewing this topic.
0
Offline Offline
Newbie
*
Karma: 0
Posts: 23
Arduino rocks
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

yo en mi caso personal, para hacer funcionar un paso a paso he seguido este pequeño manual, he montado el circuito en una protoboard y va de muerte, http://txapuzas.blogspot.com/2009/12/paperstepperl298n-driver-de-potencia.html
Además para la libreria de stepper para el cambio de giro con poner el símbolo negativo funciona,
Mi problema viene, en que, si uso los 5v que suministra arduino el motor funciona correctamente, pero si lo alimento con una fuente de alimentación que tengo, que también da 5v, el motor no va ni para atrás, y se me calienta, Decir que la fuente funciona correctamente con otros circuitos, puede ser que haya un corto en el motor???
Logged

0
Offline Offline
Full Member
***
Karma: 0
Posts: 102
Arduino rocks
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Gracias, pero estoy utilizando una controladora que no necesita esa libreria, la controladora es la easydriver y el problema que veo no es en el giro sino en su precisión.
El motor que estoy usando tiene 7,5º por paso, pero tal y como está construido el código uno de los problemas está en que debería dar una vuelta completa indicándole 48 pasos, sin embargo esto no ocurre, lo mas próximo a una vuelta (y tampoco coincide) está entre el valor 360 y 380.
Logged

Orduña- Bizkaia
Offline Offline
Sr. Member
****
Karma: 0
Posts: 317
Arduino rocks
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Santiago.lopez a mi tambien me paso la primera vez q lo probe, luego como con lo 5v de arduino funcionaba no le di mas importancia, postealo en el hilo de txapuzas y seguro q te dan. una respuesta.
Logged

0
Offline Offline
Newbie
*
Karma: 0
Posts: 23
Arduino rocks
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Santiago.lopez a mi tambien me paso la primera vez q lo probe, luego como con lo 5v de arduino funcionaba no le di mas importancia, postealo en el hilo de txapuzas y seguro q te dan. una respuesta.

Es curioso, pero si alimento el L239 con los 5v de arduino, pero el motor paso a paso con la fuente de alimentación externa, funcioa correctamente, no sé por que será, igual la Fuente no me da suficiente intensidad.. pero me extraña...
Logged

0
Offline Offline
Full Member
***
Karma: 1
Posts: 247
Arduino rocks
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

Hola Santiago.lopez
Los motores paso a paso suelen ser grandes consumidores de corriente.
Si el motor te funciona con la alimentación de arduino y con la otra no, parece en principio, que el problema es de la fuente.
¿No puedes medir con un tester la intensidad que suministra cada una de las fuentes?
¿Puedes dar algún dato de las fuentes y del motor (V,I,R)?

Saludos
« Last Edit: June 12, 2011, 04:16:07 am by Inizul » Logged


Orduña- Bizkaia
Offline Offline
Sr. Member
****
Karma: 0
Posts: 317
Arduino rocks
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

problema de fuete no creo q sea porque a mi me paso y el motor lo alimente con una fuente regulada q da hasta 10A y el motor consumia 0,7 aprox ypor el otro lado lo alimentaba con un cargador de movil q daba 5v  600ma q creo q es mas de lo q da el arduino, y tube q quitar el cargador de 5v y usar la alimentacion del arduino, porque sino no iba, es un poco raro si.
Logged

0
Offline Offline
Full Member
***
Karma: 0
Posts: 102
Arduino rocks
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Con respecto al motor y la controlada easydriver voy avanzando, pero ahora estoy intentando aprovechar una de las caracteristicas de esta controladora, la función sleep, ya que observo que tanto la controladora como el motor suben mucho de temperatura y según he leido con esta función puede ponerse el motor en modo pausa con lo cual no le llega tensión.

No sé si estoy interpretando correctamente la función del terminal sleep de la controladora, pero lo que intento es hacer que cuando el motor termine de girar pase a estado de reposo.
Para usar el terminar sleep de la controladora, lo que hago es al iniciarse el proceso enviarle la orden hight, y al terminar le envio Low, con lo cual entiendo que no deberia llegarle alimentación al motor.
Para verificar si le llega tensión he colocado un led en cada terminar del motor y siempre hay algún led iluminado, por lo que deduzco que no está actuando correctamente esta función, ¿sabeis como se usa correctamente?
gracias.
Logged

Orduña- Bizkaia
Offline Offline
Sr. Member
****
Karma: 0
Posts: 317
Arduino rocks
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Supongo que el sleep sera como el enable, y funciona como dices cuando esta en low el motor no tendria corriente, la manera de probarlo esque sino tiene correinte se mueve con la mano con facilidad porque no estan alimentadas las bobinas, es como si estubiera suelto.
El problema de usar esto es que si en tu aplicacion el motor  no tiene q aguantar una fuerza esta bien , pero si algo hace fuerza en el al ponerlo a low se moveria.
Logged

0
Offline Offline
Full Member
***
Karma: 0
Posts: 102
Arduino rocks
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

No entiendo muy bien como se puede compatibilizar "enable" con "sleep".
En estos momento tengo implementado en el código la posibilidad de gestionar sleep y el funcionamiento consiste en activar este puerto antes de que el motor comience a girar y una vez ha terminado el giro enviar la orden de desativar, con ello hay un ahorro de energía y además evito que se caliente el motor.
El problema le encuentro para implementar "enable" ya que según entiendo para que tenga efecto hay que enviar corriente de forma continua para que las bobinas frenen el giro del motor.
Al menos esta es la interpretación que yo hago de las funciones de la controladora, pero no sé como se puede gestionar ambos. ¿alguna idea?
gracias.
Logged

0
Offline Offline
Full Member
***
Karma: 0
Posts: 102
Arduino rocks
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Ante la imposibilidad de compatibilizar "enable" con "sleep" me he decantado por dejar sleep exclusivamente. Por ahora todo parece evolucionar y practicamente consideraba que estaba a punto de finalizar esta parte, pero tengo un problema bastante gordo y sinceramente estoy totalmente bloqueado y ya no se me vienen a la cabeza que mas puedo hacer de ahí que os pida vuestra ayuda.

En este momento el código para gestionar el motor está practicamente preparado, habiendo conseguido gestionar el motor mediante una pantalla lcd 16x2 dos botones para su manejo y tiene las posibilidades de elegir velocidad, giro y resolución de pasos, pero tras todo esto está el problema no consigo que el motor gire 1 o 2 pasos, solo se mueve a partir de que selecciono 3 pasos.
Por supuesto he verificado esto con varios motores y siempre ocurre lo mismo.

Os agradezco por anticipado la ayuda que podais prestar, para lo cual íncluyo el código si bien faltan la definición de las variables que exceden el límite del post.
Gracias.
Code:


 void edita_datos1(){
  byte currentOption = 0;
    for(boolean exit = false;!exit;){
      lcd.clear();
      if (currentOption==0) {lcd.setCursor(0,0); lcd.print("giro ");}  
      if (currentOption==1) {lcd.setCursor(4,0); lcd.print("tipo de paso");}
      lcd.setCursor(1,1); if (sentido_giro) lcd.write(0x00); else lcd.write(0x01);  
      lcd.setCursor(9,1); if (tipo_paso==1) lcd.print(" 1 ");      
                     else if (tipo_paso==2) lcd.print("1/2");
                     else if (tipo_paso==3) lcd.print("1/4");
                     else if (tipo_paso==4) lcd.print("1/8");
      keyboard_waitForAnyKey();                          
      if (lastKey==KEY_A) {
        if (currentOption==0) sentido_giro=!sentido_giro;
        if (currentOption==1) {tipo_paso=tipo_paso-1; if (tipo_paso==0) tipo_paso=4;}
  
      }
      else if (lastKey==KEY_B) {
        if (currentOption==0) sentido_giro=!sentido_giro;        
        if (currentOption==1)  {tipo_paso=tipo_paso+1; if (tipo_paso==5) tipo_paso=1;}
  
      }
      else if (lastKey==KEY_BH){
        if (currentOption==1) {Motor_MS1_MS2(); edita_datos2();}   // Activa entradas MS1 y MS2 del driver y edita pausa y pasos        
        if (currentOption==0) currentOption = 1;    //
      }
      else if (lastKey==KEY_AH) {        
        if (currentOption==0)  exit=true;            
        if (currentOption==1)  currentOption = 0;  
      }      
  
    }
}
 
 
void edita_datos2(){
  byte currentOption = 0;
    for(boolean exit = false;!exit;){
      lcd.clear();
      if (currentOption==0) {lcd.setCursor(0,0); lcd.print("pausa");}
      if (currentOption==1) {lcd.setCursor(5,0); lcd.print("pasos");}
      if (currentOption==2) {lcd.setCursor(12,0); if (tipo_paso==2) lcd.print("1/2");
                                             else if (tipo_paso==3) lcd.print("1/4");
                                             else if (tipo_paso==4) lcd.print("1/8");
                            }
      lcd.setCursor(0,1);  lcd.print(pausa); lcd.print(" ");  
      lcd.setCursor(6,1);  lcd.print(pasos_uno); lcd.print(" ");  
      lcd.setCursor(13,1); if (tipo_paso==2) lcd.print(pasos_medio);
                      else if (tipo_paso==3) lcd.print(pasos_cuarto);
                      else if (tipo_paso==4) lcd.print(pasos_octavo);
      keyboard_waitForAnyKey();    
                                  
      if (lastKey==KEY_A) {
        if (currentOption==0) {if (pausa>1) pausa=pausa-1;}
        if (currentOption==1) {if (pasos_uno>0) pasos_uno=pasos_uno-1;}
        if (currentOption==2) {if (tipo_paso==2) {if (pasos_medio>0) pasos_medio=pasos_medio-1;}
                          else if (tipo_paso==3) {if (pasos_cuarto>0) pasos_cuarto=pasos_cuarto-1;}
                          else if (tipo_paso==4) {if (pasos_octavo>0) pasos_octavo=pasos_octavo-1;}
                          }
      }
      else if (lastKey==KEY_B) {
        if (currentOption==0) { pausa=pausa+1;}
        if (currentOption==1) {if (pasos_uno<Pasos_Motor) pasos_uno=pasos_uno+1;}
        if (currentOption==2) {if (tipo_paso==2) {if (pasos_medio<1) pasos_medio=pasos_medio+1;}
                          else if (tipo_paso==3) {if (pasos_cuarto<3) pasos_cuarto=pasos_cuarto+1;}
                          else if (tipo_paso==4) {if (pasos_octavo<7) pasos_octavo=pasos_octavo+1;}  
                          }      
        }
      else if (lastKey==KEY_BH){
        if (currentOption==2) {total_micropasos();principal(); }      
        if (currentOption==1) {if (tipo_paso==1) {total_micropasos();principal();} else currentOption=2;}
        if (currentOption==0) currentOption = 1;  
      }
      else if (lastKey==KEY_AH) {        
        if (currentOption==0)  exit=true;          
        if (currentOption==1)  currentOption = 0;  // -> edita pausa
        if (currentOption==2)  currentOption = 1;  // -> edita pasos      
      }
    
  }
}

  void principal(){
      digitalWrite(dirPin,sentido_giro);
      digitalWrite(sleep, HIGH); //activa el puerto sleep controladora
       // lcd.setCursor(0,0);lcd.print("girando...      ");                      
       // lcd.setCursor(0,1);lcd.print("pasos ");    
      for(boolean exit = false;!exit;){      // mueve el motor un nº de pasos determinado
        lcd.setCursor(0,0);lcd.print("girando...      ");
        lcd.setCursor(0,1);
             if (tipo_paso==1) lcd.print(" 1 ");      
        else if (tipo_paso==2) lcd.print("1/2");
        else if (tipo_paso==3) lcd.print("1/4");
        else if (tipo_paso==4) lcd.print("1/8");
        lcd.print(" paso: ");            
        for (int n=1;n<=micropasos; n++){
          lcd.setCursor(10,1);lcd.print(n);      
          lcd.print("          ");              
          steps();         // Esta función da un solo paso. Como está dentro de un ciclo, los pasos se repiten.  
  

        }
        lcd.setCursor(0,0);lcd.print("Fin de giro.    ");          
        buzzer_beep(100);
        delay(1000);
        digitalWrite(sleep, LOW);           //deja en modo sleep al motor
        lcd.setCursor(0,1);lcd.print("pulsa una tecla ");        
        keyboard_waitForAnyKey();          
        if (lastKey==KEY_AH) exit=true;    
        else { digitalWrite(sleep, HIGH);  
         }
        }                                
      }
 

 void steps(){
   digitalWrite(stepperPin, LOW);
   digitalWrite(stepperPin, HIGH);
   delay(pausa);            
 }

// hace cambio de sentido del giro
void cambio_de_giro(){
       sentido_giro=!sentido_giro;
       digitalWrite(dirPin,sentido_giro);
    
}

//Activa las entradas MS1 y MS2 de Easydriver en función del tipo de paso escogido.
void Motor_MS1_MS2(){
       if (tipo_paso==1) {digitalWrite(MS1, LOW);  digitalWrite (MS2, LOW);  }
  else if (tipo_paso==2) {digitalWrite(MS1, HIGH); digitalWrite (MS2, LOW);  }
  else if (tipo_paso==3) {digitalWrite(MS1, LOW);  digitalWrite (MS2, HIGH); }
  else if (tipo_paso==4) {digitalWrite(MS1, HIGH); digitalWrite (MS2, HIGH); }
}

// CALCULA el nº de micropasos en función del nº y el tipo de pasos escogido.
void total_micropasos(){
     if (tipo_paso==1) micropasos =  pasos_uno;
     if (tipo_paso==2) micropasos = pasos_uno*2 + pasos_medio;
     if (tipo_paso==3) micropasos = pasos_uno*4 + pasos_cuarto;
     if (tipo_paso==4) micropasos = pasos_uno*8 + pasos_octavo;
}
 

// Beeps buzzer a time in ms
void buzzer_beep(int time){
     analogWrite(PINS_BUZZER,64);
     delay(time);
     analogWrite(PINS_BUZZER,0);
}





Edito: Tras eliminar las líneas respecto a "slepp" sí que se consigue que el motor dé un solo paso, pero sigo sin saber cual es el motivo para ello.
« Last Edit: April 19, 2011, 11:32:09 am by AntonioT » Logged

0
Offline Offline
Full Member
***
Karma: 0
Posts: 102
Arduino rocks
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Llevo tiempo intentando solucionar este problema y comienzo a pensar si podria ser un problema de la controladora¿me podríais decir si hay algún método para comprobar si la controladora funciona correctamente?
gracias.
Logged

Pages: 1 [2]   Go Up
Jump to: