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.
Practica con tu motor paso a paso el cambio de giro y lo resuelves.
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:
//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));
}
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.
/*
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
/*
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);
}
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
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:
void SetDirection()
{
if(Direction)
Steps++;
else
Steps--;
Steps = ( Steps + 8 ) % 8 ;
}
Viene de acá Tutorial Prometec Motores paso a paso
Bueno, con la librería Stepper ya consigo que gire entero y de la vuelta entera.
#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.
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.
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í
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.
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.
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.
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.
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.
//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