Felix Maocho

Para quien le interese lo que a nosotros nos interesa

Arduino – Como funciona y se utiliza un pulsador

boton

Por Félix Maocho
19/1/2013

Objetivo de este post:

Enseñar a utilizar pulsadores en los proyectos Arduino tanto en configuración «Pull Down»,  como «Pull Up», Enseñar a utilizzar los PIn como entrada (INPUT) y a solicitar la lectura del PIN. Controlar los mandatos que solo se ejecutan en el primer bucle del «loop» y explicar que son las fases de un objeto y como se identifican la fase de un objeto a lo largo del programa.
_________________

El pulsador, interruptor, botón, o pusbuton, o buton, que por todos estos nombres se conoce.es generalmente una “cucaracha” negra de cuatro pata que tiene un botón en el lomo. La primera pregunta que se le ocurre a cualquiera es, ¿Por qué tiene cuatro patas si lo que hace es cerrar un circuito de solo dos hilos? y la segunda pregunta es, ¿A cuales de esas patas hay que conectar los cables para que funcione el interruptor. Preguntas obvias, pero para las que no es nada sencillo encontrar respuesta, pues como siempre, la información aparte de andar dispersa, no suele ser al nivel tan elemental que precisas y cundo encuentran algo, todos dan por supuesto que sabes algo tan sencillo, como que es y como funciona un pulsador y por tanto nadie pierde el tiempo en explicarlo.

Para averiguarlo, lo mejor es establecer un circuito y probar para que valen las cuatro patas que tiene el pulsador: En el experimento que propongo a continuación, la placa Arduino solo nos va vale como suministradores de energía a 5 voltios, es decir que lo mismo conseguiríamos conectando directamente a la placa protoboard, una pila eléctrica. o el cargador de un móvil que tuviera 5 voltios de salida, el procesador de la placa no va a hacer absolutamente nada y únicamente la utilizo como fuente de energía por comodidad.

Llegó el momento de descubrir para que valen algunas de las salidas que hay al otro lado de la tarjeta, enfrente de los PINs del 0 al 13 que hasta ahora hemos utilizado. Si estudias el otro lado de la tarjeta, verás que una de las salidas esta escrita con las mismas iniciales que la del otro lado “GND”, que hemos utilizado en experimentos anteriores como “polo negativo”,  “tierra”, o “cátodo” de la placa. Deduciremos que este PIN es exactamente igual que el del otro lado y en efecto es un PIN de “tierra”.

Justo al lado de esa salida “GND” se encuentra otra salida marcada como “5v” . Eso nos indica que suministra de forma continua y sin necesidad de programar nada 5 voltios. En consecuencia, si montamos un circuito que empiece en la salida marcada como “5v” y que acabe en cualquiera de las dos salidas marcadas como “GND”, circulará por él, electricidad a 5 voltios.

Como primera medida para comprobarlo, vamos hacer ese circuito poniendo en él, lo único que hasta el momento conocemos bien, la resistencia de 220 homios y en serie un LED, pues si circula electricidad por el circuito, el LED tiene que lucir de forma fija sin necesidad de hacer funcionar ningún programa. Os pongo el esquema para mayor claridad, (como siempre pintado con el programa gratuito Frizting del que os hablé en otro post.

prueba Interruptor_bb

Si montas este circuito, observarás que en efecto el LED luce de forma continua, con solo enchufar la placa al puerto USB,  sin necesidad de haber escrito , complicado y cargado un programa. Las salidas “5v” y “GND” permiten hacer un circuito exactamente igual que como lo harías poniendo los cables que enchufas ahí directamente a los polos “+” y “ –“ de una pila respectivamente

Actualizacion – – – –

Según me ha indicado un lector, el esquema que abre este post, contine un error: la linea  ROJA inferior deberia partir del pihn marcado como sV y no del pin marcado como Gnd (tierra).

– – – – – – –

Comprobado esto pasemos al siguiente punto, sustituir el cable amarilla por el pulsador. ¿Cómo? Pues si vemos las patas del pulsador veremos que salen por dos lados opuestos del cuadrado negro, estos lados son los que colocamos a caballo entre las dos áreas centrales de la placa protoboard, de modo que cada pata esta situada en un cable interno vertical diferente.

Probamos a unir el circuito de dos en dos patas de forma diferente:

Pata inferior izquierda con pata superior izquierda, el resultado es que por el circuito pasa la corriente como demuestra el LED que queda encendido, de donde se deduce que en el pulsador internamente las patas del lado derecho están conectadas. Análogamente si conectamos las dos patas del lado izquierdo pasa constantemente la corriente por lo que las patas del lado izquierdo están tambien conectadas internamente.

prueba Interruptor 1_bb

prueba Interruptor 2_bb

Por último si colocamos los cables de modo que si uno conecta una parta de la izquierda el otro conecte la de la derecha o viceversa, el pulsador funciona correctamente. Es decir  si no lo pulsamos no luce el LED y si lo pulsamos luce. Y esto es indiferente de que patas utilicemos siempre que una sea de la parte derecha y otra de la izquierda-

prueba Interruptor 3_bb

prueba Interruptor 4_bb

pulsador esuema


De ello se deduce que el pulsador es simplemente y en esquema, dos cables paralelos y el botón que conecta uno con otro según se apriete o no tal como indica este esquema.. donde claramente se ve, que sea el la esquina que sea que unes a un cable del circuito, para que el interruptor d funciones has de conectar el otro cable en cualquiera de los extremos de la otra barra.¿Por qué tiene cuatro patas cuando sería suficiente poner dos?- Pues n realmente no lo sé, quizá fuera para darle mas facilidad de conexión, pero más bien pienso que es por darlo estabilidad, como hay que oprimirlo permanece más estable en la tarjeta que si solo tuviera dos puntos de soldadura. .

Sabiendo ya como es internamente pasamos a estudiar como le podemos utilizar. Indudablemente como ocurre en este ejemplo que hemos montado, un uso del pulsador es poder abrir y cerrar un circuito con un LED, zumbador o un motor, a voluntad, de forma que el aparato funcione o no. Posiblemente en algún montaje queramos tener controlado un aparato por un botón, no obstante, este uso será minoritario y raro, pues teniendo una placa especializada en abrir y cerrar circuitos, resulta claramente innecesario el uso de un pulsador manual, que por otra parte, nos obliga a estar oprimiendo el botón durante todo el tiempo que deseemos tener el circuito cerrado, para eso sería mas eficaz un interruptor como los de las lámparas que uno tipo timbre.

Un uso más lógico del interruptor es utilizarlo para indicar a la tarjeta, cuando queremos iniciar o finalizar una acción determinada. Por ejemplo, cuando queremos encender una luz y cuando la queremos apagar. Si conseguimos que la tarjeta detecte cuando hemos oprimido el pulsador, podemos hacer que si el LED esté apagado, se encienda, y si esta encendido, se apague, sin necesidad que durante todo el rato que esté encendido estemos apretando el botón del pulsador. En resumen podemos utilizar el/los,  pulsador/es para indicar a la máquina cuando deber modificar su forma de funcionamiento. En este uso, el interruptor como hardware tiene que venir acompañado en el software de un mandato condicional del tipo “Si oprimió el botón, haz tal cosa”: Entonces lo primero que tenemos que saber es como se entera la tarjeta que hemos oprimido el botón

La tarjeta controladora permite que definamos cada PIN, no solo de salida, (OUTPUT), sino de entrada, (INPUT), ello permite que igual que mandamos escribir un PIN de salida LOW o HIGH, dando una salida de “0” o “5” voltios, podemos mandar leer el PIN de entrada para saber si esta a  0 o 5 voltios, en cuyo caso la repuestas Serra “0“ si está bajo, o ”1” si esta alto.

Así pues, para saber si hemos apretado el pulsador, bastara con saber si la entrada del PIN ha cambiado de voltaje, por tanto en principio podríamos hacer un circuito que se correspondiera al siguiente esquema:

Ponemos unir con un cable desde el PIN 5V  a la pata del pulsador de la pata opuesta ponemos otro cable tierra GMD, Para no provocar un cortocircuito insertamos por medio una resistencia suficientemente grande por ejemplo de 1 K ohm.  En este circuito podemos medir la tensión que hay entre el pulsador y la resistencia, cuando el circuito este abierto ahí habrá 0 o cinco voltios según el orden en que hayamos puesto nuestros componentes.

  • Si el orden  es V5 – Pulsador – Resistencia – GMD o “tierra”  (montaje PULL DOWN) (bajar), entre pulsador y resistencia habrá 0 voltios si esta abierto el circuito y 5 si está cerrado
  • Si el orden  es V5 – Resistencia –  Pulsador – GMD o “tierra”  (montaje PULL UP) (levantar), entre la resistencia y el pulsador habrá 5 voltios si esta abierto el circuito y 0 si está cerrado

La lectura de un PIN que no está  unida a un circuito cerrado, no es válida y puede dar una lectura aleatoria de alta o baja  tensión. Se dice que el PIN que esta “flotante”. Adjunto los tres esquemas posibles

Adjunto los tres esquemas posibles para su mejor comprensión:

montajes de interruptores

Ejemplo de uso

Nos proponemos conseguir que pulsando un botón se encienda un LED que estaba apagado, si por el contrario el LED estaba encendido lo apagamos. Necesitamos por tanto instalar un led por ejemplo del PIN5 tal como ya sabemos hacerlo, en serie con una resistencia de 220 ohms. Y por otro lado instalar un boton, que inicialmente lo instalremos en PULL UP

El circuito que instalamos es tal como indica el esquema, pero utilizamos el LED que tiene casi todas las Tarjetas Arduino UNO  asociado al PIN13, con lo que nos ahorramos instalar un montar cables y componentes y nos centramos en lo que es fundamental en este post, el funcionamiento del botón.  Además ampliaremos nuestro conocimiento de la función “if” con el uso del mandato “if /else”, que podemos utilizar para hacer cosas del tipo, “Si (if) se cumple esta condición, (puesta entre paréntesis), haz esto, (mandatos entre corchetes), si no, (else) , haz esto otro, (otros mandatos entre corchetes).  En este caso el mandato “if/elsa” lo que b va a hacer es si esta apagado encender y en caso contrario apagar. 

prueba de botón_bb

Sabiendo ya como es internamente pasamos a estudiar como le podemos utilizar. Indudablemente como ocurre en este ejemplo que hemos montado, un uso del pulsador es poder abrir y cerrar un circuito con un LED, zumbador o un motor, a voluntad, de forma que el aparato funcione o no. Posiblemente en algún montaje queramos tener controlado un aparato por un botón, no obstante, este uso será minoritario y raro, pues teniendo una placa especializada en abrir y cerrar circuitos, resulta claramente innecesario el uso de un pulsador manual, que por otra parte, nos obliga a estar oprimiendo el botón durante todo el tiempo que deseemos tener el circuito cerrado, para eso sería mas eficaz un interruptor como los de las lámparas que uno tipo timbre.

Un uso más lógico del interruptor es utilizarlo para indicar a la tarjeta, cuando queremos iniciar o finalizar una acción determinada. Por ejemplo, cuando queremos encender una luz y cuando la queremos apagar. Si conseguimos que la tarjeta detecte cuando hemos oprimido el pulsador, podemos hacer que si el LED esté apagado, se encienda, y si esta encendido, se apague, sin necesidad que durante todo el rato que esté encendido estemos apretando el botón del pulsador. En resumen podemos utilizar el/los,  pulsador/es para indicar a la máquina cuando deber modificar su forma de funcionamiento. En este uso, el interruptor como hardware tiene que venir acompañado en el software de un mandato condicional del tipo “Si oprimió el botón, haz tal cosa”: Entonces lo primero que tenemos que saber es como se entera la tarjeta que hemos oprimido el botón

La tarjeta controladora permite que definamos cada PIN, no solo de salida, (OUTPUT), sino de entrada, (INPUT), ello permite que igual que mandamos escribir un PIN de salida LOW o HIGH, dando una salida de “0” o “5” voltios, podemos mandar leer el PIN de entrada para saber si esta a  0 o 5 voltios, en cuyo caso la repuestas Serra “0“ si está bajo, o ”1” si esta alto.

Así pues, para saber si hemos apretado el pulsador, bastara con saber si la entrada del PIN ha cambiado de voltaje, por tanto en principio podríamos hacer un circuito que se correspondiera al siguiente esquema:

Ponemos unir con un cable desde el PIN 5V  a la pata del pulsador de la pata opuesta ponemos otro cable tierra GMD, Para no provocar un cortocircuito insertamos por medio una resistencia suficientemente grande por ejemplo de 1 K ohm.  En este circuito podemos medir la tensión que hay entre el pulsador y la resistencia, cuando el circuito este abierto ahí habrá = o cinco voltios según el orden en que hayamos puesto nuestros componentes.

Si el orden  es V5 – Pulsador – Resistencia – GMD o “tierra”  (montaje PULL DOWN) (bajar), entre pulsador y resistencia habrá 0 voltios si esta abierto el circuito y 5 si está cerrado

Si el orden  es V5 – Resistencia –  Pulsador – GMD o “tierra”  (montaje PULL UP) (levantar), entre la resistencia y el pulsador habrá 5 voltios si esta abierto el circuito y 0 si está cerrado

Si bien ambas posibilidades son correctas, el montaje «Pull Down» es preferible, pues con este montaje, solo gastamos energía proporcionada por la tarjeta, cuando pulsamos el botón, a diferencia de lo que ocurren en el montaje «Pul UP», que gasta energía constantemente, y si bien es poca energía y se disipa en calor en la resistencia sin problema, nuestra placa solo permite el consumo de muy poca intensidad de corriente y poca o mucha, la energía que utilicemos aquí, no la podremos utilizar en otro punto del proyecto.

 Sketch Pulsador

Para crear el sketch , (programa),  Pulsador utilizaremos el esqueleto de programa que tenemos construido y que mostramos en un post anterior. El uso de este tipo de esqueletos normaliza en cierta mediad la construccion de programas y facilita su posterior comprensión puesto que cada zcci´çon  tiene un ligar fijo para ser ejecutada en los sketch,

Sketch Pulsador

Consideraciones sobre el programa

Control del primer bucle. En el programa tiene un ejemplo de algo muy habitual, la necesidad de diferenciar la ejecución del primer bucle, de la que se hace en los demás bucles, pues en el primero es corriente tener que hacer cosas que nos se repiten en los siguientes. En este caso era encender inicialmente el LED asociado al PIN13. Es evidente que en los siguientes bucles no hay que encenderlo, pues si lo hiciéramos, de nada nos valdría apagar el LED, se volvería a encender casi instantáneamente. La solución es inicializar una variable, que nosotros hemos llamado “primeravez”, con un valor, por ejemplo 1, e iniciar el bucle con un mandato  “if” condicionado a que esa variable tenga el valor con la que la hemos inicializado y una vez hecho lo que queremos hacer la primera y única vez, cambiar el valor de la variable que controla el primer bucle a otro valor cualquiera, por ejemplo 2. En los siguientes bucles las acciones incluidas en esta mandato “if” no se ejecutarán.

Constantes del sistema HIGH y LOW  Los PINes de entrada/salida digitales funcionan con dos constantes predefinidas, HIGH y LOW si el PIN es de salida, (OUPUT), HIGH indica a la placa que permita salir por ese PIN el voltaje máximo de trabajo de la placa, (en Arduino UNO, 5 volts en ciertas placas 3,5 volta) y LOW indica a la placa que desconecte el PIN, por tanto que el circuito que de ella sale quede a 0 voltios. Por el contrario en un PIN definido como de entrada, (INPUT) , si el voltaje que recibe el PIN en el momento en que hacemos la petición de lectura, (digitalRead), es superior a 3 voltios la tarjeta da como respuesta, HIGH, si el voltaje medido es inferior a 3 voltios devuelve LOW,.HIGH y LOW  son dos variables que no tenemos que inicializar porque ya están inicializadas por defecto y tiene los flores numérico de “1” y “0” respectivamente, por tanto si  traspasamos ese valor a una variable, esta  tiene que estar inicializada como numérica (int)

Control de estados, Con frecuencia queremos actuar de diferente forma según el estado en que se encuentra un objeto sobre el que queremos efectuar una acción, frió o caliente, seco o húmedo, o como en este caso, encendido o apagado. No siempre son solo dos estados los posibles, pueden ser múltiples estados pero siempre un número concreto de estados posibles. Por ejemplo a efecto de expender billetes una persona puede ser niño, adulto, o jubilada y según ese estado cobrar diferente precio, o algo puede estar arriba y abajo pero tambien en el medio, o estar parado, en marcha o en retroceso. En cualquier caso, cada vez que detectemos que un objeto tiene un estado determinado, conviene llevar a una variable el indicador del estado en que está para que nos informe de forma sencilla, en que estado se encuentra en cualquier punto del programa. En nuestro el LED puede estar en dos estados, 0 significaba apagado y 1 encendido, según este en un estado u otro, nosotros decidiremos una acción u otra, por ejemplo en este caso si está encendido, apagarlo y viceversa.

Mandato condicional “if/else” Cuando algo solo tiene dos posibilidades como en este caso es muy útil utilizar el mandato “if/else,” si esta en un estado hará una cosa, y si no lo esta, ara otra diferentes, como ocurre en este caso.

Mandatos anidados, Hay mandatos que entre las instrucciones que controla puede tener otros mandatos que a su vez controlen otras instrucciones, por ejemplo la función loop tiene en este caso algún mandato “if” que a su ves tiene otros mandatos “if “ en su interior, se dice que estos mandatos están anidados. Si eso ocurre, un mandato tiene que estar íntegramente dentro del otro, es decir dentro del espacio cerrado por el corchete “}”. Para que resalte, se suele alinear un poco más a la derecha, (indexar), cada vez que aparezca un mandato anidado en otro, de esta forma, se resaltan los mandatos que pertenecen a la misma instrucción, haciendo mas sencillo la lectura del programa.   Por otra parte, este sistema nos asegura que cerremos todas los corchetes que hemos abierto pues el último corchete ha de quedar alineado a la izquierda y cada uno interior que abra tendrá otro en la misma línea que cierre.

Retardar el bucle. Con frecuencia se nos olvida lo rápido que la tarjeta recorre todas las instrucciones de un bucle. En este caso, tuve un problema que me volvió un poco loco el resolverlo. Inicialmente no puse los dos mandatos delay que hay ahora en condicionales If que cambian el estado del LED. Como el bucle es tan rápido cado vez que pulsaba el botón, antes de retirar el dedo del botón, se producían varias lecturas del botón y como yo estaba pulsando, encendía y apagaba tan rápidamente el LED que a simple vista es inapreciable el parpadeo,.En consecuencia al retirar el dedo del botón, el LED quedaba encendido o apagado, según hubiera hecho un número par o impar de lecturas, En apariencia el programa funcionaba de una forma errática, como si el botón no hiciera buen contacto y una veces se detectara el interruptor y otras no. Tardé mucho en resolver el enigma, pero cuando puse un retardo de solo un segundo, (1000 milisegundos), ya había suficiente tiempo para retirar el dedo del botón antes de la siguiente lectura y el programa funciona perfectamente.     

Función del pulsador, El pulsador señala el deseo de cambio de fase de un proceso. Un pulsador en un circuito digital vale para detectar cuando se desea modificar la fase en que se encuentra trabajando el programa, por eso con un solo pulsador podemos iniciar diferentes fases siempre que por programa quede especificado que procesos se inician a continuación de los que en ese momento se están ejecutando, Por ejemplo en este programa una pulsación indica el deseo de cambiar el estado del LED de encendido a pagado y viceversa. 

Al intentar hacer un vídeo sobre el resultado del proyecto, me ha resultado muy difícil hacer destacar la luz del pequeño LED incluido en la tarjeta que hay asociado al PIN13, por lo que he colocado un LED partiendo del PIN13 que hace más visible la prueba, La colocacion del LED es la habitual, o sea poner en serie una resistencia de 220 Ohmios y el LED con la pata más larga orientada hacia el PIN13. Vean un pequeño vídeo con la actuación del programa:

Félix Maocho

 

indice

19 enero 2013 - Posted by | Robotica | ,

20 comentarios »

  1. Qué buena pagina, apenas estoy iniciándome en este mundillo, y no se nada de electrónica, esta publicación es exactamente lo que estaba buscando. Muchas gracias.

    Comentarios por Luisa | 30 abril 2013 | Responder

    • Coincidimos, yo también estoy empezando y no se nada de electrónica, (aunque si un poco de informática), la diferencia es que voy por la lección seis y tu por la dos, es por eso que parece que se algo.

      Comentarios por felixmaocho | 30 abril 2013 | Responder

  2. Por favor, sáquenme de esta duda: en el gráfico del primer protoboard se muestra que las líneas VERDES y ROJAS salen de los pines GND y, supuestamente, debe encenderse el LED, a mi no me sucede esto. Hay 2 alternativas: o la linea roja NO SALE del GND sino de los 5V para que pueda encenderse el LED o yo estoy equivocado. Por favor, confirmar.
    Reconozco que no se de electronica, pero creo que hay un error en el grafico

    Comentarios por Manual | 13 agosto 2013 | Responder

  3. Tienes la razon, el esquema está mal planteado, la línea roja esta mal conecta, deberia estar conectada a la salida a 5V, como indicas y no con tierra (GND).

    Gracias por avisarme. Corregitre el gráfico en cuando tenga un rato. De momento, pondre una actualizacion para avisar del error. Muchas gracias

    Comentarios por felixmaocho | 13 agosto 2013 | Responder

  4. Hola, gracias por el aporte,tengo una consulta, como sería la programación en caso de que quiera usar dos pulsadores y cuatro leds? osea cuando presione el primer pulsador que encienda dos dos primeros leds, y cuando presione el segundo pulsador se enciendad los dos leds restantes, y cuando se mantengan los dos pulsadores presionados se activen los cuatro leds, ??

    Comentarios por eliaz | 2 septiembre 2013 | Responder

    • No entiendo bien tu problema. A ver que es lo que falla en mi racionamiento.

      Tal como lo estiendo lo que dices es, hay dos pulsadores que llamamos A y B y cuatro leds 1 2 3 4 y quieres que se haga lo siguiente .
      Si aprietas A y los 4 leds están apagados encender los led 1 y 2
      Si aprietas B y los 4 leeds estan apagados encender los led 3 y 4
      Si mantienes pulsados a la vex A y B y los 4 leds están apagados se encienden los cutro leds.

      El problema es que no sé, si para mantener encendidos los leds hace falta mantener pulsado el botón o solo basta con apretar el pulsador un instante. Si es asi ¿como se apagan? ¿apretando una segunda vez? Otra duda se pueden tener encendidos 3 y 4 y apagados 1 y 2 , o olo se encienden 3y 4 cuando ya est´çan encendidos 1 y 2 ?

      Si es msnteniendo pulsado el botón se encienden las luces, pero cuando se sueltan se apagan, me parce obvio un solo bucle que pregunta si esta pulsado el boton A, enciende 1 y 2. si esta no pulsado, apaga 1 y 2, y a continuacion lo mismo con el B, pero me sospecho, que esto no es lo que quieres hacer. Si una segunda pulsacion apaga las luces o se condiciona que unas lucves se enciendan si están encendidas otras, hay que definir mehor todas las posibles casuisticas antes de tratar de programarlo.

      Te ruego que me expliques mejor el problema, de todas formas te aconsejo leer el post dedicado a las interrupciones pues quiza alli encuentres la solucion a tu problema sea cula fuera. https://felixmaocho.wordpress.com/2013/08/05/arduino-manejo-de-interrupciones/

      Sakludos y si necesitas ayuda no dudes en poner un comentario que si sé responderte, (lo que no es ni mucho seguro, yo tambien soy un principiante), no dudadé en echarte una mano.

      Comentarios por felixmaocho | 3 septiembre 2013 | Responder

      • Gracias por responder Felix, en el asunto planteado, el pulsador A enciende los leds 1 y 2 y el mismo pulsador los apaga,lo mismo sucederá con el pulsador B, encenderá los leds 3 y 4 y también los apagará, en el caso de que se apreten los dos pulsadores, se encenderán los cuatros leds, y para apagarlos hay que volver a pulsarlos, son como dos sistemas que trabajan de manera independiente del otro.

        Comentarios por eliaz | 3 septiembre 2013

      • hacelo con funciones de interrupcióon
        Pues entonces la mejor forma de hacerlo es a través de interrupciones, con los Pies 2 y 3
        El pin 2 vigila si se pulsa el boton A y el pin 3 si se pulsa el botón B. Inicializas dos variables que se llamen algo asi como «ledsa» y «ledsb» con valor cero (0 quiere indicar que los leds estan apagados y 1 enciendidos). y las variables volatiles que necesitas para comprobar si se produce una interrupción. (como se indica en el post https://felixmaocho.wordpress.com/2013/08/05/arduino-manejo-de-interrupciones/ ) Utilizas por ejemplo los pines 4 y 5 pàra los leds que controla el pulsador A y el 6 y el 7 apara los pines que controla el pulsador B

        En una funcion de interrupcion preguntas y si
        «iedsa» = O (las luces estan apagadas y entonces las encientes y pones el valor de «ledsa» = ! (para recordar que estan encendidas). En caso contrario las apagas y vuelves a poner el valor de «ledsa» = 0 . Lo mismo en la otra funcion de interrupcion con el otro pulsador

        La funcion lood quedará en vacia, pues lo que hay que hacer lo hacen las funciones de interrupción, puedes poner un pequeño delay para que espere un poco el bocle o no segun quieras.

        Hacerlo con varios bucles diferentes englobados en el bucle loop
        La otra solucion es montar tres sectores en el bucle loop, de modo que dolo se recorra uno en cada vuelta del loop y consecutivamente se recorrantodos, Por ejemplo poniendo una variable inicializada a 1, que si tiene el valor 1, recorre el segmento 1 del bucle y al final se la da el valor 2 , para que en el siguiente loop recorra el segmento 2 del bucle y al final se la da el valor 3 para que en la tsiguiente vuelta recorra el tercer segmento del bucle y al final nuevamente se la da el vaor 1, De esta forma en cada loop recorra solo un segmento y al cabo de tres vueltas, se ha recorrido todo. Los tres bucles se recorreran en centesimas de minuto.

        En el segmento 1 se preguta si han pulsado el botón A, la cosa es tan rápida que no da tiempo a retirar el dedo, antes de que se recorra el bucle. Si lo han oprimido se pone a uno la variable «ledsa» para mandar cambiar el estado de las luces 1 y 2. En el segmento 2 se preguta si se ha oprimido el noton B y si lo han oprimido se pone a uno la variable «ledsb» para mandar cambiar el estado de las luces 3 y 4 . El tercer segmento hace los cambios de luces segun le vengan los valores de las variabbles «ledsa» y «lesdsb» si estan encendidos los leeds les apaga y viceversa (hay que llevar en otras dos variables «encendidaa» y «encendidab»· para «recordar» como se encuentran. Hecho los cambios de luces se procede a poner el valor adecuado a las cuatro variables «fedsa» y «ledsb» a 0, para detectar nuevos apretados de boton y «encendidoa» y ·encendidob» como corresponda despues de los cambios efectuados.

        Hay que establecer algun control para dar tiempo a quitar el dedo de los botones en un tiempo prudencial, por ejemplo, si has cambiado el estado de las luces, hacer un delay de 2 segundos antes de vlver a mirar el estado de los botones.

        ¿cual es mejor ?
        De los dos sitemas, el primero es mas limpio y sencillo, pero el segundo explica una solucion general cuando te has quedado sin interrupciones posibles y Arduino Unos solo tien DOS INTERRUPCIONES, Por lo tsnto, si quisieras hacer tu ejemplo pero con tres botones y seis luces, por fuerza tendrías que hacer algo de este tipo pues solo tienes dos interrupciones posibles,

        Imaginate que estas estudiando el estado de sensores de choque de un robot y tienes varios apuntando a diferentes direcciones, no tenfdrías suficientes interrupuciones con las dos s que te proporciona el sistema.

        Mi deeo es que haya quedado claro pero no estoy seguro porque el tema es algo confuso de contar aunque es sencillo de programas, si quieres escribo el sketch, pero no lo hago porque creo que es aprederas mas leyendo esto que te he escrito y dejando que te pegues tu con el sketch.

        Saludos.

        Comentarios por felixmaocho | 3 septiembre 2013

      • com podría hacer esas funciones? siempre he trabajo desde el void loop de pronto por eso es qu eme complico, tendrás ejemplos similares de funciones apartes sin utilizar el void loop?

        Comentarios por eliaz | 4 septiembre 2013

      • Cuandio tenga un rato las escribio y te las mando.Pueden que pasen unos días pues ando muy atareado pero lo haré.

        Comentarios por felixmaocho | 4 septiembre 2013

  5. […] Por Félix Maocho 19/1/2013 Objetivo de este post: Enseñar a utilizar pulsadores en los proyectos Arduino tanto en configuración "Pull Down", como "Pull Up", Enseñar a utilizzar los PIn como entrad…  […]

    Pingback por Arduino - Como funciona y se utiliza un pulsad... | 2 octubre 2013 | Responder

  6. […] “ Por Félix Maocho 19/1/2013 Objetivo de este post: Enseñar a utilizar pulsadores en los proyectos Arduino tanto en configuración "Pull Down", como "Pull Up", Enseñar a utilizzar los PIn como entrad…”  […]

    Pingback por Arduino - Como funciona y se utiliza un pulsad... | 14 May 2014 | Responder

  7. […] Enseñar a utilizar pulsadores en los proyectos Arduino tanto en configuración “Pull Down”, como “Pull Up”, Enseñar a utilizzar los PIn como entrada (INPUT) y a solicitar la lectura del PIN. Controlar los mandatos que solo se ejecutan en el primer bucle del “loop” y explicar que son las fases de un objeto y como se identifican la fase de un objeto a lo largo del programa.  […]

    Pingback por Arduino - Como funciona y se utiliza un pulsad... | 12 julio 2014 | Responder

  8. Me sirvio mucho tu explicacion del pulsador. implemente el codigo de distinta manera yo, te lo paso por si quieren ver otra forma.

    int led = 23; //pin donde conecte el led
    int button = 22; // pin donde conecte el boton

    int buttonState = LOW; //el boton arranca en LOW pero es lo mismo en definitiva

    boolean switcher = false;

    void setup() {
    pinMode(led, OUTPUT); //seteo el pin del led como salida
    pinMode(button, INPUT); //seteo el pin del boton cmo entrada
    }

    void loop() {

    buttonState = digitalRead(button); //leo la entrada del boton

    if(buttonState == HIGH){
    switcher = !switcher; //Si el led esta encendido se apaga y si estaba apagado se enciende
    if(switcher){
    digitalWrite(led, HIGH); // enciendo el led
    }else{
    digitalWrite(led, LOW); // apago el led
    }
    delay(500);
    }
    }

    Comentarios por Maxi Garcia | 6 noviembre 2014 | Responder

    • Algo que me ha enseñado la informática, es que siempre hay varios caminos para hacer la misma cosa, El buen programador es el que acierta con el más directo. Yo como programador fui del montón, unas veces daba con le buen camino y otras daba más vueltas que un trompo. Mirare tu código

      Comentarios por felixmaocho | 6 noviembre 2014 | Responder

  9. Buenas yo tengo una duda que seguro que será muy simple para los entendidos. Mi problema radica en que tengo que utilizar un pulsador para finalizar el programa. Sólo veo ejemplos de utilizar el pulsador para encendido/apagado de dicho led. Os paso el programa que realizado pero me falta añadir como finalizar la parada.
    Gracias de antemano y un saludo

    int led=13; //me da igual la patilla que quieras ponerlo
    int boton=12;
    int i;

    void setup()
    {
    pinMode(led,OUTPUT);
    pinMode(boton,INPUT);
    }

    void loop()
    {
    for(i=1000;i>0;i=i-20) //bucle para hacer disminuir el tiempo encendido
    {
    digitalWrite(led,HIGH);
    delay(i);
    digitalWrite(led,LOW);
    delay(i);
    }

    }

    Comentarios por ramon | 27 diciembre 2014 | Responder

    • Uno de los problemas que veo a los scratch es que no tiene prevista la salida del programa loop, la maquina se queda haciendo un bucle loop indefinidamente, hasta que apagamos la corriente eléctrica de la placa, por lo que lo único que podemos hacer para APARENTAR QUE FINALIZA EL PROGRAMA, es llevarlo a una bucle que no haga nada. Si queremos que vuelva a hacerlo cuando queramos, tendremos que dar de algun tipo de salida al bucle, para que salga del bucle, finalice la función loop y vuelva a empezar desde el principio. La solucion que yo he buscado es que o bien deje parpadeando las luces o no las encienda

      Tal como entiendo su programa pretende que un led se encienda y apague cada vez a mas velocidad y desearías que el programa acabara al llegar a la máxima velocidad de encendido, o sea, cuando i adquiere un valor negativo y volver a empezar con una intermitencia lenta si asi lo quieres, o dejarla indefinidamente apagada si has apretado el botón, hasta que vuelvas a apretarlo.

      Asi pues pondremos el circuito para que la primera vez encienda las luces el botón inicialmente este encendido y que si se apaga el loop salta esta parte del programa y solo consulte si se enciende nuevamente la luz.

      Si no tienes experiencia en botones aconsejo que leas con atención este el capitulo.

      Modifico tu programa

      int led=13; //me da igual la patilla que quieras ponerlo
      int boton=12;
      int i;
      // Variables auxiliares
      int estadoboton =1 ; // el valor indica 0= LOW apagado , 1 = HIGH encendido iniciamos en encendido
      void setup()
      {
      pinMode(led,OUTPUT);
      pinMode(boton,INPUT);
      }
      void loop()
      {
      // si estadoboton =1 parapadea el LED cada vez mas rápido, si es distinto de uno salta
      if estadobotón =1
      {
      for(i=1000;i>0;i=i-20) //bucle para hacer disminuir el tiempo encendido
      {
      digitalWrite(led,HIGH);
      delay(i);
      digitalWrite(led,LOW);
      delay(i);
      }
      // fin de la parte que enciende y apaga el LED
      }
      // Comprobar si se ha apretado el botón
      // lee si se ha apretado estado botón en cuyo caso la lectura sera HIGH porque lo hemos instalado en un montaje PULL DOWM
      estadoboton = digitalread(boton);

      // si se ha apretado mandamos el flujo del programa a un bucle que no hace nada mas que esperar que se vuelva a apretar de muevo el botón
      if estadoboton = 0
      {
      delay(1000); // lo pongo para que de tiempo a retirar el dedo del botón habra que probar el tiempo adecuado
      estadoboton = digitalread(boton);

      }
      }

      // volverá a repetir todo el loop pero mientras estadoboton = 0 solo comprobara si se ha vuelto a pulsar el boton

      Bien esto en principio es lo que hay que hacer, (no lo he probado y lo que no se prueba la experiencia me dice que no funciona casi con seguridad). Problemas que veo, cuando se consulta el estado del botón hay que estar pulsando el botón, si se ha pulsado antes el rpogram no se entera, el problema es que como la funcion «for» tarda unos segundos en ejecutarse tienes que mantener pulsado el botón hasta que se apage y llege ala linea en que lo lee y entonces, quitarlo rapidamente, pues si no, a la próxima consulta no sabrá que no lo hemos levantado y actuará como si nuevamente lo pulsamos por lo que puede funcionar bien el programa pero parecer que va muy erraticamente,

      Una solución elegante al problema es utilizar para el botón, un pin para el manejo de interrupciones, te dejo el post en el que hablo de ello https://felixmaocho.wordpress.com/2013/08/05/arduino-manejo-de-interrupciones/

      Una solución chapuza es por ejemplo, poner dos botones uno para encender y otro para apagar y como esta habrá cientos de soluciones, como por ejemplo llevando contadores de par/impar, que si esta par lo apaga y si está impar lo enciende y cosas por el estilo .

      Saludos

      Comentarios por felixmaocho | 28 diciembre 2014 | Responder

  10. muy buen aporte gracias

    Comentarios por ale | 12 junio 2015 | Responder

  11. Muy Buena explicacion… exito.

    Comentarios por Viper | 3 agosto 2015 | Responder

    • Gracias

      Comentarios por felixmaocho | 3 agosto 2015 | Responder


Deja un comentario

Este sitio utiliza Akismet para reducir el spam. Conoce cómo se procesan los datos de tus comentarios.