martes, 30 de enero de 2018

Moviendo un motor paso a paso bipolar.

Este es el programa más simple para mover un motor bipolar. Lo único que hace es girar en un sentido de forma indefinida. Sirva de punto de partida para vuestros programas.

#define Motor_Pin1 8
#define Motor_Pin2 9
#define Motor_Pin3 10
#define Motor_Pin4 11

int tiempo = 5;

void setup()
{
  pinMode(Motor_Pin1, OUTPUT);
  pinMode(Motor_Pin2, OUTPUT);
  pinMode(Motor_Pin3, OUTPUT);
  pinMode(Motor_Pin4, OUTPUT);
}

void loop()
{
  digitalWrite(Motor_Pin1, HIGH);
  digitalWrite(Motor_Pin2, LOW);
  digitalWrite(Motor_Pin3, LOW);
  digitalWrite(Motor_Pin4, LOW);
  delay (tiempo);
  digitalWrite(Motor_Pin1, LOW);
  digitalWrite(Motor_Pin2, HIGH);
  digitalWrite(Motor_Pin3, LOW);
  digitalWrite(Motor_Pin4, LOW);
  delay (tiempo);
  digitalWrite(Motor_Pin1, LOW);
  digitalWrite(Motor_Pin2, LOW);
  digitalWrite(Motor_Pin3, HIGH);
  digitalWrite(Motor_Pin4, LOW);
  delay (tiempo);
  digitalWrite(Motor_Pin1, LOW);
  digitalWrite(Motor_Pin2, LOW);
  digitalWrite(Motor_Pin3, LOW);
  digitalWrite(Motor_Pin4, HIGH);
  delay (tiempo);
}


Ánimo, y a ver si este programa de 5 pelado, se convierte en un programa de 10.

Este otro programa, lo he hecho para aunar todas las técnicas para alimentar un motor bipolar, en el que podemos cambiar los parámetros, para variar la velocidad, el par, los pasos, etc....
Como siempre, le he quitado los comentarios, para que penseis, y penseis, y penseis..... y como podeis ver, poco código para hacer más que el programa anterior.

#define Motor_Pin1 8
#define Motor_Pin2 9
#define Motor_Pin3 10
#define Motor_Pin4 11

/*****************************************************************************************************************
 ************************************** parametrización del motor ************************************************
 *****************************************************************************************************************/
#define pasospv    4096       //Pasos por vuelta del reductor
#define vueltas    1          //Número de vueltas que queremos que de el motor
#define tipo_pasos 4          //Paso completo (4) o medio paso (8)
#define par_motor  0          //Bajo par (0) Alto par (1)

float delayTime = 8;          //Segundos por vuelta. Tiempo mínimo 5 segundos.

/*****************************************************************************************************************/

bool paso[8][4]= {{1,0,0,0},  
                  {1,1,0,0},
                  {0,1,0,0},
                  {0,1,1,0},
                  {0,0,1,0},
                  {0,0,1,1},
                  {0,0,0,1},
                  {1,0,0,1}};

void setup()
{
  for (int i = 0; i <= 3; i++){
    pinMode(i+8,OUTPUT);
  }
  delayTime = ((((delayTime * 1000)/4096)*(8/tipo_pasos))*1000);  
}



void loop()
{
  for (int k = 0; k < ((pasospv/8)*vueltas); k ++){               
    for (int i = par_motor; i < 8; i = i + (8/tipo_pasos)){       
      for (int j = 0; j < 4; j ++){                               
        digitalWrite(j+8, paso[i][j]);
      }
      delayMicroseconds (abs (delayTime));                        
    }
  }
  delay (2000);
}

2 comentarios:

  1. Yo había hecho el ejercicio básico como lo has presentado al principio (el simple) y lo hice para secuencia normal, y para secuencia de doble polo…

    El Ejercicio de Parametrización del Motor permite, cambiando los parámetros iniciales (define), que se pueda utilizar cualquier motor unipolar y cambiarle las condiciones de pasos, par motor y vueltas.
    Primero nos presenta un Array de dos dimensiones, en el que nos proporciona todas las combinaciones posibles de alimentación de los polos. Para secuencia normal o a Medios Pasos.
    En el void setup con dos instrucciones nos declara todas las salidas. Con un for, declara los pines 8,9,10,11 como salidas. Y nos calcula la variable tiempo según hayamos elegido los parámetros iniciales.
    EN principio tenemos 8 segundos/vuelta. Lo convertimos en microsegundos multiplicándolo por 1.000.000, y lo dividimos por 4.096 pasos por vuelta, lo que nos da el tiempo por paso. Hay un corrector si el paso es sencillo o medios pasos.

    En el Void Loop
    Hay tres if anidadas…El primero repite, para hacer una vuelta, 4096/8 es decir nos va a hacer pasar por el paso, el número de pasos dividido por 8 que es el número de filas del array
    Dentro nos hacer repetir ocho veces o siete, y empieza según el par motor, (0,ó, 1)en la posición 0 o en la uno. Si el paso es sencillo lo hará las posiciones pares, si el paso es doble, lo hará pasando por todos los arrays.
    Finalmente el siguiente if es el que me va a recorrer las cuatro columnas del Array, y me escribirá en las salidas el valor del puesto correspondiente de fila y columna…

    Lo que no sé por qué has puesto es el valor absoluto del Tiempo, porque creo que el tiempo no va a poder ser negativo…. ¿¿?¿
    Muy Bueno … vaya curro más pistonudo… y bastante complicado de pillar. Salud.

    ResponderEliminar
  2. Yo tengo un gran problema, bueno dos. Por no sé qué razón pensaba que había una pequeña pila/batería en el kit. Y no.

    El segundo problema es que veo el el video de Ángel un trenzado de 5 cables que sale de la plaquita y va al Arduino. Yo -creo- que no tengo eso. He repasado mis notas del viernes y no veo nada anotado sobre este último conector (lo de la batería es problema mío, pero tampoco tengo anotado que haga falta una de 9 V).

    En general me pongo a hacer cosas de arduino los jueves, así que si no he preparado previamente los materiales, me quedo asín. Para mí la programación no es un problema, pero el hard sí lo es.

    Propondría que se hiciera una pequeña lista de materiales mínimos necesarios para cada ejercicio sin los que no se puede realizarlo. Nos vendría bien a los distraídos que no tengan tienda de electrónica a menos de 40 km.

    Salud

    ResponderEliminar