Hola, espero me puedan ayudar, el proceso que debo hacer es el siguiente:
Es para una maquina de coser; cuando se activa la maquina se activa un sensor el cual manda una señal a una solenoide, se activa la maquina y se desactiva el sensor, cuando termina, mecanicamente se activa nuevamente el sensor y se activa nuevamente la solenoide.
El problema es que se queda en alto la solenoide ya que el mecanismo se queda enclavado por lo tanto, la solenoide esta constantemente activa y solo debe activarse una vez y desactivarse hasta que se vuelva a desactivar y activar el sensor.
Viendolo mas simple y como eh estado realizando mis pruebas: tengo un botón cuando lo activo se debe prender un led por cierto tiempo y apagarse automáticamente sin que yo desactive el botón, y no debe ser cíclico si no hasta que presione nuevamente el boton
cuando se activa la maquina se activa un sensor el cual manda una señal a una solenoide, se activa la maquina y se desactiva el sensor,
Creo que necesitas acomodar tus ideas....
Dices que la maquina activa un sensor, hasta ahí vamos bien, pero luego dices: se activa la maquina y se desactiva el sensor, entonces al activarse la maquina se activa o se desactiva el sensor? Por cierto ¿cual sensor? Cual solenoide?
Te invito a que leas las normas del foro, ahí se explica como debes publicar correctamente tus dudas
El sensor se activa por medio de un mecanismo que tiene la maquina de coser que siempre que no cose esta activado, cuando la maquina comienza a coser el mecanismo se desenclava y por lo tanto se desactiva.
El sensor se encarga de activar y desactivar la solenoide la cual funciona como limpiador de hilo.
Agradezco que haya contestado mi duda, y espero esta vez haya sido un poco más clara.
//Primero declaro mis variables
int sswitch=6;
int solenoide=7;
int sensor= 0;
void setup(){
pinMode(sswitch, INPUT); //Sensor
pinMode(solenoide, OUTPUT); //Solenoide
}
void loop(){
//Si el sensor esta prendido se activa la solenoide por cierto tiempo y se apaga
sensor=digitalRead(sswitch);
if(sensor==HIGH){
digitalWrite(solenoide, HIGH);
delay(250);
digitalWrite(solenoide, LOW);
}
}
Pero no logro que se desactive, permanece parpadeando, ya intente con interrupciones y con for aunque creo que no todo lo que hice fueron ideas muy razonables decidí intentar y cuando no lo logre pensé en pedir ayuda. Nuevamente gracias.
Según tu programa, mientras sensor==HIGH el solenoide va a mantenerse oscilando , ya que lo conectas, a los 250mS lo desconectas y al volver a comenzar el loop vuelve a hacer lo mismo. En principio deberías corregir ésto. Por otro lado decís que cuando se desactiva el sensor se debe activar el solenoide, pero ponés en HIGH el solenoide cuando el sensor está en HIGH. ¿Tenés el switch en pullup y el sensor lo pone a masa ? No termino de entender la lógica de ésto. Si podés explicar como está conectado el sistema sería más fácil poder ayudarte.
Bien, según lo que entendí (que por cierto leí varias veces tu post), hice unos cambios a tu codigo. Debo aclarar que me base en la forma que tiene tu código y usando técnicas ancestrales de deducción para entender lo que quieres lograr, y con esto llegue a la conclusión de que tu quieres que el solenoide se active justo después que la maquina deja de coser, hace su trabajo y se desactiva y queda así hasta un nuevo ciclo de costura ¿estoy en lo cierto?
aqui esta pruebalo:
//Primero declaro mis variables
const byte sswitch=6;
const byte solenoide=7;
bool estadoSensor, anteriorSensor;
unsigned long tActual, tiempoSolenoide=500; //Tiempo que durara encendido el solenoide, modificalo segun tus necesidades
void setup(){
pinMode(sswitch, INPUT); //Sensor
pinMode(solenoide, OUTPUT); //Solenoide
}
void loop(){
//Si el sensor esta prendido se activa la solenoide por cierto tiempo y se apaga
estadoSensor=digitalRead(sswitch);
if(estadoSensor && !anteriorSensor){
digitalWrite(solenoide, HIGH);
tiempoSolenoide=millis();
}
anteriorSensor=estadoSensor;
if(millis()-tActual >=tiempoSolenoide)
digitalWrite(solenoide, LOW);
}
Si no funciona es porque no has sido muy claro explicando tu problema, entonces tendrás que explicar muy bien, la forma que tienes conectado tu sensor, es decir cuando la maquina esta activa el sensor entrega un HIGH o un LOW, como esta configurado como pull-up o como pull-down?, ¿cuando se debe activar el solenoide, cuando hay un high o un low en el sensor? ¿el solenoide debe trabajar cuando la maquina se para o cuando arranca?. etc, etc, etc.
Toda la información es importante recuerda que no estamos contigo viendo tu maquina de coser
RIG:
Bien, según lo que entendí (que por cierto leí varias veces tu post), hice unos cambios a tu codigo. Debo aclarar que me base en la forma que tiene tu código y usando técnicas ancestrales de deducción para entender lo que quieres lograr, y con esto llegue a la conclusión de que tu quieres que el solenoide se active justo después que la maquina deja de coser, hace su trabajo y se desactiva y queda así hasta un nuevo ciclo de costura ¿estoy en lo cierto?
aqui esta pruebalo:
Hola RIG, agradezco tu ayuda y disculpa si te eh hecho batallar pero valla que estas en lo cierto, en cuanto pueda la pruebo para ver como me va y anexar mas acciones al proceso, de todas formas me has salvado, soy nueva en esto pero espero en un futuro poder ser parte de los que ayudan.
Pablo_Lucini:
Según tu programa, mientras sensor==HIGH el solenoide va a mantenerse oscilando , ya que lo conectas, a los 250mS lo desconectas y al volver a comenzar el loop vuelve a hacer lo mismo. En principio deberías corregir ésto. Por otro lado decís que cuando se desactiva el sensor se debe activar el solenoide, pero ponés en HIGH el solenoide cuando el sensor está en HIGH. ¿Tenés el switch en pullup y el sensor lo pone a masa ? No termino de entender la lógica de ésto. Si podés explicar como está conectado el sistema sería más fácil poder ayudarte.
Y Pablo igualmente gracias se que soy un fiasco explicando en persona ahora escrito se me complica más, con la práctica ya iré mejorando.
Hola de nuevo, probe con el código que me sugeriste e hice algunos ajustes y me ha funcionado, pero solo durante un ciclo.
Me explico y espero esta vez ser clara : tengo un sensor es de limite y esta conectado como pull down, me entrega 0 (LOW), de inicio esta activado(HIGH), cuando arranca la maquina se desactiva el sensor(LOW) y cuando esta para vuelve a activarse(HIGH); lo que eh logrado (y gracias a su ayuda) es que de inicio se active la solenoide y se detiene se activa la maquina y cuando se activa el sensor ya no se vuelve a activar la solenoide, es decir solo hace un ciclo, ya monitoree la entrada y veo que el sensor si entrega el cambio de estado, también cambie el if pero me volvía a mi problema anterior, espero me den alguna sugerencia...
//Primero declaro mis variables
int sswitch=6;
int solenoide=7;
int sensor= 0;
void setup(){
pinMode(sswitch, INPUT); //Sensor
pinMode(solenoide, OUTPUT); //Solenoide
}
void loop(){
//Si el sensor esta prendido se activa la solenoide por cierto tiempo y se apaga
sensor=digitalRead(sswitch);
if(sensor==HIGH){
digitalWrite(solenoide, HIGH);
delay(250);
digitalWrite(solenoide, LOW);
while(digitalRead(sswitch)==HIGH) {}; // Mientras el sensor está prendido (se supone que la máquina está en marcha) espera sin hacer nada más hasta que pare la máquina
}
}
A tu código, qwaszxedc, le he añadido un while que espera a que se detenga la máquina. Espero que sea eso lo que quieres, porque tu explicación parece un acertijo en forma de trabalengua. Y encima tu código inicial (sobre el que he hecho la modificación) parece decir que el sensor está en HIGH cuando la máquina está funcionando y en tu última explicación parece que dices lo contrario, que el sensor está en LOW cuando la máquina está funcionando.
Hola RIG, estuve modificando esa línea, pero nunca se desactiva el solenoide, e IgnoranteAbsoluto ya lo eh probado y no me ha funcionado, de todas formas seguire intentando, espero encontrar mi error, gracias por su ayuda.
Bueno, acabo de probar en código en el simulador te thinkerCad y a mi si me funciona,por lo que imagino que tu problema está en el hardware. Te dejo la imagen con las conexiones que tengo, el led simula el solenoide y el pulsador simula tu sensor. Obviamente yo solamente conecto el led, pero en tu caso debes tener un circuito de control de potencia para el solenoide ya que no lo puedes conectar directamente al arduino
El código está hecho según lo que entendí. Algo asi: Cuando la maquina comienza a trabajar tienes un low en el sensor, por lo que el solenoide está apagado, al detener la maquina el sensor cambia a high con lo cual el solenoide se energiza durante el tiempo establecido en la variable tiempoSolenoide terminado ese tiempo el solenoide se apaga y se queda asi hasta repetirse el ciclo de la maquina. En la misma imagen está el código
Hola RIG, disculpa por contestar hasta ahora, te cuento que asi lo eh estado probando después de no tener éxito con la solenoide solo eh hecho pruebas con un led, también lo eh simulado en Proteus 8, pero me ha dado solo un ciclo y después de eso aunque vuelva a activar el sensor/botón ya no se enciende el led, seguiré intentando y vuelvo para contarles.
Hola de nuevo, pensé que mi problema como dices esta en el hardware, y valla que si eh probado con otro arduino y a funcionado... agradezco su apoyo, lamento haberlos liado con mi redacción y espero poder compartirles mi proyecto en cuanto lo termine. Hasta pronto. :o