Dystrom:
Te he modificado el programa pero no lo he probado, si quieres pruebalo, de todas formas la subrutina bajar no veo bien que es lo que hace, porque haces un bucle FOR sin ningun tipo de retraso por lo que entrara en el en 30 ciclos de scan o lo que es lo mismo casi es decir que lo haga una vez ya que lo hara tan rápido que ni lo apreciaras. Si aun con este programa no te va, empieza marcando como comentario las subrutinas encendido y bajar, lo pruebas y si no va almenos va acontando el error, ambien te propongo que incluyas un serial.begin(9600) en el setup y pongas etiquetas en los sitios que vayan enviando textos por ejemplo serial.println("enciendo taladro"); asi por el monitor veras por donde va tu programa y te ayudara a encontrar el error.
Por tu programa me da a entender que lo has ido haciendo a trozos y probando por separado cada cosa y luego lo has unido.
#include <Stepper.h>
const int stepsPerRevolution = 200; // cambie este valor por el numero de pasos de su motor
Stepper myStepper(stepsPerRevolution, 8,9,10,11); // inicializa la libreria 'stepper' de los pines 8 a 11
int activar = 2 ; // definimos el botón donde conectamos el botón de que pone en marcha el taladrin.
int led_activar=5;
int estadoUltimo=0;//
int contador=0;//
int estadoActual=0;//
int rele = 7; //
int subir = 4; // definimos donde conectamos el pulsador subir
int fin_carrera = 6 ; // definimos donde conectaremos el bumper de fin de carrera (reposo)
int pulsador_bajar = 3; //definimos el pin donde conectaremos el pulsador bajar
void setup() {
pinMode (activar,INPUT); //activa el taladro
pinMode (led_activar,OUTPUT);
pinMode (subir,INPUT); // sube a reposar
pinMode (rele,OUTPUT);
pinMode (fin_carrera, INPUT);
pinMode (pulsador_bajar,INPUT); // baja
myStepper.setSpeed(150);// establece la velocidad en 150rpm
Serial.begin(9600);// inicializa el puerto serial
}
void loop() {
encendido(); // función para encender y apargar el taladrin
reposo(); // función para que suba el bloque a la posición de reposo
bajar(); // función para que el taladro baje a la posicion listo para taladrar
}
void encendido (){
estadoActual=digitalRead(activar);
if (estadoActual != estadoUltimo){
if (estadoActual == HIGH) {
contador = ++;
}
}
estadoUltimo=estadoActual;
if(contador% 2 == 0) {
digitalWrite (rele,LOW);
digitalWrite (led_activar, LOW);
}
else {
digitalWrite (led_activar, HIGH);
digitalWrite (rele, HIGH);
}
}
void reposo (){
int p1;
int p2;
p1 = digitalRead (subir);
p2 = digitalRead (fin_carrera);
if (p1 == HIGH && p2 == LOW ) { //si hemos pulsado el boton y el taladro no esta arriba
const int velocidad= stepsPerRevolution;
myStepper.step(velocidad); //sube
}
else if (p2 == HIGH)
{
velocidad = 0;
myStepper.step(stepsPerRevolution);
}
}
void bajar () {
int estado_pulsador_bajar;
estado_pulsador_bajar=digitalRead(pulsador_bajar);
if (estado_pulsador_bajar == 1 && contador_bajar == 0) { //si se pulsa el boton de listo y contador esta a cero
contador_bajar = 1;
int x=0;
for (x=0; x<30; x++){
myStepper.step(-stepsPerRevolution); //el motor gira en sentido contrario al reloj y baja el taladro 30 pulsos
}
}
}
La rutina bajar, lo que hace es mandar un número de pulsos para que el taladro baja a la posición deseada y se pare. Con ese número (30) queda justo donde quiero y también e funciona.
Hay otra subrutina que la he omitido y aún no la he puesto pero que la he probado por separado y lo que hace, es que una vez que está el taladro en la posición deseada (despues de los 30 pulsos), al pulsar otro pulsador, el taladro baja un número concreto del pulsos, hace el taladro y sube de nuevo a la posición donde quedó al mandar los 30 pulsos.
Después tenemos la opción de hacer un nuevo taladro y subirlo a la posición de reposo (que es la que me está fallando).
Esta tarde o mañana probaré tu modificación y veré que ocurre.
Gracias a los dos por responder, os diré algo pronto.