apenas aprendo de arduino y pues he dedicado bastantes horas a buscar la solucion a mi problema, pero no e encontrado ningun ejemplo claro que me pueda ayudar por eso recurro a ustedes.
El proyecto que estoy tratando de realizar se trata de una puerta corrediza con un motor paso a paso.
lo que necesito que haga es lo sgt:
-preguntar el estado de un suiche y de un final de carrera
-y basado en ese estado el motor se mueva un determinado numero de pasos hasta que el segundo final de carrera cambie su estado (no se si me hago entender) igual les dejo el codigo debajo
#include <Stepper.h> // Esto es el número de pasos en un minuto
#define STEPS 4096
const int finalA = 1;
const int finalC = 2;
const int SWT = 3;
int value = 0;
int value1 = 0;
int val = 0;
// Constructor, pasamos STEPS y los pines donde tengamos conectado el motor
Stepper stepper(STEPS, 8, 9, 10, 11);
void setup() {
Serial.begin(9600);
pinMode(finalA, INPUT);
pinMode(finalC, INPUT);
pinMode(SWT, INPUT);
stepper.setSpeed(5);// Asignamos la velocidad en RPM (Revoluciones por Minuto)
}
void loop(){
value = digitalRead(finalC); //lectura digital de pin cerrrado
value1 = digitalRead(finalA); //lectura digital de pin ABIERTO
val = digitalRead(SWT); //lectura digital de pin cerrrado
//mandar mensaje a puerto serie en función del valor leido
if (value == HIGH && val == LOW) {
Serial.println("CERRADO");
}
if (value == HIGH && val == HIGH){
Serial.println("ABRIENDO");
stepper.step(200); //numero de paso que queremos que de
delay(2000);
}
delay(1000);
}
Si defines Serial, los pines 0,1 deben reservarse o tendras confilictos
Entonces
const byte finalA = 1
no puede ser y debes mover todo a por ejemplo
const byte finalA = 4;
Esto como no dices como estan conectados los pines no se como entenderlo, estan como pull-down o pull-up?
value = digitalRead(finalC); // lectura digital de pin cerrrado
value1 = digitalRead(finalA); // lectura digital de pin ABIERTO
val = digitalRead(SWT); // lectura digital de pin cerrrado
//mandar mensaje a puerto serie en función del valor leido
if (value == HIGH && val == LOW) {
Serial.println("CERRADO");
}
if (value == HIGH && val == HIGH){
Serial.println("ABRIENDO");
En tus comentarios pones que finalA y finalC son los finales de carrera.
Pero luego usas val y value o sea no tomas en cuenta value1, no comprendo.
value1 verifica el estado del segundo final de carrera, no segui desarrollando el codigo porque necesito saber como puedo girar el motor indefinidamente hasta que se accione el segundo final de carrera (finalA); por consiguiente no segui desarrollando dicho codigo pedi su opinion y sus intervenciones ahora are las correciones que me proporcionaste
Bien, las tareas siempre deben realizarse desde que se comprende algo hasta que se lo controla.
Consulta sabes hacer que el stepper funcione?
supongo que si.
Pero no respondiste mi pregunta sobre el tipo de pulsador o final de carrera que usas, es pull-up o pull-down si no sabes busca en google : arduino pull-up o pull-down
Gracias nuevamente por contestar tan rapido....!! hacia el proyecto pero aun no tengo los finales de carrera fisicos entonces no se cual tendre si pull-dow o pull-up eso si lo entiendo, independientemente de eso puedo cambiar el codigo si es pull-dow o pull-up porque entiendo como funciona, es mas yo creo que no usare las de arduino porque le dan poca potencia al motor y no me sirve para la aplicacion para la que quiero hacer este proyecto.
se hacer que se mueva en los dos sentidos utilizando la libreria stepper.h y sin la libreria pero es un poco engorroso yo solo necesito hacer que el motor se mueva ejemplo hacia la izquierda cuando se active el interruptor hasta que se accione el final de carrera(finalA) luego el motor se detenga y se quede hay hasta que se accione nuevamente el interruptor entonces el motor se movera en sentido contrario hasta accionar el final de carrera(FinalC)
Bueno comienza poniendo nombres y comentarios que ayuden a entender a los que no estamos leyendo tu código porque no se comprende que es cada elemento.
Los finales de carrera estan bien pero el comentario de todos es confuso.
Solo para que te sirva.
Hoy programas esto y luego lo miras en 1 mes y no entiendes que has hecho.
Esto fue lo que pensé
a la izq final de carrera A y a la derecha fcC
Entonces direccion de motor stepper positiva es sentido horario.
Ahora hay una variable llamada direccion
True sentido horario
False sentido anti horario
Tienes una variable estado
estado = true se mueve el motor
estado = false se detiene el motor pero hablo del pulsador que controla eso.
Los finales de carrera los defino como pull-down o sea resistencia conectada a GND. Cuando se presiona tenemos un HIGH y cuando no tenemos un LOW en el pin de lectura.
#include <Stepper.h> // Esto es el número de pasos en un minuto
#define STEPS 4096
/*
swA ---------------------MOTOR---------------------- swC
*/
const byte SWT = 2;
const byte finalC = 3;
const byte finalA = 4;
bool valueA, valueAant = false;
bool valueC, valueCant = false;
bool val, valAnt = false;
bool direccion = true; // true horario false anti horario
// Constructor, pasamos STEPS y los pines donde tengamos conectado el motor
Stepper stepper(STEPS, 8, 9, 10, 11);
void setup() {
Serial.begin(9600);
pinMode(finalA, INPUT); // supongo que A esta a la izq
pinMode(finalC, INPUT); // supongo que C esta a la derecha
pinMode(SWT , INPUT);
stepper.setSpeed(5);// Asignamos la velocidad en RPM (Revoluciones por Minuto)
}
void loop(){
valueC = digitalRead(finalC); // lectura digital de pin cerrrado
valueA = digitalRead(finalA); // lectura digital de pin ABIERTO
val = digitalRead(SWT); // lectura digital de pin cerrrado
if (val && valAnt)
estado = !estado; // flag que controla movimiento
// estado = HIGH se mueve
// estado = LOW no se mueve o esta parado
valAnt = val;
if (estado) // si me muevo verifico finales de carrera
if (direccion) // horario
stepper.step(200); // muevo sentido horario
else // anti horario
stepper.step(-200); // muevo sentido anti horario
if (valueA && !valueAant) // cambio switch izq direccion
direccion = true; // sentido Horario
valueAant = valueA;
if (valueC && !valueCant) // cambio switch izq direccion
direccion = false; // sentido anti Horario
valueCant = valueC;
}
hice un nuevo codigo pero no me corre en proteus les dejare una foto del proteus y del nuevo codigo...
#include <Stepper.h>
// Esto es el número de pasos en un minuto
#define STEPS 4096
const byte fcc = 2; //final de carrera cuando la puerta este cerrada
const byte fca = 4; //final de carrera cuando la puerta este abierta
const byte sw = 3; // switch = indicara cuando la puerta esta abierta o cerrada
int cerrado;
int abierto;
int estado;
// Constructor, pasamos STEPS y los pines donde tengamos conectado el motor
Stepper stepper(STEPS, 8, 9, 10, 11);
void setup(){
pinMode(fcc,INPUT);
pinMode(fca,INPUT);
pinMode(sw,INPUT);// on off
// Asignamos la velocidad en RPM (Revoluciones por Minuto)
stepper.setSpeed(5);
}
void loop() {
cerrado = digitalRead(fcc);
abierto = digitalRead(fca);
estado = digitalRead(sw);
if (estado == LOW && (cerrado == LOW) && abierto == HIGH){ //el motor estara detenido y no girara hasta que se cambie el estado del switch
stepper.step(0); //numero de paso que queremos que de
delay(2000);
}
if (estado == HIGH && (cerrado == LOW) && abierto == HIGH){ // se comenzara a mover hacia la izquierda para cambiar el estado de cerrado
stepper.step(-10); //numero de paso que queremos que de
if (estado == HIGH && (cerrado == HIGH) && abierto == HIGH){ // se mueve con libertad para la izquierda esperando hasta que cambie el estado
stepper.step(-200); //numero de paso que queremos que de
delay(2000);
}
}
if (estado == HIGH && (cerrado == HIGH) && abierto == LOW){ // se abre completamente la puerta y se queda abierta
stepper.step(0); //numero de paso que queremos que de
if (estado == LOW && (cerrado == HIGH) && abierto == LOW){ // comienza a cerrarse la puerta moviendose hacia la derecha
stepper.step(10); //numero de paso que queremos que de
delay(2000);
if (estado == LOW && (cerrado == HIGH) && abierto == HIGH){ // se cierra completa mente y quedan los estados como en el primer if
stepper.step(200); //numero de paso que queremos que de
delay(2000);
}
}
}
}
Moderador: Porque abriste otro hilo con el mismo tema en Proyectos? Eso es doble posteo. No debes abrir hilos similares en diferentes secciones del foro, sea en español, portugués o inglés. El otro hilo fue borrado directamente.
disculpe lo siento no sabia que no se podia!!
bueno lo que pasa es que el codigo que me dio corrio bien pero no se detenia cuando cambiaba el estado de los finales de carrera si no que se detenia cuando cambiaba el sentido y no es el proposito
//definicion de pins
const int motorPin1 = 8; // 28BYJ48 In1
const int motorPin2 = 9; // 28BYJ48 In2
const int motorPin3 = 10; // 28BYJ48 In3
const int motorPin4 = 11; // 28BYJ48 In4
const int fcC = 2;
const int fcA = 4;
const int sw = 3;
//definicion variables
int motorSpeed = 1000; //variable para fijar la velocidad
int stepCounter = 0; // contador para los pasos
int stepsPerRev = 4076; // pasos para una vuelta completa
int motorstop = 1000;
int ya = 0;
//tablas con la secuencia de encendido (descomentar la que necesiteis)
//secuencia 1-fase
//const int numSteps = 4;
//const int stepsLookup[4] = { B1000, B0100, B0010, B0001 };
//secuencia 2-fases
//const int numSteps = 4;
//const int stepsLookup[4] = { B1100, B0110, B0011, B1001 };
//secuencia media fase
const int numSteps = 8;
const int stepsLookup[8] = { B1000, B1100, B0100, B0110, B0010, B0011, B0001, B1001 };
void setup()
{
//declarar pines como salida
pinMode(motorPin1, OUTPUT);
pinMode(motorPin2, OUTPUT);
pinMode(motorPin3, OUTPUT);
pinMode(motorPin4, OUTPUT);
pinMode(fcC, INPUT);
pinMode(sw, INPUT);
pinMode(fcA, INPUT);
}
void loop()
{
if ( (digitalRead(sw == HIGH)) && (digitalRead( fcA== HIGH))){
for (int i = 0; i < stepsPerRev * 2 ; i++)
{
clockwise();
delayMicroseconds(motorSpeed);
}
}
if ( (digitalRead(sw == LOW)) && (digitalRead( fcA== HIGH))){
for (int i = 0; i < ya; i++)
{
para();
delayMicroseconds(motorSpeed-motorstop);
}
}
if ( (digitalRead(sw == LOW)) && (digitalRead( fcC== HIGH))){
for (int i = 0; i < stepsPerRev * 2; i++)
{
anticlockwise();
delayMicroseconds(motorSpeed);
}
}
if ( (digitalRead(sw == HIGH)) && (digitalRead( fcC== HIGH))){
for (int i = 0; i < ya; i++)
{
para();
delayMicroseconds(motorSpeed-motorstop);
}
}
delay(1000);
}
void clockwise()
{
stepCounter++;
if (stepCounter >= numSteps) stepCounter = 0;
setOutput(stepCounter);
}
void anticlockwise()
{
stepCounter--;
if (stepCounter < 0) stepCounter = numSteps ;
setOutput(stepCounter);
}
void para()
{
stepCounter = 0;
if (stepCounter = 0) stepCounter == 0 ;
setOutput(stepCounter);
}
void setOutput(int step)
{
digitalWrite(motorPin1, bitRead(stepsLookup[step], 0));
digitalWrite(motorPin2, bitRead(stepsLookup[step], 1));
digitalWrite(motorPin3, bitRead(stepsLookup[step], 2));
digitalWrite(motorPin4, bitRead(stepsLookup[step], 3));
}
error que tengo si le quito los if corre normal pero solo da dos vueltas y gira en sentido anti ahorario quiero colocar que gire a la derecha cuando se cumplas las condiciones y a la izquierda cuando se cumplan otras