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.
faith poems
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.
24-08-2018, 01:54 PM
(Última modificación: 24-08-2018, 01:55 PM por calimocho.)
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:
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.
(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:
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.
01-09-2018, 04:14 PM
(Última modificación: 01-09-2018, 04:21 PM por calimocho.)
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.
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
@ 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.
Puedes compartir fotos y plano del diseño 3d?
Gracias!!
Enviado desde mi Mi A1 mediante Tapatalk
|