Lo raro es que haya funcionado, y ahora no, estoy repasando otra vez línea por línea el programa, y también repasaré, otra vez, las conexiones por si alguna se ha aflojado.
Gracias
Hola 1952jose
No quisiera interferir, bastantes consultas y respuestas hay !!!
Solo preguntar : que textos te aparecen en el monitor ???.
Utilizas el codigo de #62 de: @IgnoranteAbsoluto ???
Un saludo !!!
Esta montado en un protoboard?
Buenas tardes
El programa de @IgnoranteAbsoluto #62, que es el que utilizo, comienza en la
fila 1: #include <AccelSepper.h>
En el monitor me aparece a continuación #include<MultiStepper.h>, o sea, después de la fila 1, que no aparece en el inicial.
No sé si ha sido el verificador de arduino el que me ha indicado que lo añada, o no se.
Estoy tratando de buscar algo distinto que pueda dar lugar a error, ya que el ascensor, como he indicado funcionaba pulsando uno por uno los pisos.
Otra vez...
Solo debe incluir la librería AccelStepper.
Gracias.
Es suficiente con borrar esa línea?
Perdona, no te había contestado. No está montado en protoboard. Ya está montado en la casita. Ya he repasado todas las conexiones y están correctas.
No, quita esa linea y esta otra:
#define VALOR_ASCENSOR_DETECTADO HIGH
La pones en LOW, veamos si hay suerte y no tengo que montar mas botones.
Con el uso de esa macro hay al menos un error (todavía no revisé todo)
if (pisoDestino > (VALOR_ASCENSOR_DETECTADO / 2)) {
// Si piden ir a un piso de mitar para arriba, subimos
¿Cuál es el resultado de HIGH / 2?
Si asumimos que HIGH = 1 entonces el resultado es 0 porque es una división entera, por lo tanto el condicional se cumple siempre.
Lo mismo si se define LOW.
He puesto LOW en lugar de HIGH, y no funciona nada el ascensor.
Lo que no entiendo es que si el programa funcionaba y al pulsar varios botones deja de funcionar, lo que me parece lógico es que si reseteo y vuelvo a cargar el programa debería de funcionar, independientemente de que hubiera que hacer alguna corrección para evitar el fallo, aunque queda claro que yo no tengo ni puñetera idea de programar.
De todas formas, estoy agradecidísimo por vuestra ayuda.
¿ Abres el monitor serie del IDE para ver los mensajes que te manda el código?.
Seria de ayuda tenerlos.
Te refieres a los mensajes que aparecen en la parte inferior de la pantalla del ordenador ?.
No dan mensajes de error.
No comprendo lo que me quieres indicar. Tengo que cambiar algo?
Tengo que hacer más pruebas, ahora funciona como al principio. No se lo que hará cuando se aprieten varios pulsadores a la vez.
Creo que era un interruptor fin de carrera con una de las terminales rotas por algún golpe, que marcaba el ascensor siempre en el mismo punto y no permitía que se volviera a mover. Al comprobar una por una todos las conexiones, pulsadores e interruptores con el tester, ha sido en la penúltima comprobación el interruptor final de carrera, aparentemente bien, daba error, lo he cambiado y parece que funciona.
No, me refiero a que "Pinches" en: "Herramientas" y "Monitor serie", se abrirá una pantalla:
Asi tendríamos todos información mas detallada que un simple:
Hummm....
No leí el ultimo, si funciona esperemos que no vuelva a fallar.
Saludos.
Hola. Siento no haber dado antes señales de vida. Justo ahora que me iba a "unir a la fiesta" veo que al parecer @1952jose ha dado con el problema del final del carrera y que en principio vuelve a funcionar como es debido. Aún así, voy a hacer un par de comentarios.
Para empezar, @MaximoEsfuerzo tiene toda la razón al decir que hay un error en la condición:
if (pisoDestino > (VALOR_ASCENSOR_DETECTADO / 2)) {
// Si piden ir a un piso de mitar para arriba, subimos
El uso de VALOR_ASCENSOR_DETECTADO no es correcto. Lo correcto es usar NUMERO_DE_PISOS. Quedando la comparación así:
if (pisoDestino > (NUMERO_DE_PISOS / 2)) {
// Si piden ir a un piso de mitad para arriba, subimos
Este error mío no tiene mucha importancia, ya que la idea de este if es que cuando arranque el Arduino y no esté el ascensor detenido en un piso determinado, se encargue de mover el ascensor hacia arriba si se ha pulsado el botón de uno de los pisos de mitad para arriba o hacia abajo en caso contrario. Al estar mal, lo que ocurría es que siempre que arranque el Arduino y no esté detenido en piso determinado, se moverá siempre hacia arriba sin importar qué botón se ha pulsado.
He editado el post #62 corrigiendo el if por si en el futuro a alguien le da por probar el programa. @1952jose corrige ese if en tu código, si quieres.
En principio el programa del post #62 no debería de tener problemas porque se pulsen más de un botón a la vez, sin importar si el ascensor ha llegado a su destino o no. En teoría, si se pulsa un botón, hasta que no llegue a su destino no vuelve a tener en cuenta si se pulsan o no los botones. Sólo verifica los botones si el ascensor acaba de de encenderse o si ha llegado al último destino solicitado. En el caso de que se mantenga pulsado más de un botón a la vez, detecta el del piso más bajo. Es por eso que no entiendo que se "volviera loco" cuando el sobrino de @1952jose pulsó varios botones.
Respecto al fallo del final de carrera que estaba mal conectado, entiendo que el ascensor se comportara como lo estaba haciendo. Supongo que mal contacto hacía indicar siempre que el ascensor se encontraba en ese piso, y cuando le dabas a cualquier botón que no fuera el de ese piso, el ascensor se movería en el sentido que él creía estar desplazándose desde el "piso defectuoso" hasta el "piso solicitado". Lo que pasa es que si por el camino llegaba a cualquier piso que no fuera el "defectuoso", el programa detecta que está en dos pisos: en el "defectuoso" y en el que realmente está y en tal caso detecta la anomalía y el sistema se para par siempre, hasta que se apague y encienda el Arduino o se resetee. Lo que pasa es que si al arrancar el programa el ascensor se encuentra en un piso que no sea el "defectuoso", se vuelven a detectar una anomalía (porque se detecta el ascensor en dos pisos a la vez) y se vuelve a detener. Sólo si se desplaza manualmente el ascensor para que no se detecte en en un piso, es cuando vuelve a pensar que está únicamente en el piso del sensor "defectuoso" y vuelve a moverse como indico al principio de este párrafo.
Para tener una mejor idea de qué es lo que podría estar pasando, habría que hacer lo que propone @gonpezzi en el post #116. Conectar el Arduino y ver qué mensajes aparecen en el monitor serie. Estoy casi seguro que pondría:
Anomalía en los sensores de final de carrera
PARADA EMERGENCIA. Hay que reiniciar
Esto habría dado la pista de que uno de los finales de carrera estaba dando problemas.
Efectivamente sale. En las simulaciones que he hecho sale si mantienes:
#define VALOR_ASCENSOR_DETECTADO HIGH
Si se define en "LOW" el programa corre a las mil maravillas.
¿Que opinas?, veo que lo mantienes en alto.
El valor de la definición de VALOR_ASCENSOR_DETECTADO depende de las características del "sensor". En el caso del montaje de la casa de muñecas los finales de carrera están cerrados mientras no detectan la cabina en su posición, derivando la entrada del Arduino a masa y dando una señal LOW. Al detectar la cabina se abre el contacto y en la entrada del Arduino detecta un HIGH. Es por eso que este es el valor que le asigné a la constante VALOR_ASCENSOR_DETECTADO, porque el código está configurado para ese montaje. Lo más probable es que en tu simulación hayas puesto pulsadores normalmente abiertos (eso mismo fue lo que hice yo para las pruebas), por lo que efectivamente en tu caso has de definir la constante con el valor LOW. Es por eso mismo por lo que he definido las constantes VALOR_ASCENSOR_DETECTADO y VALOR_BOTON_PULSADO, para poder asignarles el valor adecuado según el montaje que se haga de los sensores y botones. Y así, en el caso de tener que cambiarlos, no hay que tener que estar buscando en todo el código qué modificaciones hay que hacer. Esa es la principal utilidad de las definiciones de constantes.
