This forum uses cookies
This forum makes use of cookies to store your login information if you are registered, and your last visit if you are not. Cookies are small text documents stored on your computer; the cookies set by this forum can only be used on this website and pose no security risk. Cookies on this forum also track the specific topics you have read and when you last read them. Please confirm whether you accept or reject these cookies being set.

A cookie will be stored in your browser regardless of choice to prevent you being asked this question again. You will be able to change your cookie settings at any time using the link in the footer.

  • 0 voto(s) - 0 Media
  • 1
  • 2
  • 3
  • 4
  • 5
DUDA Ayuda con programa Girarrelojes con motor paso a paso 28BYJ-48 y ULN2003
#1
Un girarrelojes es un dispositivo para los relojes automáticos (aquellos que se cargan con el movimiento) que consiste en un motor que mueve el reloj de tal forma que este nunca se para y no hay que ponerlo en hora cada vez que quieras ponertelo. Estos dispositivos son muy caros, de ahi que quiera fabricarme el mio propio con ayuda de mi impresora 3D y Arduino.
Ya tengo mi Arduino Nano y un motor paso a paso 28BYJ-48 con su controlador ULN2003 (adjunto una foto para el que no se situe).
Lo que peor se me da de todo esto es la programación, y es donde neceaito ayuda. El programa es sencillo:
El motor gira 30 minutos en el sentido horario, 30 minutos esta quieto, y otros 30 minutos en sentido antihorario, así en un bucle permanente hasta que se apague el dispositivo. Como añadido me gustaría incluir un led RGB que haga la siguiente función: cuando el motor está en movimiento el led esta en verde, cuando el motor esta parado (en el periodo de descanso) el led esta amarillo, y cuando no esta funcionando (apagado) esta en rojo.
Si alguien pudiera hacerme este pequeño programa, o comentarme cómo podría hacerlo sería de gran ayuda.
Además cuando acabe mi proyecto estaré encantado de compartir los diseños del dispositivo asi como toda la información que preciseis. Gracias de antemano amigos.
[Imagen: Motor_paso_a_paso_28_BYJ_48_stepper_Driv...LN2003.jpg]

[Imagen: instasize_180822204858.png]

faith poems
  Responder
#2
Hola,

hacer un programa como el que propones no es muy complejo....para el que sabe de programación y está acostumbrado a cacharrear con arduino. Yo de programación sé lo justito pero he cacharreado algo.

Mi consejo es que lo vayas haciendo por partes: primero haz que el motor gire en un sentido, después otro sketch que gire al contrario y así poco a poco vas construyendo el programa.

Te paso un código extraido de un invento que tengo por ahí que creo que te deberia de funcionar

Código:
#define EN        8  //Enable
const int stepPin = 2;//Pasos
const int dirPin = 5;//Dirección


void setup() {

pinMode(stepPin,OUTPUT);//
pinMode(dirPin,OUTPUT);//
pinMode(EN, OUTPUT);//
digitalWrite(EN, LOW);//

}

void loop() {
 
digitalWrite(dirPin,HIGH);//un sentido de la marcha
digitalWrite(stepPin,HIGH);
delayMicroseconds(1000);
digitalWrite(stepPin,LOW);
delayMicroseconds(20);

}

No lo he usado con el mismo motor pap que el tuyo ni con el mismo controlador, pero si es del tipo Dir/Step te puede valer.

Al principio del sketch he declarado los pines que ya tenia puestos, tú pon los que te convenga. El programa lo que te hará es girar el motor en un sentido, podrás variar la velocidad variando el valor de delayMicroseconds, tanto en el que se refiere al HIGH como al LOW.

En un principio si te funciona, te indicaria cómo seguir pero no me arriesgo a hacerlo más complicado porque yo estoy acostumbrado a ir probando lo que hago y en este caso debes ser tú.

Saludos.
  Responder
#3
El conjunto de motor/controlador que indicas se incluye en algún kit de Arduino como uno de Elegoo del que puedes descargar el manual, código y demás de su web: https://www.elegoo.com/tutorial/Elegoo%2....10.31.zip Tienes que mirar la lección 31 donde tienes la explicación de cómo conectarlo y en su código de ejemplo tienes un programa que hace que el motor gire una vuelta en una dirección, espere medio segundo, gire una vuelta en sentido contrario y espere otro medio segundo, así hasta que lo desconectes.

El código de ejemplo:

Código:
//www.elegoo.com
//2016.12.12

/*
 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.

 */

#include <Stepper.h>

const int stepsPerRevolution = 1500;  // change this to fit the number of steps per revolution

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

void setup() {
  // set the speed at 20 rpm:
  myStepper.setSpeed(20);
  // 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);
}

Teniendo en cuenta que se le pone una velocidad de 20 rpm, podrías sustituir:

Código:
myStepper.step(stepsPerRevolution);

por:

Código:
for(int i = 0; i < 600; i += 1)
   myStepper.step(stepsPerRevolution);

para que estuviera 30 minutos girando en sentido horario (30 minutos por 20 revoluciones cada minuto = 600 revoluciones en media hora más o menos).

De igual forma podrías sustituir las 2 líneas:

Código:
delay(500);

por sus correspondientes bucles:

Código:
for(int i = 0; i < 1800; i += 1)
   delay(1000);

para que esperase media hora (30 minutos por 60 segundos cada minuto = 1800 segundos en media hora) y por último deberías sustituir

Código:
myStepper.step(-stepsPerRevolution);

por otro bucle igual que el primero pero con el "-" (signo menos) delante de stepsPerRevolution. Me parece que algo así es lo que haría alguien que se está iniciando en esto de la programación. Creo que el código es muy fácil de entender y lo podrás modificar sin ningún problema (la velocidad de 20 rpm  dentro de la función setup por ejemplo).

Por cierto, en la lección 4 se usa un led RGB, así que tampoco deberías tener problemas para añadir/programar dicho elemento adicional.

Saludos.
  Responder
#4
(24-08-2018, 01:54 PM)calimocho escribió: El conjunto de motor/controlador que indicas se incluye en algún kit de Arduino como uno de Elegoo del que puedes descargar el manual, código y demás de su web: https://www.elegoo.com/tutorial/Elegoo%2....10.31.zip Tienes que mirar la lección 31 donde tienes la explicación de cómo conectarlo y en su código de ejemplo tienes un programa que hace que el motor gire una vuelta en una dirección, espere medio segundo, gire una vuelta en sentido contrario y espere otro medio segundo, así hasta que lo desconectes.

El código de ejemplo:

Código:
//www.elegoo.com
//2016.12.12

/*
 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.

 */

#include <Stepper.h>

const int stepsPerRevolution = 1500;  // change this to fit the number of steps per revolution

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

void setup() {
  // set the speed at 20 rpm:
  myStepper.setSpeed(20);
  // 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);
}

Teniendo en cuenta que se le pone una velocidad de 20 rpm, podrías sustituir:

Código:
myStepper.step(stepsPerRevolution);

por:

Código:
for(int i = 0; i < 600; i += 1)
   myStepper.step(stepsPerRevolution);

para que estuviera 30 minutos girando en sentido horario (30 minutos por 20 revoluciones cada minuto = 600 revoluciones en media hora más o menos).

De igual forma podrías sustituir las 2 líneas:

Código:
delay(500);

por sus correspondientes bucles:

Código:
for(int i = 0; i < 1800; i += 1)
   delay(1000);

para que esperase media hora (30 minutos por 60 segundos cada minuto = 1800 segundos en media hora) y por último deberías sustituir

Código:
myStepper.step(-stepsPerRevolution);

por otro bucle igual que el primero pero con el "-" (signo menos) delante de stepsPerRevolution. Me parece que algo así es lo que haría alguien que se está iniciando en esto de la programación. Creo que el código es muy fácil de entender y lo podrás modificar sin ningún problema (la velocidad de 20 rpm  dentro de la función setup por ejemplo).

Por cierto, en la lección 4 se usa un led RGB, así que tampoco deberías tener problemas para añadir/programar dicho elemento adicional.

Saludos.

Muchas gracias @calimocho , hasta ahora el programa va perfecto. Lo único que se me ha estropeado el led RGB y tendré que usar 2 leds normales de la siguiente forma:
El led verde lucirá siempre que el motor este en movimiento (independientemente de su dirección) y el led rojo lucirá solo cuando el motor este en el periodo de descanso (parado). Se que no es dificil pero me estoy comiendo mucho la cabeza con esta tonteria, por si me pudieras ayudar.
Esto es lo que llevo de código:
Código:
#include <Stepper.h>

const int stepsPerRevolution = 1500;  //pasos por revolución

// inicializa la biblioteca de pasos en los pines 8 a 11:
Stepper myStepper(stepsPerRevolution, 8, 10, 9, 11);

void setup() {
 // velocidad a 20 rpm (revoluciones por minuto)
 myStepper.setSpeed(20);
 // se inicializa el puerto serie a 9600 baudios
 Serial.begin(9600);
}

void loop() {
 // step one revolution  in one direction:
 Serial.println("clockwise");
 for(int i = 0; i < 600; i += 1)     //
 myStepper.step(stepsPerRevolution);    //

 for(int i = 0; i < 1800; i += 1)
 delay(1000);

 // step one revolution in the other direction:
 Serial.println("counterclockwise");
 for(int i = 0; i < 600; i += 1)
 myStepper.step(-stepsPerRevolution);
 
 for(int i = 0; i < 1800; i += 1)    //
 delay(1000);    //
}

Muchas gracias otra vez y un saludo.
  Responder
#5
Suponiendo que el led verde lo vas a conectar al pin 2 (D2) y el rojo al pin 3 (D3), a ver si te vale esto:

Código:
#include <Stepper.h>

const int stepsPerRevolution = 1500;    // pasos por revolución
int direccion = 1;            // 1 = clockwise, -1 = counterclockwise
int led_verde = 2;            // Led Verde conectado al pin 2
int led_rojo = 3;            // Led Rojo conectado al pin 3

// inicializa la biblioteca de pasos en los pines 8 a 11:
Stepper myStepper(stepsPerRevolution, 8, 10, 9, 11);

void setup() {
    // velocidad a 20 rpm (revoluciones por minuto)
    myStepper.setSpeed(20);

    // Inicializa los pins de los leds como salidas
    pinMode(led_verde, OUTPUT);
    pinMode(led_rojo, OUTPUT);

    // se inicializa el puerto serie a 9600 baudios
    Serial.begin(9600);
}

void loop() {
    // Indica la dirección de giro:
    if(direccion = 1)
        Serial.println("clockwise");
    else
        Serial.println("counterclockwise");

    digitalWrite(led_verde, HIGH);    // Enciende el Led Verde
    digitalWrite(led_rojo, LOW);    // y apaga el Led Rojo

    // Gira el motor durante 1/2 hora en la dirección programada
    for(int i = 0; i < 600; i += 1)
        myStepper.step(direccion * stepsPerRevolution);

    digitalWrite(led_verde, LOW);    // Apaga el Led Verde
    digitalWrite(led_rojo, HIGH);    // y enciende el Led Rojo

    // Espera durante la siguiente 1/2 hora
    for(int i = 0; i < 1800; i += 1)
        delay(1000);

    // Cambia la Dirección de Giro
    direccion = -1 * direccion;
}

Saludos.
  Responder
#6
entiendo que ahora quieres poner dos leds?
Al principio del skecth tienes que definir los pines donde vas a conectar los les:
por ejemplo:
int led_verde = 6;
int led rojo = 7;

luego en el void setup:
identificas estos leds como salidas.
pinMode (led_verde, OUTPUT);
pinMode (led_rojo, OUTPUT);

luego dentro del void loop le indicas al led verde que parpadee cada x tiempo.
el led rojo parpadee mientras este encontantdo los 30min
  Responder
#7
@calimocho y @homer32 muchas gracias a ambos por vuestro interés y ayuda. El código funciona perfectamente. Si alguno de los dos tiene interés por el girarrelojes estaré encantado de manteneos informados. Un saludo y gracias otra vez.
  Responder
#8
Puedes compartir fotos y plano del diseño 3d?

Gracias!!

Enviado desde mi Mi A1 mediante Tapatalk
  Responder


Posibles temas similares…
Tema Autor Respuestas Vistas Último mensaje
  APORTE Como hacer un drone con Arduino paso a paso. Explicado. DroneArduino 6 2,865 30-08-2021, 06:16 PM
Último mensaje: Lab.Gluon
  cambio de sentido de los motores paso a paso vssinpelusa 5 8,852 05-02-2018, 10:18 PM
Último mensaje: drow
  Ayuda con codigo boton de pause motor PaP fredyr 2 1,751 22-08-2017, 08:48 PM
Último mensaje: fredyr
  Cómo se programa este Arduino? cybero 7 2,879 02-01-2017, 06:41 PM
Último mensaje: daniez
  Problemas al cargar programa an arduina nano atmega328 ALTOVER 1 1,801 23-08-2016, 03:27 PM
Último mensaje: jagvalles