Go Down

Topic: 28BYJ-48 motor paso a paso (Read 2074 times) previous topic - next topic

Javitolo

Hola, ante todo un saludo, este es mi primer mensaje en el foro.
Bueno, la cosa es que quiero hacer una especie de péndulo con el motor paso a paso y unos finales de carrera.La cosa seria que encendiese el invento y girase el motor hasta tocar el final de carrera , tras lo cual cambiaría en sentido de giro hasta tocar el otro final de carrera y así continuamente.
Pues eso que me estoy volviendo loco y no consigo lo que quiero, la verdad es que lo único que me falta es el cambio de giro cuando toque el final de carrera.
Si alguien me puede echar una mano se lo agradecería.

surbyte

Practica con tu motor paso a paso el cambio de giro y lo resuelves.


Javitolo

#2
Nov 06, 2017, 08:54 pm Last Edit: Nov 06, 2017, 09:16 pm by Javitolo
El cambio de giro lo tengo, pero cuando el final de carrera deja de estar pulsado el motor vuelve hacia atrás otra vez.

Este es el código que tengo:


Code: [Select]

//declaración de las variables para los pines del motor
int motorPin1 = 6;    // Azul   - 28BYJ48 pin 1 motor
int motorPin2 = 7;    // Rosa   - 28BYJ48 pin 2 motor
int motorPin3 = 8;    // Amarillo - 28BYJ48 pin 3 motor
int motorPin4 = 9;    // Naranja - 28BYJ48 pin 4 motor
                       // Rojo   - 28BYJ48 pin 5 (VCC) motor

int finalcarrera_iz = 3;  //Final de carrera sentido anti-horario  
int finalcarrera_de = 2;  //Final de carrera sentido horario

int lectura = 0;      //Almacena el valor del finalcarrera_de
int lectura2 = 0;     //Almacena el valor del finalcarrera_iz
                       

int motorSpeed = 1200;  //variable para fijar la velocidad del motor (el retraso entre cada secuencia)
int count = 0;          // cuenta de los pasos dados
int countsperrev = 512; // número de pasos por vuelta completa
int lookup[8] = {B01000, B01100, B00100, B00110, B00010, B00011, B00001, B01001};

void setup() {
 //declare the motor pins as outputs
 pinMode(motorPin1, OUTPUT);
 pinMode(motorPin2, OUTPUT);
 pinMode(motorPin3, OUTPUT);
 pinMode(motorPin4, OUTPUT);
 Serial.begin(9600);
 
}

void loop(){
 
 lectura = digitalRead(finalcarrera_de);
 lectura2 = digitalRead(finalcarrera_iz);
 
 while (lectura==0 and lectura2==0){
 lectura = digitalRead(finalcarrera_de);
 lectura2 = digitalRead(finalcarrera_iz);
 clockwise();
 }

 if (lectura != 0)
   {
     
     clockwise();      //sentido agujas del reloj
  }
 else if (lectura2 != 0)
   {
     anticlockwise();
  }                   //sentido antihorario
}
                     


//creación funciones giro horario y antihorario

void anticlockwise()
{
 for(int i = 0; i < 8; i++)
 {
   setOutput(i);
   delayMicroseconds(motorSpeed);
 }
}

void clockwise()
{
 for(int i = 7; i >= 0; i--)
 {
   setOutput(i);
   delayMicroseconds(motorSpeed);
 }
}

void setOutput(int out) //función secuencia giro
{
 digitalWrite(motorPin1, bitRead(lookup[out], 0));
 digitalWrite(motorPin2, bitRead(lookup[out], 1));
 digitalWrite(motorPin3, bitRead(lookup[out], 2));
 digitalWrite(motorPin4, bitRead(lookup[out], 3));
}



surbyte

A ver.. es un moto paso a paso. Si
Existe una librería paso a paso: Si
Donde: en el mismo IDE

Tiene ejemplos : Si

Los ejemplos giran en sentido horario y antihorario. Si
Stepper One Revolution
StepperOneRevolution.ino se llama el ejemplo que dejo a continuación.
Adapta los pines a tu caso.

Code: [Select]
/*
 Stepper Motor Control - one revolution

 This program drives a unipolar or bipolar stepper motor.
 The motor is attached to digital pins 8 - 11 of the Arduino.

 The motor should revolve one revolution in one direction, then
 one revolution in the other direction.

Ajusta pines (ya lo hice pero verifica)
Ajusta setps
[code]stepsPerRevolution = 512;


Este es el código

Code: [Select]
/*
 Created 11 Mar. 2007
 Modified 30 Nov. 2009
 by Tom Igoe

 */

#include <Stepper.h>

const int stepsPerRevolution = 200;  // change this to fit the number of steps per revolution
// for your motor

// initialize the stepper library on pins 8 through 11:
Stepper myStepper(stepsPerRevolution, 6, 7, 8, 9);

void setup() {
  // set the speed at 60 rpm:
  myStepper.setSpeed(60);
  // initialize the serial port:
  Serial.begin(9600);
}

void loop() {
  // step one revolution  in one direction:
  Serial.println("clockwise");
  myStepper.step(stepsPerRevolution);
  delay(500);

  // step one revolution in the other direction:
  Serial.println("counterclockwise");
  myStepper.step(-stepsPerRevolution);
  delay(500);
}

Javitolo

Vale, hasta ahí llego  :) . Para que el ejemplo que pusiste funcione en mi motor hay que cambiar el orden de los pines a 6,8,7,9.
Este ejemplo me valdría para mi proyecto si no fuera por que cuando apagas el invento y lo vuelves a encender el motor no recuerda la ultima posición, por eso lo de el final de carrera.
Voy a trastear un poco con esta librería

surbyte

El ejemplo e sun ejemplo.
Lo adaptamos a tu acaso entonces. Yo solo te mostré que sin complicarte tienen como ir y volver.


Ahora te has salteado esto en tu código?

Es SetDirection() quien va a controlar la dirección de giro y el valor de Steps, vamos a ver como:

Code: [Select]
void SetDirection()
   { 
      if(Direction)
         Steps++;
      else
         Steps--;

      Steps = ( Steps + 8 ) % 8 ;
   }


Viene de acá Tutorial Prometec Motores paso a paso

Javitolo

Bueno, con la librería Stepper ya consigo que gire entero y de la vuelta entera.

Code: [Select]


#include <Stepper.h>

const int stepsPerRevolution = 2048;         

Stepper myStepper(stepsPerRevolution, 6, 8, 7, 9);

void setup() {
                         
  myStepper.setSpeed(15);
                         
  Serial.begin(9600);
}

void loop() {
 
  Serial.println("clockwise");
  myStepper.step(stepsPerRevolution);
  delay(500);

 
  Serial.println("counterclockwise");
  myStepper.step(-stepsPerRevolution);
  delay(500);
}


Ahora respecto al otro ejemplo que me dices creo que la dirección de giro ya la tengo controlada,el problema es que quiero que gire cuando pulse el final de carrera. Si, he conseguido que cuando pulse un final de carrera gire a la derecha y cuando pulse el otro gire a la izquierda , pero esto solo lo consigo desde el motor parado.

surbyte

#7
Nov 06, 2017, 10:54 pm Last Edit: Nov 06, 2017, 10:55 pm by surbyte
Con un motor paso a paso (hasta ahora me doy cuenta) no necesitas fines de carrera!!!
Para que estan los pasos que se traducen en un desplazamiento determinado?
Mueves el motor en un sentido tantos pasos y luego lo mueves en el sentido opuesto la misma cantidad de pasos y asi hasta el infinito.


Javitolo

Eso ya lo he conseguido, el problema es que cuando apagas el invento y después lo vuelves a encender los motores no tienen memoria de donde se pararon, con lo que varia la zona desde la que empieza el recorrido según donde apagues el arduino.
Lo que quiero conseguir es esto aquí

surbyte

Los motores no pero tu si. Lo guardas en la EEPROM y listo.
Cómo lo haces. SImple que sea tu Arduino el que controle el apagado. Cuando le das la orden de apagar, primero salvas la posición o el paso donde ha quedado previa orden de detención. y luego se apaga actuando sobre el rele de la máquina si la hubiera.


Javitolo

No, lo apago manual por medio de un interruptor.
Encontré esta página investigando un poco y abajo del todo al final tiene un código y un vídeo que también me valdría. El problema es que utiliza otra controladora para el motor, aunque intente adaptar el código para mi motor no consigo que funcione bien.

Javitolo

Bueno, ya conseguí lo que quería. Al final era mas fácil de lo que yo pensaba, me había obcecado y no veía un error en el código que tenia delante de las naríces.
Gracias por los consejos y un saludo.

surbyte

Bueno coméntalo porque de nada sirve que plantees un problema y te lleves la solución a tu casa sin compartirla.
Este es un foro en el que todos se benefician, no solo tu.

Javitolo

Tienes toda la razón :) .
Este es el código con el que lo he conseguido. El motor gira hacia un lado y cuando pulsa en final de carrera gira hacia el otro y así continuamente. Ahora lo voy a ampliar para que con un pulsador pueda elegir tres velocidades diferentes.
Code: [Select]


//declaración de las variables para los pines del motor
int motorPin1 = 8;    // Azul   - 28BYJ48 pin 1 motor
int motorPin2 = 9;    // Rosa   - 28BYJ48 pin 2 motor
int motorPin3 = 10;    // Amarillo - 28BYJ48 pin 3 motor
int motorPin4 = 11;    // Naranja - 28BYJ48 pin 4 motor
                       

int finalcarrera_iz = 6;  //Final de carrera sentido anti-horario 
int finalcarrera_de = 5;  //Final de carrera sentido horario

int lectura2 = 0;      //Almacena el valor del finalcarrera_de
int lectura = 0;       //Almacena el valor del finalcarrera_iz
                       

int motorSpeed =1500;  //variable para fijar la velocidad del motor (el retraso entre cada secuencia)
int countsperrev = 512; // número de pasos por vuelta completa
int lookup[8] = {B01000, B01100, B00100, B00110, B00010, B00011, B00001, B01001};

void setup() {
 
  pinMode(motorPin1, OUTPUT);
  pinMode(motorPin2, OUTPUT);
  pinMode(motorPin3, OUTPUT);
  pinMode(motorPin4, OUTPUT); 
}

void loop(){

  lectura = digitalRead(finalcarrera_de);
  lectura2 = digitalRead(finalcarrera_iz);
 
  if (lectura2 !=0)
  {
    while (lectura == 0){
    lectura = digitalRead(finalcarrera_de);
    anticlockwise();}
  }

  if (lectura !=0)
  {
    while (lectura2 == 0){
    lectura2 = digitalRead(finalcarrera_iz);
    clockwise();}
  }
}

//creación funciones giro horario y antihorario
 
void anticlockwise()

  for(int i = 0; i < 8; i++)
  {
    setOutput(i);
    delayMicroseconds(motorSpeed);
  }
}

void clockwise()
{
  for(int i = 7; i >= 0; i--)
  {
    setOutput(i);
    delayMicroseconds(motorSpeed);
  }
}

void setOutput(int out) //función secuencia giro
{
  digitalWrite(motorPin1, bitRead(lookup[out], 0));
  digitalWrite(motorPin2, bitRead(lookup[out], 1));
  digitalWrite(motorPin3, bitRead(lookup[out], 2));
  digitalWrite(motorPin4, bitRead(lookup[out], 3));
}





Un saludo

Go Up