Repository navigation
CT.10: Entradas y pulsadores

Viaje al funcionamiento de los pulsadores, desde que se aprietan hasta que se obtiene su información de 1 bit en nuestros circuitos digitales de la FPGA. Ejemplos y bloques de Icestudio para su utilización
- 2021-Abril-07: Version inicial del cuaderno técnico
- 2024-Mayo-17: Ejemplos adaptados a la nueva toolchain: apio-0.9.4. Eliminado el error en la verificación. Probados con icestudio 0.12. Los pantallazos de los ejemplos no se han actualizado todavía
- Fecha: 07-Abril-2021
Haz click en la imagen para ver el vídeo en Youtube
- Fecha: 08-Abril-2021
Haz click en la imagen para ver el vídeo en Youtube
- Fecha: 13-Abril-2021
Haz click en la imagen para ver el vídeo en Youtube
- Fecha: 05-Mayo-2021
Haz click en la imagen para ver el vídeo en Youtube
- Fecha: 06-Mayo-2021
Haz click en la imagen para ver el vídeo en Youtube
- Fecha: 08-Mayo-2021
Haz click en la imagen para ver el vídeo en Youtube
- Fecha: 09-Mayo-2021
Haz click en la imagen para ver el vídeo en Youtube
Todos los ejemplos se han probado con Icestudio 0.12. Usa esta versión o superior
- iceInput: Colección para este cuaderno técnico. Descargar e instalar la última versión
Todos los ejemplos de este cuaderno técnico están accesibles desde el menú Archivo/Ejemplos/CT10 de Icestudio, una vez instalada y selecciona la colección iceInput
También los podrás encontrar en el repositorio de este cuaderno técnico
- Introducción
- Etapa física
- Etapa 1: Procesamiento externo
- Etapa 2: Pull-up interno
- Etapa 3: Sincronización
- Etapa 4: Normalización. Lógica positiva
- Etapa 5: Antirrebotes
- Bloques para pulsadores
- Aplicaciones
- Conclusiones
- Autor
- Licencia
- Créditos y agradecimientos
- Enlaces
La información del exterior la introducimos en la FPGA por sus pines de entradas. En el cuaderno técnico 3: Pines de Entrada salida hay más información sobre la configuración de los pines como entradas
En este cuaderno técnico nos centraremos en las entradas de 1 bit, que provienen de elementos físicos como pulsadores, interruptores, sensores de infrarrojos, etc. En el Tutorial 9: Pulsadores y entradas vimos el funcionamiento básico de las entradas y en el Tutorial 12: Interruptores y pulsadores externos explicamos el funcionamiento de los pulsadores y los interruptores externos
Aunque en la mayoría de dibujos y ejemplos utilizaremos un pulsador, las ideas son aplicables a otros periféricos que proporcionen una entrada de un bit

En esta figura se muestra el proceso simplificado de entrada de datos. En el exterior de la FPGA hay un elemento físico (un pulsador en el dibujo) que proporciona una entrada de 1 bit. En el interior de la FPGA obtenemos una señal de estado binaria, que nos indica cómo se encuentra ese elemento: 1 activado (pulsado) y 0 no activado (no pulsado)

En esta animación se muestra el ejemplo con el pulsador. La señal obtenida en el interior de la FPGA, tras su procesado (que veremos más adelante), nos indica el estado del pulsador: si está apretado o no
La señal del pulsador se procesa en diferentes etapas o fases, que iremos viendo. Hay un procesado exterior, realizado con electrónica externa a la FPGA, y un procesado interno, dentro de la FPGA

Como resultado, obtenemos al final una señal estable que llamaremos señal de estado, que indica cómo se encuentra el pulsador. La señal de estado tiene lógica positiva: Un 1 indica pulsado y un 0 no pulsado. En las etapas de procesado se añade opcionalmente una puerta NOT para lograr que la señal de estado sea de lógica positiva
Por tanto, la señal de estado nos indica cómo se encuentra el dispositivo de entrada, y siempre será de lógica positiva con independencia del tipo de dispositivo conectado. La etapa donde se recibe la señal de estado la denominaremos etapa lógica

A partir de la etapa lógica, da igual la procecendia de la señal. Puede venir de un periférico exterior, de otro circuito dentro de la FPGA, de un biestable... En las etapas posteriores se detectan los cambios de la señal de estado y para el caso de los pulsadores se determinará el tipo de evento: botón apretado, botón liberado, doble pulsación o pulsación larga. Pero este procesamiento será genérico para cualquier otra señal de estado (El actual cuaderno técnico es bastante largo, por lo que los procesados posteriores a la señal de estado se dejan para otros cuadernos técnicos del futuro)
En esta tabla se resumen todas las etapas previas a la obtención de la señal de estado. En los siguientes apartados las veremos con más detalle

En esta etapa están los elementos físicos: pulsadores, interruptores, micro-switches...
Los pulsadores tienen 2 patas. Al ejercer fuerza sobre su parte superior las dos patas se conectan eléctricamente. Al dejar de apretar esta conexión se interrumpe

Hay muchísimos tipos de pulsadores diferentes. En los siguientes apartados veremos algunos de ellos
Son pulsadores que tiene 4 patas y que se insertan bien en placas de prototipado (protoboards) o en circuitos impresos. Aunque físicamente tienen 4 patas, sólo tienen 2 desde el punto de vista eléctrico. El micro-pulsador es un ejemplo de estos botones

La forma más rápida de probar un pulsador para circuito impreso es pincharlo en una placa de prototipado (protoboard). Para conectar un pulsador directamente a la placa Alhambra-II se necesitan dos cables. Uno se conecta a masa (GND) y el otro a la entrada de la FPGA. En este ejemplo se ha conectado a la entrada D0

En esta foto se puede ver el circuito real, montado sobre un panel de corcho

Los pulsadores para Circuito impreso los podemos situar sobre nuestros propios soportes hechos con impresora 3D. En el repositorio PCBPrints puedes encontrar diferentes diseños de PCBPrints: para leds, pulsadores, interruptores, etc. En el Tutorial 12: Interruptores y pulsadores externos utilizamos el PCBPrint Alhambra Button. En el enlace están las instrucciones de montaje
El PCBPrint Alhambra Button se puede montar con o sin resistencia de pull-down

En este cuaderno técnico utilizaremos la vesión que NO lleva resistencia, lo que nos permite conectar el pulsador directamente a la placa Alhambra II usando sólo dos cables

Nos podemos crear nuestros propios PCBs prototipos con los pulsadores y hacerlos de forma casera, para luego, una vez validados mandarlos a fabricar si fuese preciso. Un ejemplo es la tarjeta Skypads 2.0 que incorpora 8 pulsadores dispuestos formando dos crucetas como en los mandos de las consolas de videojuegos

En la versión de la foto, que usamos en este cuaderno ténico, NO se han colocado las resistencias de pull-up. En esta figura se muestra el pinout de los pulsadores

En esta otra foto se muestra la conexión del botón 1 a la Alhambra II

Existen muchos PCBs comerciales que vienen con pulsadores soldados. Un ejemplo es el Sensor KY004 que viene en el kit de 37 sensores para Arduino. Tiene un único pulsador y pines macho para su conexión

Aunque el conector tiene 3 pines, sólo se utiliza dos: el que se conecta a GND y el que lleva la señal de salida. En esta foto se muestra su conexión a la placa Alhambra II:

El PCB OBPushButton de ElecFreaks tiene un único pulsador, al que se le ha acoplado un capuchón para que la pulsación sea más sencilla

Por defecto el pulsador se conecta directamente usando 2 cables, pero incluye un tercero de VCC por si se le quiere soldar una resistencia de pull-up. En esta foto se muestra un ejemplo de conexión a la placa Alhambra II, usando sólo 2 cables

También se puede conectar usando el cable estándar de 3 hilos
El PiGrrl Gamepad PCB es un circuito impreso en el que hay que soldar 4 pulsadores y un conector de 6 pines macho. Se pueden usar los cuatro micro-pulsadores compatibles que se quieran. En esta placa se han soldado 4 pulsadores de goma

Este es el pinout de la placa:

En esta foto se muestra la conexión del botón 1 al pin D0 de la Alhambra II

Las teclas de los ordenadores son pulsadores. Hay varias implementaciones. La más típica es utilizando membranas de silicona. Aquí puedes encontrar más información sobre su principio de funcionamiento
Los teclados más avanzados, como los de los gamers, son mecánicos. Utilizan pulsadores especializados implementados con muelles. Sobre ese pulsador se conecta un capuchón: la tecla visible. Un modelo muy popular son los Cherry-mx

Los pulsadores Cherry-mx se pueden soldar en un circuito impreso, o bien montarlos sobre algún soporte casero. Por ejemplo en un soporte impreso en 3D. En esta foto vemos el PCBPrint Cherry-mx

Los capuchones pueden ser bien los originales de las teclas o una versión impresa en 3D
En esta foto está conectado este PCBPrint directamente al pin D0 de la Alhambra II mediante dos cables. Tiene acoplado el capuchón de la tecla 5

Los cherry-mx también se pueden colocar sobre otro soporte para construir nuestros propios teclados a medida. En esta foto vemos un mini-teclado formado por 4 teclas colocadas sobre un bloque de goma espuma. Los cables se han soldado directamente a los pines de los pulsadores

En esta foto se muestra la conexión de la tecla "1" al pin D0 de la Alhambra II

Los teclados están formados por una matriz de pulsadores. Cada pulsador conecta una fila con una columna. Así, un teclado de 16 teclas estará distribuido en una matriz de 4x4. Tendrá 4 filas y 4 columnas. En total dispondrá 8 cables de conexión (los correspondientes a las 4 filas y los de las 4 columnas)
En este diagrama se representa su conexionado eléctrico

Y este sería un posible teclado de 16 teclas. Se han representado los pines en la parte inferior. Según el fabricante del teclado, la colocación de los pines puede variar. En este se han puesto primero las columnas y luego las filas, pero pueden estar ordenados de cualquier otra manera

Los teclados de membrana son planos. Cada pulsador es una pequeña ondulación de una membrana que al pulsarlo se deforma y recupera su posición original al soltarlo. Se pueden encontrar muchos modelos diferentes en esta página de aliexpress
Uno muy típico es el teclado hexadecimal, que tiene 16 teclas distribuidas en una matriz de 4 filas y 4 columnas

En esta foto se muestra la tecla 1 conectada al pin D0 de la Alhambra II

Es un teclado matricial, muy común, que tiene las doce teclas dispuestas en 4 filas y 3 columnas, y 7 pines. Tiene diez teclas con los dígitos del 0 al 9 y dos acicionales: el asterisco (*) y el hastash (#). Este es el modelo Sparkfun COM-14662

En esta foto se muestra la conexión de la tecla 1 al pin D0 de la placa Alhambra II

Los teclados números USB son muy útiles para usar sus teclas para diferentes proyectos, como calculadoras o introducción de datos en general. Los podemos hackear para eliminar la parte de USB y conectarlos directamente a la FPGA, como se muestra en estas instrucciones: Teclado numérico USB Jelly Comb

En esta foto se muestra la conexión de la tecla Backspace al pin D0 de la placa Alhambra II.

Hay muchas shields para Arduino UNO que incluyen pulsadores, además de otros periféricos. Estas shields son compatibles con la Alhambra II
La Arduino Joystick shield tiene un joystick con dos potenciómetros analógicos y pulsador central, cuatro pulsadores con los controles arriba/abajo/izquierda/derecha y dos pulsadores adicionales. Un total de 7 pulsadores: A, B, C, D, E, F y J
En este dibujo se muestran los pines de conexión. Los pulsadores se conectan a las entradas digitales Dx, y los ejes X,Y del joystick a las entradas analógicas A0 y A1 respectivamente

Todos los pulsadores están conectados directamente a los pines Dx, SIN resistencias de pull-up externas
En esta foto se muestra la shield conectada a la Alhambra II

Esta shield dispone de un display LCD y 5 pulsadores: LCD Keypad Shield. Se trata de pulsadores analógicos, que están conectados a través de resistencias en serie al pin analógico A0. Dependiendo del botón pulsado, se obtiene un número (de 10 bits) proporcional a la tensión. En esta foto se muestra el patillaje:

En este cuaderno técnico nos centraremos en pulsadores digitales, y no analógicos
Aquí se puede ver la shield conectada a la Alhambra II. El pin analógico A0 se lee también en digital desde el pin DD0. La lectura será de 1. Al apretar algunos de los botones: up, down, right se pone a 0. Los restas hacen que siempre esté a 1

Puedes encontrar más información sobre esta shield en estos enlaces: Info 1 e Info 2
La EDUBASICA es una tarjeta de prototipado rápido para conectar a Arduino. Como la Alhambra II es compatible con Arduino uno, también la podemos usar para nuestros proyectos con FPGAs
Dispone de 3 LEDs, un pulsador de entrada, un potenciómetro, un sensor de luz (LDR), un transitor y un puente en H (293) para mover hasta 2 motores

En este cuaderno técnico sólo nos interesa el pulsador, que está conectado al pin D2. El pulsador tiene una resistencia de pull-down, y funciona con lógica positiva: Al apretarse devuelve 1, y al liberarse 0
En esta foto se muestra la edubásica conectada a la Alhambra II

La Echidna Shield es una tarjeta educativa para conectar a Arduino. Por eso también se puede conectar directamente a la Alhambra II.
Dispone de 3 pulsadores conectados a través de una resistencia de pull-down. Pero dos de ellos, el del joystick y el derecho son el mismo: están conectados al mismo pin (D2). Además tiene un Joystick, acelerómetro, sensor de luz, LEDs y un zumbador

En esta foto se muestra la Echidna shield conectada a la Alhambra II

El Fenderino Guitar Shield tiene forma de guitarra y dispone de 8 pulsadores, un interruptor de 3 posiciones, 4 LEDs, un potenciómetro y un zumbador. El esquema completo está disponible en este repositorio de github

Los pulsadores van conectados directamente a los pines de la FPGA. En el Fenderino NO hay procesamiento de las señales: ni resistencias de pull-up ni de pull-down. En esta foto se muestra el Fenderino conectado a la Alhambra II

Los pulsadores capacitivos no tienen partes mecánicas, por lo que su duración es mayor. Un ejemplo de pulsador capacitivo es el modelo AT42QT1010 de Adafruit. Al colocar el dedo sobre el pulsador su salida se pone a 1 y al dejar de haber contacto se pone a 0. En su parte superior dispone de un LED que muestra el estado

La salida del pulsador entra directamente en la FPGA, sin necesidad de procesamiento externo ni interno. En esta foto se muestra el pulsador conectado al pin D0 de la Alhambra II

Para crear nuestros pulsadores caseros sólo hay que encontrar la manera de que dos elementos metálicos se unan y se separen. Se puede hacer de inifitas formas. Aquí mostraremos dos muy sencillas
Utilizamos como elementos metálicos dos cables que unimos y separamos manualmente. Un cable lo conectamos a GND y el otro a unos de los pines de la FPGA, como por ejemplo el pin D0

En esta foto vemos el montaje con la placa Alhambra II. Se han conectado dos cables, hembra-macho, uno a GND y otro al pin D0. Cuando se los dos machos se toquen, el pulsador está apretado, y al no haber contacto está no apretado

El pulsador es más cómodo de usar si en el extremo de uno de los cables colocamos una chincheta metálica. Ahora para activar el pulsador sólo hay que tocar con el macho de un cable sobre la cabeza de la chincheta. También es posible utilizar clips o cualquier otro elemento metálico (tiras de cobre, papel de aluminio, etc...) para falicitar el uso del pulsador (Imaginación al poder)

Utilizaremos papel para construir un pulsador muy sencillo, que es capaz de volver a su posición original. Como elementos metálicos utilizamos tiras de cobre, que se cortan muy fácilmente (como si fuesen papel). Además usaremos dos cables macho-hembra, para conectar fácilmente con la FPGA
El pulsador está formado por dos partes: la base y la propia tecla. La base es una superficie plana, como otro papel, un cartón, etc... y permanece inmóvil. La tecla está formada por una tira de papel con varios pliegues, y es la párte móvil

Este es un esquema del funcionamiento. Cuando el pulsador se aprieta, los pliegues laterales de papel se doblan y las tiras de cobre entran en contacto con el trozo de cobre superior, cerrándose el circuito. Al dejar de apretar, el pulsador de papel se endereza y deja de haber contacto eléctrico. Aunque la parte superior se queda ligeramente curvada

En esta foto se muestra un botón de papel construido de esta manera. A las tiras de cobre inferiores se le han soldado dos cables. Uno se conecta a GND y el otro es el que lleva la señal del pulsador, como cualquiera de los pulsadores que ya hemos visto

En estas imágenes se muestran el pulsador de papel en sus dos estados: apretado y no apretado

En esta foto se muestra el botón de papel conectado a la placa Alhambra II

Los interruptores son similares a los pulsadores: conectan o no partes conductoras. Sin embargo, en el caso de los interruptores ambas posiciones son estables. Para pasar de una posición a otra hay que aplicar una fuerza. En el caso de los pulsadores hay una posición estable y otra que sólo dura mientras se aplica la fuerza de presión

Hay varios tipos de interruptores según las posiciones estables que tienen y las partes conductoras que conectan. Por un lado están los pulsadores de dos posiciones y 3 patas. Según en la posición en la que está el pulsador, se conecta una pata con otra. Para pasar de un estado a otro hay que aplicar una fuerza

En esta figura se muestra a la izquierda el interruptor que conecta la pata 1 con la 2. Al aplicar una fuerza en el sentido indicado, el interruptor cambia de posición y ahora conecta la pata 2 con la 3. Para volver a la posición anterior hay que aplicar una fuerza en el sentido contrario
También hay pulsadores de 3 posiciones y 3 patas. En la posición central no hay nada conectado. En una posición se conecta la pata 1 con la 2 y en la otra la 2 con la 3. Cuando está en la posición central se puede mover hacia una u otra

También hay interruptores de dos posiciones que conectan o no dos patas. La diferencia con el pulsador es que ambas posiciones son estables

Son interruptores con sus 3 patas, que se insertan bien en placas de prototipado (protoboards) o en circuitos impresos (PCBs). Existen muchísimos interruptores diferentes. Aquí se muestran algunos modelos:

Uno que hemos usado mucho en los tutoriales de electrónica digital para makers es este modelo:

En el tutorial 12: Interruptores y pulsadores externos se conectan las tres patas de estos interruptores. Una a VCC (1), otra a GND (0) y la central es la señal del interruptor. En los ejemplos de interruptores de las siguientes secciones sólo conectaremos dos patas: una a GND y otra será la señal del interruptor (on/off)
Igual que con los pulsadores, una forma muy rápida de probar un interruptor para circuito impreso es pincharlo en una placa de prototipado (protoboard). Para conectarlo a la placa Alhambra-II sólo necesitamos dos cables, uno conectado a GND y el otro a una entrada de la FPGA. En este ejemplo está conectado a la entrada D0:

En esta foto vemos la conexión del interruptor a la Alhambra II, usando sólo dos cables:

En el repositorio de las PCBprints encontramos varios modelos. Uno es la Alhambra Switch, que utilizamos mucho en los Tutorial de Electrónica digital para makers con FPGAs libres

Tiene un conector macho acodado que da acceso a los tres pines del interruptor. Típicamente utilizamos tres cables para su conexión. Sin embargo, también podemos utilizar sólo dos. La conexión a la Alhambra II se muestra en esta foto:

Este es otro modelo de PCBPrint con interruptor creado por Diego Lale. Tiene soldado un cable de 3 hilos, con VCC, GND y la señal del interruptor

Esta es la conexión al pin D0 de la placa Alhambra II:

Los microinterruptores se utilizan mucho para introducir códigos, números o valores para diferentes configuraciones. Como se usan mucho, existen componentes electrónicos que encapsulan varios microinterruptores. Cada uno de ellos tiene sólo dos patas y el interrupción funciona conectando o desconectando las patas (igual a un pulsador, pero las posiciones son estables)

La forma más fácil y rápida para probar los arrays de microswitches es usando una placa de prototipado. En esta figura se muestra un array de 8 microinterruptores, donde sólo se ha conectado el interruptor S1. Se usan dos cables: uno para GND y otro para la señal del interruptor

En esta foto se muestra la conexión del interruptor 1 de un array de 4 microinterruptores a la placa Alhambra II. La señal de GND (azul) se lleva mediante dos cables. Uno macho-hembra desde el pin D0 a la protoboard y otro plano desde este cable al interruptor S1. Se ha hecho así para que sea más fácil de accionar el switch S1 con el dedo

Hay muchas placas que integran arrays de microinterruptores para hacer pruebas. Mostraremos algunas de ellas
Diego Lale es un Maker Español que ha realizado muchísimas contribuciones. Una de ellas son un conjunto de shields para Arduino que incluyen diferentes periféricos de carácter educativo. Esta es una shield que incluye un array de dos microinterruptores, 3 pulsadores, un potenciómetro y dos LEDs RGB

En estas fotos se muestra la shield conectada a la placa Alhambra II. Los pulsadores y switches están conectados directamente a los pines, sin ninguna resistencia externa (ni pull-up ni pull-down)

La IceBreaker Dip Switch es una mini-placa con 8 micro-interruptores, que es compatible con la interfaz PMOD. Se puede conectar directamente a placas como la IceBreaker o Icesugar que tienen conectores PMOD

La placa lleva resistencias de pull-down para leer directamente el valor de los switches desde nuestros circuitos. En esta foto se muestra el micro-interruptor S1 conectado a la Alhambra II. La conexión se puede hacer mediante 3 cables: GND, VCC y señal del interruptor (se usa la resistencia de pull-down):

o mediante dos cables. En este caso no se usa la resistencia de pull-down, sino que es una conexión de ambos cables a través del interruptor. Observa que el cable negro va conectado a GND en la Alhmabra II pero al pin 3v3 en la placa de los switches

La placa con FPGA icesugar tiene conectores de tipo PMOD. Uno de sus periféricos es un array de 8 micro-interruptores, similar a la iceBreaker DIP Switch, pero con una disposición de pines ligeramente diferente

La placa lleva resistencias de pull-down por lo que podemos realizar los dos tipos de conexión para un interruptor: con 2 ó 3 cables. En esta foto se muestra la conexión del interruptor S1 al pin D0 utilizando 3 cables

En esta foto se muestra la conexión del interruptor S1 con dos cables. Observa que el cable negro va conectado a GND en la Alhmabra II pero al pin 3v3 en la placa de los switches

La señal de estado puede provenir de un pulsador, de un interruptor o de un sensor digital de entrada de 1 bit. En esta sección veremos algunos de estos sensores. Muchos de ellos son en realidad pulsadores o interruptores, y por tanto se tratan exactamente igual que los que hemos visto hasta ahora
Los Finales de carrera se usan como sensores de contacto. Funcionan como un pulsador, en el que sólo la posición de reposo es estable. Tienen una pestaña más larga que es la que abre o cierra el contacto cuando un elemento lo empuja. Una aplicación muy típica de estos sensores es en las impresoras 3D, para detectar cuándo el cabezal ha llegado a su posición de origen

Los finales de carrera los podemos encontrar como elementos aislados o bien integrados en una placa de circuito impreso (PCB). En esta foto se muestra un final de carrera en PCB conectado al pin D0 de la Alhambra II. Sólo se usan dos cables (igual que en los pulsadores)

Los sensores de choque se activan cuando se recibe un impacto o una vibración. Consisten en un muelle metálico en cuyo interior hay un hilo conductor que en condiciones normales no toca el muelle. El conjunto muello-hilo se encuentra dentro de una carcasa protectora. Cuando hay un golpe o una vibración, el muelle entra en contacto con el hilo central, y las dos patas del sensor entra en contacto eléctrico

Dentro del kit de 37 sensores para Arduino está el KY02, que es un sensor de choque (Shock sensor)

Se puede conectar usando dos o tres patas. En esta figura se muestra la conexión al pin D0 de la Alhambra II usando sólo dos cables, que se corresponden con las dos patas de salida del sensor

Los sensores de inclinación de un bit se activan cuando se alcanza un determinado ángulo. Si la inclinación supera o iguala ese ángulo, se activa. De lo contrario permanece a 0. Este tipo de sensores se construye situando dos elementos metálicos fijos dentro de una carcasa, junto a otro elemento móvil que se mueve con la inclinación. En una posición el elemento móvil conecta los otros dos elementos metálicos. En la otra posición NO
Como elementos móviles se utilizan esferas metálicas o de mercurio

Dentro del kit de 37 sensores para Arduino está el KY017, que es un sensor de inclinación (Tilt sensor) de mercurio

Se puede conectar usando dos o tres patas. En esta figura se muestra la conexión al pin D0 de la Alhambra II usando sólo dos cables, que se corresponden con las dos patas de salida del sensor

Los sensores magnéticos detectan la presencia de un campo magnético. En este tutorial veremos dos sensores magnéticos digitales, que devuelve un 1 cuando hay un campo magnético y 0 cuando no: sensores de lengüeta (reed sensor) y de sensores de efecto hall
Los sensores magnéticos de lengüeta (reed sensors) son iguales a un interruptor, con dos partes metálicas que se unen cuando hay un campo magnético y se separan en caso contrario

Dentro del kit de 37 sensores para Arduino está el KY021, que es un sensor magnético de lengüeta (reed sensor)

Se puede conectar usando dos o tres patas. En esta figura se muestra la conexión al pin D0 de la Alhambra II usando sólo dos cables, que se corresponden con las dos patas de salida del sensor

Los sensores magnéticos de Efecto Hall permiten medir el campo magnético, pero también se pueden utilizar como detectores de campo magnético binario, mediante la detección de un umbral. Esto es lo que hace el sensor KY003 que viene en el kit de 37 sensores para Arduino

Se conecta usando tres cables, porque es un sensor activo, que necesita alimentación. En esta figura se muestra la conexión al pin D0 de la Alhambra II

Los sensores de infrarrojos tienen dos partes: un emisor y un receptor. El emisor es un LED que emite luz infraroja en vez de visible. El detector es el que da la salida del sensor: se recibe infrarrojos o no. En el tutorial 16 de Electrónica digital para makers utilizamos estos sensores para diferenciar del color blanco/negro así como detectar objetos cercanos

En otros sensores el emisor enfoca directamente al receptor y si hay un objeto entre medias se deja de recibir el IR y se detecta. Es el sensor usado para los encoders o para detectar una tarjeta de crédito por ejemplo:

El sensor KY010 del kit de 37 sensores para Arduino es de este tipo

Se conecta usando tres cables, porque es un sensor activo, que necesita alimentación. En esta figura se muestra la conexión al pin D0 de la Alhambra II

El pin de salida del pulsador, interruptor o sensor que llega hasta nuestro circuito en la FPGA debe ser digital, y tener alguno de estos dos valores: 0 ó 1. Por ello se debe colocar un circuito adicional, si fuese necesario, para garantizar que siempre llegan sólo estos dos niveles. Este es el objetivo de la etapa 1

Por ejemplo, en el caso de un pulsador, una de sus patas la conectamos a GND (0), pero la otra queda "al aire". Si apretamos el botón, la señal de salida será 0, pero cuando NO está apretado NO HAY SEÑAL. El pin NO está conectado a nada, está al aire. Esto NO es válido cuando se trabaja en electrónica digital. Sólo son posibles los valores 0 ó 1

Cuando el elemento de entrada es activo (consume energía por lo que necesita alimentación), como por ejemplo un sensor de IR, su señal de salida ya es digital (0/1) y NO necesita procesamiento adicional, por lo que esta etapa es innecesaria. El sensor se conecta directamente a nuestro circuito de la FPGA
Sin embargo, cuando se trata de un elemento pasivo, como un pulsador o un interruptor, este procesamiento se puede realizar mediante resistencias de pull-up o resistencias de pull-down
Las resistencias de pull-up se colocan entre la salida del pulsador/interruptor y la señal de alimentación (VCC). Los valores de esta resistencia deben estar comprendidos en el rango 1K - 100K

Cuando el pulsador NO está apretado, por el pin de la FPGA llega la señal de alimentación (VCC), a través de la resistencia R. Se recibe un 1 lógico. Al apretar el pulsador, por el pin de la FPGA llega GND, que es un 0 lógico. De esta forma garantizamos que siempre llega bien un 1 ó un 0
Al colocar la resistencia de pull-up el pulsador se comporta con lógica negativa: 0-apretado, 1-NO apretado. Por ello, en las etapas posteriores colocaremos una puerta NOT para obtener la señal de estado con lógica positiva
En este dibujo se muestra la conexión de un pulsador a la Alhambra II a través de una resistencia de pull-up

Y este es el montaje real. El pulsador está conectado al pin D0. Se ha utilizado una resistencia de pull-up de 4K7

Las resistencias de down se colocan entre la salida del pulsador/interruptor y GND. Los valores de esta resistencia deben estar comprendidos en el rango 1K - 100K

Cuando el pulsador NO está apretado, por el pin de la FPGA llega GND, a través de la resistencia R. Se recibe un 0 lógico. Al apretar el pulsador, por el pin de la FPGA llega VCC, que es un 1 lógico. De esta forma garantizamos que siempre llega bien un 1 ó un 0
Al colocar la resistencia de pull-down el pulsador se comporta con lógica positiva: 1-apretado, 0-NO apretado. Y por tanto no hace falta incluir ninguna puerta NOT adicional en las etapas siguientes
En este dibujo se muestra la conexión de un pulsador a la Alhambra II a través de una resistencia de pull-down

Y este es el montaje real. El pulsador está conectado al pin D0. Se ha utilizado una resistencia de pull-down de 4K7

Los dos pulsadores de la placa Alhambra II, el SW1 y el SW2, utilizan resistencias de pull-down. Por eso los podemos leer directamente desde nuestros circuitos, y con lógica positiva
Para facilitar la conexión de pulsadores e interruptores, muchas FPGAs incluyen resistencias de pull-up configurables en los bloques de Entrada/Salida. En el Cuaderno técnico 3 vimos los bloques de Entrada/Salida (IO) de las FPGAs de la familia ICE40 (las FPGAs que usa la placa Alhambra II). Estos bloques son configurables y nos permiten determinar si el pin es de entrada, salida o entrada/salida
Estos bloques nos permiten también configurar si queremos utilizar una resistencia de pull-up interna o no, asociada a ese pin de la FPGA. Por defecto están desactivadas
Para configurar el estado del pull-up interno de un pin de la FPGA utilizamos el componente pull-up-x01 que se encuentra en el menú Pull-up de la colección iceInputs. El aspecto de este bloque es el siguiente:

Tiene un parámetro de entrada, on, que determina si el pull-up está activo o no. Por defecto, si no indicamos ningún valor al parámetro on, estará activado. Con un valor 0 lo desactivamos, y con un 1 queda activo
Como se trata de un bloque especial de configuración, sólo puede estar conectado a un pin de entrada de la FPGA. Por ello, su entrada pin NO se puede conectar a otro elemento que no sea una entrada. En caso de hacerlo se obtendrá un mensaje de error
El bloque pull-up-0x1 se implementa en verilog, instanciando el módulo SB_IO y pasando el parámetro on. Haciendo doble click en el bloque se muestra cómo está hecho

Este es el código verilog. Se instancia el bloque SB_IO, y se le pasa como parámetro ON, para establecer la configuración del pull-up. Se configura como entrada poniendo OUTPUT_ENABLE a 0. El pin D_OUT_0 no se usa, y se pone a 0. Se especifica que el pin de entrada es i, y el de salida del bloque o
//-- Place the IO block, configured as
//-- input with pull-up
SB_IO
#(
.PIN_TYPE(6'b 1010_01),
//-- The pull-up is activated or not
//-- depeding on the ON parameter
.PULLUP(ON)
) input_pin (
//--- Input pin
.PACKAGE_PIN(i),
//-- Block output
.D_IN_0(o),
//-- Configured as input
.OUTPUT_ENABLE(1'b0),
//-- Not used
.D_OUT_0(1'b0)
);En este ejemplo se configura la resistencia de pull-up interna asociada al pin de entrada D0. En el pin D0 se conecta un pulsador directamente. La salida del bloque pull-up se saca por el LED0 para ver el estado del pulsador
Mientras el pulsador NO esté apretado, el LED0 estará encendido. Al apretar el pulsador, el LED0 se apaga, y al soltarlo se vuelve a encender. Debido al pull-up, el pulsador está funcionando con lógica inversa (1-no apretado, 0 apretado)
En esta foto se muestra el montaje

Y en este Vídeo se muestra en funcionamiento
La activación o no de la resistencia interna de pull-up la controlamos con el parámetro on del bloque pull-up. Si queremos desactivarla sólo hay que pasarle como parámetro el valor 0. Para activarla lo ponemos a 1 ó eliminamos el parámetro, ya que por defecto se activa
Otra posibilidad para desactivarla es quitar el bloque pull-up. Pero resulta muy cómodo y útil poder activarla/desconectarla mediante este parámetro, sin tener que estar eliminado y volviendo a colocar el bloque en las pruebas
Si a partir de este ejemplo queremos probar el pulsador externo del ejemplo 1, sólo había que cambiar la entrada de SW1 a D0 y el poner el parámetro on a 1
Los bloques pull-up son especiales: su entrada pin tiene que estar conectada a un pin de entrada de la FPGA. Si se conecta a algún elemento activo, como por ejemplo una puerta NOT, obtendremos el mensaje de error que vemos en este pantallazo
El texto del mensaje se pone a continuación, para que pueda ser indexado en los buscadores:
There are errors in the Design...
ERROR: No wire found for port
PACKAGE_PIN on destination cell
xxxxx.io_pin
Los bloques pull-up se usan uno por cada entrada. Así, si queremos conectar dos pulsadores en los pines D0 y D1 por ejemplo, hay que conectar en ellos dos bloques de pull-up. Es lo que se hace en este ejemplo. Las salidas se muestran por LED0 y LED1 respectivamente
Para probarlo conectamos dos pulsadores directamente, uno en una protoboard y el otro en una PCBprint, con la resistencia externa de pull-up sin colocar, a la placa Alhambra II

En este vídeo se muestra en funcionamiento
Si queremos conectar varios pulsadores que precisen de un pull-up interno, tenemos dos opciones. Una es colocar en paralelo tantos bloques pull-up como necesitemos. Pero también podemos utilizar los bloques pull-up de bus, que ya incorporan internamente los bloques en paralelo por nosotros, y nos facilitan las conexiones: pull-up-x2, pull-up-x3, pull-up-x4...

En este dibujo se muestra el bloque pull-up-x2. Tiene una entrada de bus de 2 bits, que se debe conectar directamente a un grupo de 2 pines de entrada, y una salida en bus también de 2 bits. El parámetro on controla la activación de TODOS los pull-ups internos a la vez. Si queremos conectar pulsadores diferentes, unos requiriendo pull-ups internos y otros no, entonces debemos usar bloques separados
Estos bloques ya se puede implementar a partir otros bloques de pull-up. En este dibujo se muestra cómo está construir el bloque pull-up-x2 a partir de los bloques pull-up-x1 conectados en paralelo. El bus de entrada se separa en dos cables, y a cada uno se le conecta un bloque de pull-up. Luego sus salidas se integran en el bus final de salida.

La salida del separador de bus se puede conectar a los bloques pull-ups ya que se trata de un bloque pasivo: son simplemente cables. Y no se produce ningún mensaje de error
En el menú pull-up/verilog se encuentra la implementación del bloque en verilog. Se utiliza un bloque de código donde se instancian dos bloques SB_IO, cada uno para el pull-up de una de las dos entradas

Este es el código verilog del bloque. Las instancias se hacen de forma genérica, determinadas por el parámetro N. Como en este bloque hay 2 pull-ups, se establece N=2, pero el código es genérico para cualquier número de pull-ups. Simplemente hay que asignar a N el número de bits de los buses de entrada o salida
//-- Number of pull-ups
//-- It should be equal to the number of
//-- bits in the input and output buses
localparam N = 2;
genvar i;
generate
//-- Place N IO blocks configured
//-- as input with pull-up
for (i = 0; i < N; i = i + 1) begin
SB_IO
#(
.PIN_TYPE(6'b 1010_01),
//-- The pull-up is activated or not
//-- depeding on the ON parameter
.PULLUP(ON)
)
input_pin (
//-- Input pin
.PACKAGE_PIN( in[i] ),
//-- Block Output
.D_IN_0( o[i] ),
//-- Configured as input
.OUTPUT_ENABLE(1'b0),
//-- Not used
.D_OUT_0(1'b0)
);
end
endgenerate
En este ejemplo se conectan dos pulsadores externos a dos leds, usando resistencias de pull-up internas. Es exactamente el mismo ejemplo que el 4, pero utilizando un único bloque de pull-up, por lo que se simplifica todo
El escenario de prueba y el vídeo son los mismos que los del ejemplo 4
Conectamos un array de 4 micro-interruptores activando sus cuatro pull-ups mediante el bloque pull-up-x4
Este es el escenario de prueba. Se ha colocado el array de micro-switches en una protoboard, y se han conectado los 4 micro-switches a la placa Alhambra-II, por los pines D3 - D0

Como los pull-ups están activados, los switches funcionan en lógica negativa. Cuando están off (posición hacia abajo), como en la imagen anterior, los LEDs están encendidos. En este vídeo los vemos en acción:
Los circuitos que diseñamos son síncronos, y están gobernados por una única señal de reloj. Las señales que llegan del exterior por lo pines son asíncronas: significa que pueden llegar en cualquier momento. Según el momento en el que llegan, relativo al reloj del sistema, la captura de estas señales puede NO ser válida, originándose el problema de la metaestabilidad
La solución es sencilla: Basta con insertar un bloque de sincronización (Bloque sync), formado por la unión en cadena de dos bietables tipo D. En las siguientes secciones vamos a profundizar más sobre la causa de estos problemas
Los circuitos que estamos diseñando en la FPGA son síncronos. Estos circuitos son más fiables, más fáciles de analizar y nos permiten obtener de una forma más directa su frecuencia de funcionamiento y las partes del circuito que la determinan
Los circuitos síncronos están gobernados por una única señal de reloj, que llega a todos los biestables a la vez, de forma que los datos se capturan a la vez en todos los lugares, y los bits de información se desplazan por todo el circuito al compás de este reloj

Asumiemos que las capturas se realizan siempre en Flanco de subida del reloj
Las señales digitales no cambian de valor instantaneamente sino que tardan un tiempo. Durante este tiempo las tensiones van desde la del estado inicial hasta la del estdo final. Mientras la señal tiene estos valores intermedios se trata de una señal INDEFINIDA. El hardware no sabe si es un 0 ó un 1. Sólo al cabo de un determinado tiempo la señal pasa a tener un valor ESTABLE

Los circuitos síncronos se diseñan de forma que los flanco de subida del reloj NUNCA ocurran cuando haya alguna transición en las señales. O lo que es lo mismo: Un circuito síncrono está bien diseñado si el flanco de subida del reloj llega cuando TODAS las señales son estables, y tiene por tanto un valor definido
Si el flanco de subida llega durante la transición de una señal, se capturaría un valor INDEFINIDO. Esto se quiere evitar a toda costa
La señal de reloj hace que se capturen los datos en sus flancos de subida. Sin embargo, para que las capturas sean correctas, hay un tiempo durante la transición del reloj en el que las señales a capturar deben permanecer estables. Los circuitos síncronos se diseñan para que esta regla se cumpla siempre. O lo que es lo mismo, la señal de reloj tiene unas zonas prohibidas donde NO PUEDEN HABER CAMBIOS EN LAS SEÑALES

En los circuitos síncronos bien diseñados está garantizado, por el propio diseño, que nunca habrá cambios de las señales en las zonas prohibidas del reloj. O lo que es lo mismo, que cuando lleguen los flancos de subida todas las señales serán estable y tendrá un valor determinado
Sin embargo, las señales que llegan por los pines de entrada pueden llegar EN CUALQUIER MOMENTO, ya que son asíncronas
Analicemos este circuito, en el que la entrada del pin se captura en un biestable D, al llegar el flanco de subida del reloj

Dependiendo de cuándo llegue un 1 por el pin de la entrada, el dato capturado en el biestable D será válido o NO.

En este dibujo se muestran tres flancos de subida de reloj, y tres instantes diferentes en los que la entrada asíncrona que viene del exterior (PIN) cambia. En el primer flanco se captura un 0 correctamente, ya que durante ese tiempo la entrada tiene un valor estable de 0. En el segundo flanco de subida la entrada es también estable, con valor de 1. El biestable captura un 1 perfectamente
Sin embargo, durante el tercer flanco también se produce un cambio en la entrada. Se captura un valor que está entre 0 y 1, lo que provoca el problema de la metaestabilidad. El biestable D entra un estado metaestable: no es ni 0 ni 1.
Cuando el biestable ha entrado en metaestabilidad, su salida tendrá un valor a un nivel intermedio, que no se sabe si es 0 ó 1. Este valor convergerá aleatoriamente a 0 ó a 1 al cabo de un tiempo (tmet)

Una forma de solucionarlo es añadir un segundo biestable D que capture el valor estable. Esto garantizará que saldrá un valor estable que ya se puede conectar al resto de elementos de nuestro circuito. El precio a pagar es que la señal tendrá un retardo. Y que este retardo puede ser de 2 ó 3 ciclos, según que el bit metaestable converga a un valor distinto del original o el mismo

Para entender por qué ocurre esto vamos a hace un dibujo comparativo de las dos situaciones. En ambos casos supondremos que inicialmente los dos biestables están a 0, y que la entrada (pin) camia de 0 a 1 en el flanco de reloj, generando un problema de metaestabilidad en el primer biestable. A partir de ahí la entrada del pin permanece a 1 de forma estable durante el resto de flancos
En el primer caso (izquierda), vemos lo que ocurre si el bit metaestable converge a 0. Eso lo representamos mediante xx0: significa que se ha capturado un valor indefinido, pero que al cabo de un tiempo ha convergido a 0 (este tiempo es menor que el periodo del reloj)

En el segundo caso lo que ocurre es que el bit metaestable converge a 1. Lo representamos mediante xx1. Si nos fijamos en el valor del segundo biestable, en el primer caso ha tardado 3 ciclos de reloj en ponerse a 1, mientras que en el segundo caso sólo 2
El bloque Sync está disponible en el menú Sync/Sync-x01 de la colección IceInput. Por su entrada se debe conectar bien el pin de entrada o bien la salida del bloque pull-up. Como este bloque se usa para resolver el problema de la metaestabilidad, siempre debe ser el primer elemento (sin contar el pull-up interno). Este es el aspecto que tiene:

Por su salida obtenemos una señal sincronizada con el reloj del sistema, sin problemas de metaestabilidad, y lista para usarse en las siguientes etapas
El bloque de sincronización de un pin se implementa mediante la unión en serie de dos biestables de tipo D

En el menú Sync/Verilog/Sync-x01 está disponible el mismo componente pero implementado en verilog:

La entrada d se captura en el primer biestable y se saca por la señal q1. Esta señal se toma de entrada para el segundo biestable, cuya salida q es la del bloque de sincronización
Este es el código verilog:
reg q1 = 0;
reg q = 0;
always @(posedge clk)
begin
//-- First D Flip-Flop
q1 <= d;
//-- Second D Flip-flop
q <= q1;
endPara comprobar que el bloque Sync-x01 funciona correctamente hacemos mediciones con el analizador lógico integrado: IceRok. Por la entrada del bloque introducimos un tic proveniendo de un pulsador y comprobamos que por su salida se obtiene el mismo pulso pero retrasado dos tics de reloj
Este es el circuito utilizado para la medición:
En este pantallazo vemos el resultado obtenido, visualizado con Pulseview. En la parte superior está el tic de entrada y en la inferior el de salida

Se comprueba que el de salida está retrasado dos tics con respecto a la entrada
Conectamos un pulsador al LED, incluyendo las etapas 2 y 3: activación del pull-up interno y el bloque de sincronización. El bloque SYNC se debe situar SIEMPRE bien a continuación del pull-up, o bien directamente en el pin de entrada si no hay pull-up inteno
El escenario y el vídeo de prueba son los mismos que los del ejemplo 1
Para conectar varios pulsadores o varios switches podemos utilizar las versiones de buses de los bloques pull-ups y de sincronización. En esta figura se muestra el bloque sync-x08, que tiene las entradas y salidas de 8 bits

Estos bloques de bus simplifican mucho los circuitos cuando tenemos varias entradas iguales
Los bloques Sync de bus están implementados colocando en paralelo bloques Sync-0x1. Por ejemplo el bloque Sync-x02 está implementando mediante dos bloques Sync-x01 en paralelo, como se muestra en la imagen:

En el menú Sync/Verilog se pueden encontrar las implementaciones en Verilog. Estas implementaciones son paramétricas, siendo N el número de bits del bus. Como ejemplo se muestra en esta imagen la implementación del bloque Sync-x02-verilog

Este es el código verilog:
//-- Number of bits in the bus
localparam N = 2;
//-- Use 2 bits for each sync unit
//-- qs[0] First sync unit
//-- qs[1] Second sync unit
//-- ...
reg [1:0] qs[0:N-1];
genvar i;
generate
//-- Place N Sync blocks in paralell
for (i = 0; i < N; i = i + 1) begin
always @(posedge clk)
begin
//-- First D Flip-Flop
qs[i][0] <= d[i];
//-- Second D Flip-flop
qs[i][1] <= qs[i][0];
end
//-- Output wire
assign q[i] = qs[i][1];
end //-- For
endgenerateAmbas implementaciones, la de bloques y la de Verilog, son equivalentes. Consumen exactamente los mismos recursos
En este ejemplo se conectan 8 switches a través de sus 8 resistencias de pull-up y con sincronización. Su estado se muestra en los LEDs. Sólo se usan componentes de bus, por lo que el circuito se simplifica mucho
Este es el escenario de pruebas. Se han usado dos bloques de 4 micro-switches cada uno, conectados a la placa Alhambra II a través de los pines D0 - D7. Su estado se muestra por los LEDs

En este vídeo se muestra el funcionamiento
La etapa 4 es de normalización. Hace que a su salida se obtenga una señal en lógica positiva: 0 en reposo y 1 cuando se ha pulsado el botón o activado el sensor. Lo único que hay que hacer es añadir un puerta NOT si es necesaria
Utilizamos el bloque not-wire que permite activar la NOT con un parámetro. Cuando está desactivada el componente se comporta como un cable
El bloque Not-wire-x01 se encuentra en el menú Not-wire. Tiene un parámetro para indicar si la puerta NOT se activa o no: Si está a 1, la NOT está conectada. Si está a 0 se comporta como un cable

La puerta NOT opcional se implementan con una puerta XOR. Por una de sus entradas se introduce el valor del parámetro k (0/1). Y por la otra la entrada al bloque Not-wire. Cuando el parámetro es 0, por la salida de la XOR se obtendrá lo mismo que por la otra entrada, es decir, el mismo valor que entra al componente Not-wire. La puerta XOR se comporta como un cable
Sin embargo, cuando el parámetro es 1, el efecto de la XOR es que niega la otra entrada, comportándose como una puerta NOT

Dado que por una de las entradas de la XOR llega el parámetro, que siempre es constante, el sintetizador puede realizar las simplificaciones oportunas. Así, cuando no queremos la NOT, el parámetro vale 0, y al simplicarlo elimina también la XOR (porque el circuito equivalente es un cable). Y cuando el parámetro vale 1, el sintetizador deja sólo una puerta NOT. El resultado es que no se consumen recursos adicionales por tener el bloque Not-wire
Este es un pantallazo de la implementación en verilog

El código verilog está disponible aquí. Es una XOR entre el parámetro y la entrada del bloque
assign o = K ^ i;Vamos a comprobar que los recursos consumidos por Not-Wire-x1 varían según el parámetro utilizado, y que además son iguales a los componentes cable o puerta NOT en cada caso
Para hacer el experimento vamos a desactivar las reglas de la placa Alhambra II en la opción Editar/Preferencias/Reglas de la placa. Por defecto están activadas. Lo que hacen estas reglas es conectar a 0 los LEDS de la Alhambra II que no se estén usando, para que estén apagados (si no se hace esto, los pies de la FPGA están en alta impedancia y LEDs lucen tímidamente)
Estas reglas están activadas por defecto. Vamos a la opción Editar/Preferencias/Reglas de la placa y vemos que tienen una marca (tic) en la derecha

Pulsamos en la opción. Si volver a abrir el menú para analizar su estado, vemos que la marca ha desaparecido: Las reglas están desactivadas

En estas condiciones hacemos un circuito que conecte el pulsador SW1 con el LED0. Tiene sólo un cable. Activamos la opción Ver/Recursos de la FPGA y sintetizamos

Consume 2 bloques I/O (IO), uno por cada pin, y 1 celda lógica (LC)
Ahora hacemos lo mismo añadiendo una puerta NOT:

Los bloques IO siguen siendo los mismos, porque no hemos añadido pines adicionales. Sin embargo ahora se necesitan 3 celdas lógicas
Ahora repetimos los experimentos pero usando el componente Not-wire-x1 y los parámetros 0 y 1. Empezamos con el parámetro 0: es decir, queremos que el componente se comporte como un cable

Y efectivamente consume los mismos recursos que el cable: 1 celda lógica
Cambiamos el parámetro a 1, para activar la puerta NOT:

Y el número de celdas lógicas es de 3. Lo mismo que la puerta NOT
En este ejemplo conectamos un pulsador directamnete al pin D0. Por ello tenemos que activar los pull-ups internos. Para que la señal sea de lógica positiva tenemos que activar la puerta Not
Al apretar el pulsador el LED0 se enciende. Al liberarlo se apaga. Este es el escenario

Y en este vídeo se muestra en funcionamiento
El circuito del ejemplo 10 tiene la ventaja de ser muy general. Nos sirve para conectar cualquier tipo de pulsador: Conexión directa o pulsadores con pull-down o pull-up externas. Lo único que hay que hacer es cambiar el valor de los parámetros pull-up y not
Los pulsadores de la placa Alhambra II tienen un pull-down externo, y funcionan con lógica positiva. Usando este circuito general los conectamos asignando los valores pull-up=0 y not=0. Es decir, sin pull-up interno y sin puerta NOT
(11-not-wire-x1-Alhambra-II.ice)

El escenario está compuesto sólo por la placa Alhambra II. Al apretar SW1 se enciende el LED0 y al soltarlo se apaga. Pero si ahora queremos conectar el pulsador del ejemplo 10, sólo hay que cambiar los parámetros a 1 (pull-up=1, not=1)
Para conectar varios pulsadores o varios switches podemos utilizar las versiones de buses de los bloques pull-ups, sincronización y Not-wire. En esta figura se muestra el bloque not-wire-x08, que tiene las entradas y salidas de 8 bits
Estos bloques de bus simplifican mucho los circuitos cuando tenemos varias entradas iguales
Los bloques Not-wire de bus están implementados colocando en paralelo bloques Not-wire-x1. Por ejemplo el bloque Not-wire-x8 está implementando mediante dos bloques Not-wire-x01 en paralelo, como se muestra en la imagen:

En el menú Not-wire/Verilog se pueden encontrar las implementaciones en Verilog. Estas implementaciones son paramétricas, siendo N el número de bits del bus. Como ejemplo se muestra en esta imagen la implementación del bloque Not-wire-x02-verilog

Este es el código verilog:
//-- Number of bits in the bus
localparam N = 8;
genvar i;
generate
//-- Place N XOR gates in paralell
for (i = 0; i < N; i = i + 1) begin
assign o[i] = K ^ in[i];
end
endgenerateAmbas implementaciones, la de bloques y la de Verilog, son equivalentes. Consumen exactamente los mismos recursos
En este ejemplo se amplía el circuito del ejemplo 9, en el que se conectan 8 switches a los 8 LEDs. Se añade un bloque Not-wire-x8 de 8 bits para que todas las señales sean ahora de lógica positiva
El escenario es el mismo que el del ejemplo 9: Se han usado dos bloques de 4 micro-switches cada uno, conectados a la placa Alhambra II a través de los pines D0 - D7. Su estado se muestra por los LEDs

En este vídeo se muestra el funcionamiento
Cualquier pulsador, switch o sensor lo podemos leer de forma genérica conectando los bloques de las etapas 2,3 y 4, y configurando adecuadamente los parámetros pull-up y not. El primero activa el pull-up interno y el segundo añade una Not para normalizar la señal y que sea de lógica positiva
En esta tabla se resumen los valores de los parámetros para las diferentes configuraciones:
| Configuración | Pull-up | NOT | Descripción |
|---|---|---|---|
| Cable | 0 | 0 | Todo desactivado. Usar con pulsadores con pull-down externo y sensores que proporcionan señal en lógica positiva |
| Cable negado | 0 | 1 | NOT activada. Usar con pulsadores con pull-up externo y sensores que proporcionan señal en lógica negativa |
| Directa | 1 | 1 | Pull-up interno y Not activadas. Usar para la conexión directa de pulsadores, swithces y sensores que no tienen electrónica externa |
La configuración con pull-up interno activado y NOT desactivada es la directa negada, pero no se usará porque los bloques que se conectan a partir de la etapa 4 suponen que la señal está normalizada a lógica positiva
Cuando apretamos un pulsador, nos gustaría obtener una señal digital perfecta, como la mostrada en la siguiente figura: Mientras el pulsador está en reposo, su salida es 0. Al apretar el pulsador pasa a 1 y al soltarlo cambia a 0
Sin embargo, en la realidad NO es así. Al apretar el pulsador aparece un transitorio en el que la señal cambia de 0 a 1 y de 1 a cero, hasta que se estabiliza (régimen estable). Permanece en este estado hasta que se suelta el botón, y aparece otro régimen transitorio similar, hasta que finalmente se alcanza el régimen estable donde la salida tiene el valor 0
Estas oscilaciones se denominan rebotes y se producen en los pulsadores mecánicos, donde dos metales entran en contacto. La duración de este transitorio dependen del tipo de pulsador. Típicamente dura menos de 5ms
La etapa de antirrebotes se encarga de limpiar estas oscilaciones y obtener a su salida una señal digital perfecta, con el estado del pulsador
Para comprobar los rebotes de los pulsadores podemos utilizar un circuito muy sencillo: Un contador. La señal que llega del pulsador, tras pasar por las etapas 2,3 y 4, se introduce por un detector de flancos y se lleva a la entrada cnt del contador. De esta forma, cada vez que llega un flanco de subida por la señal del pulsador el contador se incrementa en 1. Y por los LEDs podemos ver cuántos rebotes han llegado
La señal input se saca también por el pin D0 para medirla con un analizador lógico externo
El escenario se muestra en esta imagen. El pulsador está conectado en el pin D13. En el D0 está conectado el canal 0 del analizador lógico:

En este vídeo se muestra el funcionamiento. Cada vez que se aprieta el pulsador, se incrementa el contador, y se ve en los LEDs. En la primera pulsación el contador muestra el valor 17 (10001 en binario). Esto significa que se han detectado 17 flancos de subida (17 rebotes). Al soltar el botón el contador se incrementa en 2, por lo que se han recibido dos rebotes
Con el botón SW1 el contador se pone a cero para analizar la siguiente pulsación. En la siguiente el contador muestra 22 (10110) al apretar, y no se incrementa al soltar (al soltar no han llegado rebotes esta vez). En la tercera aparecen 77 rebotes (1001101), 69 al apretar y 8 al soltar
Se ve claramente que hay rebotes en el pulsador. Luego volveremos a probar este circuito pero añadiendo el bloque antirrebotes
Hemos comprobado que con este pulsador hay rebotes. Ahora vamos a obtener más información con el analizador lógico, para hacernos una idea de cuánto tiempo tarda en estabilizarse la señal. Usamos el mismo escenario que el del apartado anterior, y capturamos la señal del botón con el Pulseview
Esta es la captura de una pulsación rápida. En el tiempo 0 es cuando empieza la captura. En la marca azúl es cuando se recibe el primer flanco de subida en la tecla. Vemos que hay un transitorio, que acaba antes de llegar a 2ms. En la parte final, al soltar la tecla, no se aprecia nada en esta imagen

Hacemos zoom en la parte de la pulsación de la tecla, para ver más detalles de los rebotes. Se puede apreciar que hay unos 20 flancos de subida

Hacemos lo mismo con la parte final:

Ahora se apecian dos flancos de subida: Hay dos rebotes
Estas mediciones las repetimos varias veces, y el patrón del rebote cambia, pero siempre el transitorio está por debajo de los 5ms
El bloque Debouncer-x01 se encuentra en el menú Debouncer. Por la entrada llega el bit de la etapa 4. Tiene que recibir una señal normalizada (en lógica positiva). Por su salida se obtine la señal de estado, lista para usarse por las etapas siguientes. Es una señal totalmente limpia
La implementación del antirrebotes se ha hecho con dos biestables D, un contador de 16 bits y una puerta XOR. En el biestable D de salida es donde se almacena el valor que es estable. La señal se considera estable si han transcurrido al menos 5.5ms aproximadamente sin que cambie. Si cumple esa condición ese valor se captura en el biestable de salida

En la entrada hay un circuito detector de cambios, formado por otro biestable D y una puerta XOR. Cada vez que llega un flanco de subida o bajada por la entrada, se genera un tic que reinicia el contador
El contador es el que determina si la señal es estable. Está contanto a la velocidad del reloj del sistema. Si llega hasta su valor máximo (2 elevado a 16) y vuelve a empezar, significa que ha transcurrido el tiempo requerido para considerar la señal estable. Se usa el tic de overflow para capturar el valor estable en el biestable de salida
Si por el contrario se produce un cambio en la señal de entrada antes de que el contador llegue al overflow, significa que todavía no se ha estabilidado, por lo que el contador se pone a cero
Este es ejemplo es para probar el bloque antirrebores, junto al resto de etapas. La señal de estado generada se muestra por el LED0. Como se está conectando un pulsador directamente, se necesita el pull-up y el NOT de la etapa 4
El escenario es el mismo que el del Ejemplo 10, donde se probaba el bloque not-wire-x01. El vídeo es similar. Al apretar el pulsador se enciende el LED0 y al soltarlo se apaga. Pero la señal ahora no tiene rebotes, aunque no se aprecia a simple vista
Para comprobar que efectivamente los rebotes han desaparecido, usamos el circuito del Ejemplo 13, pero añadiendo el antirrebotes. Además, por los pines D0 y D1 se sacan respectivamente la señal sin procesar (con rebotes) y la señal de estado (sin rebotes), para compararlas
El escenario es similar al del Ejemplo 13, pero ahora están conectados los canales 0 y 1 del analizador

En este vídeo se muestra su funcionamiento. Ahora el contador SÓLO se incrementa de uno en uno. Sólo llega un flanco de subida por cada pulsación. Nuestro antirrebotes funciona correctamente
Con el circuito del ejemplo 15 realizamos las mediciones de la señal a la entrada y la salida del bloque antirrebotes. Los resultados se muestran en esta imagen

En la parte superior está la señal con los rebotes. En la inferior la señal sin rebotes. Podemos apreciar que efectivamente la señal de salida (input1) es una señal cuadrada perfecta, sin rebotes. El precio a pagar es que la señal está retrasada con respecto a la original un tiempo de 5.5ms + tr, donde tr es lo que tardan los rebotes
Para conectar varios pulsadores o varios switches podemos utilizar las versiones de buses de los bloques pull-ups, sincronización, Not-wire y Debouncer. En esta figura se muestra el bloque debouncer-x08, que tiene las entradas y salidas de 8 bits
Los bloques Debouncer de bus están implementados colocando en paralelo bloques Debouncer-x1. Por ejemplo el bloque Debouncer-x2 está implementando mediante dos bloques Debouncer-x01 en paralelo, como se muestra en la imagen:

En este ejemplo se amplía el circuito del ejemplo 12, en el que se conectan 8 switches a los 8 LEDs. Se añade un bloque Debouncer-x8 de 8 bits para eliminar los rebotes y generar las señales de estado finales
(16-debouncer-x8-switches.ice)

El escenario es el mismo que el del ejemplo 12: Se han usado dos bloques de 4 micro-switches cada uno, conectados a la placa Alhambra II a través de los pines D0 - D7. Su estado se muestra por los LEDs

El vídeo es también el mismo que el del ejemplo 12
Para utilizar los interruptores y pulsadores fácilmente en nuestros circuitos usamos los bloques button que ya tienen incorporadas todas las etapas de procesamiento. A la salida nos devuelven la señal de estado
El bloque button nos permite configurar un pulsador. Tiene dos parámetros:
- pup: Activar o no el pull-up interno
- not: Añadir o no un inverso a la salida
Por defecto ambos parámetros están a 0
El bloque se encuentra situado en la colección iceinput, en el menú Buttons. Este es el aspecto que tiene:
La entrada pin se debe conectar directamente a un pin de la FPGA. Por la salida se obtiene la señal de estado del pulsador (que es el resultado de pasar por las etapas de pull-up, sincronización, normalización y antirrebotes)
En la siguiente tabla se resumen los valores de sus parámetros para la conexión de los tres tipos de pulsadores: pulsadores directos o pulsadores que tienen circuitos de adaptación externos (pull-up o pull-down)
| Tipo de pulsador | Pup | NOT | Descripción |
|---|---|---|---|
| Pull-down externo | 0 | 0 | Ej. Pulsadores de la Alhambra |
| Pull-up externo | 0 | 1 | |
| Conexión directa | 1 | 1 | Conexión del pulsador directamente, sin circuitos externos |
También está la versión de BUS, pensada para conectar varios pulsadores fácilmente. En esta figura se muestra la versión de bus de 8 bits. Es especialmente útil para conectar arrays de switches
La implementación del bloque Button de 1 bit se hace mediante la conexión en serie de los bloques de las 4 etapas: pull-up interno, sincronización, normalización y antirrebotes. El parámetro pup es el que controla la etapa del pull-up interno y el parámetro not la etapa de normalización

Las versiones de buses se implementan conectando en paralelo varios bloques button-x1. En esta figura se muestra la implementación del bloque button-x2:

Los pulsadores de la Alhambra II tiene resistencias de pull-down externas por lo que su lógica es positiva. Para configurarlos hay que desactivar el pull-up interno y no activar la not. Es decir, ambos parámetros a 0. Dado que este es el valor por defecto, basta con colocar directamente el bloque Button-x1
(17-button-x1-Alhambra-II.ice)

El escenario está compuesto sólo por la placa Alhambra II. Al apretar SW1 se enciende el LED0 y al soltarlo se apaga
Para conectar los dos pulsadores de la Alhambra II a dos LEDs, usamos el bloque Button-x02. Se puede hacer lo mismo colocando dos bloques Button-x01 en paralelo, pero así el circuito es más compacto
(18-button-x2-Alhambra-II.ice)

Al apretar SW1 se enciende el LED0 y al apretar SW2 el LED1. Al soltar los pulsadores los LEDs se apagan. El escenario está compuesto sólo por la placa Alhambra II
Para configurar un pulsador que está conectado directamente a la FPGA, sin circuitos externos, basta con activar la resistencia de pull-up interna (pup = 1) y activar también la NOT (not = 1) para que la señal de estado sea de lógica positiva
En este ejemplo se conecta directamente un pulsador al pin D0 y su estado se muestra por el LED0, de manera que al apretarlo se enciende el LED0 y al soltarlo se apaga
El escenario es exactamente el mismo que el del ejemplo 10, así como el vídeo de funcionamiento
La conexión directa de botones, sin utilizar circuitos externos, es muy común, por lo que resulta muy útil tener un bloque específico para usarlos, sin tener que establecer ningún valor de los parámetros. Este es el aspecto del bloque button_direct:
Es exactamente igual que el bloque Button, pero sin los parámetros de configuración. También están las versiones de bus para la conexión de varios botones en paralelo. En esta figura se muestra el bloque button_direct-x08
El bloque button_direct-x01 está implementado a partir del bloque button configurando la resistencia de pull-up interna y la puerta NOT para que la salida sea en lógica positiva

Las versiones de varios bits se implementan colocando en paralelo bloques button_direct. En la figura se muestra la implementación del bloque button_direct-x02:

En este ejemplo se conecta directamente un pulsador al pin D0 y su estado se muestra por el LED0, de manera que al apretarlo se enciende el LED0 y al soltarlo se apaga
El escenario es exactamente el mismo que el del ejemplo 10, así como el vídeo de funcionamiento
Ejemplo de conexión directa de 8 switches. Sus señeles de estado se muestran por los LEDs 0 - 7
El escenario y el vídeo son los mismos que los del Ejemplo 16
Para la mayoría de las aplicaciones en las que se usan los pulsadores, no sólo es interesante tener la señal de estado, sino también detectar cuándo se ha apretado el pulsador. Tanto a los botones genéricos como los de conexión directa se les puede añadir una salida extra que emite un tic cuando se aprieta el pulsador
También están las versiones de buses para controlar varios pulsadores. Todas las salidas de estado salen por el bus s, y todas los tics de tecla pulsada por el bus press. En esta figura se muestran ejemplos de bloques para dos pulsadores
La implementación del bloque button-tic se realiza a partir de un bloque button al que se le añade un detector de flancos de subida, de forma que al apretarse el pulsador la señal cambia de 0 a 1 y se emite un tic por la salida press

En las versiones de varios botones se colocan los bloques button-tic en paralelo. En esta imagen se muestra la implementación del bloque button-tic-x02. Las señales de estado de los dos pulsadores se agrupan en el bus s, y los tics de tecla presionada (press) se agrupan en otro bus press

La implementación del bloque-direct-tic se hace a partir del bloque button-tic, estableciendo los valores de los parámetros para la gestión de la conexión directa (pull-up=1, not=1)
En este ejemplo se muestra el uso del bloque button-tic para incrementar un contador de 4 bits cada vez que se aprieta un pulsador. Su salida se muestra por los LEDs 0 - 3. El estado del pulsador SW1 (señal de estado) se muestra por el LED7
El escenario está compuesto por una placa Alhambra II, sin ninguna conexión exterior. En este vídeo se muestra el funcionamiento del ejemplo
Se utiliza el bloque button-direct-tic-x02 para leer dos switches externos. Cada vez que alguno de los switches pasa a ON se incrementa un contador de 3 bits que se muetra por los LEDs 2-0. El estado de ambos switches se muestra en los LEDs 7-6
El escenario está formada por un pack de 4 switches en una protoboard, de los cuales sólo dos están conectados directametne a los pines D0 y D1 de la Alhambra II

En este vídeo se muestra el funcionamiento
En esta parte se muestran ejemplos sencillos del uso de los pulsadores y switches, utilizando los bloques de la colección iceInputs. No hace falta saber nada de las secciones anteriores: cómo están implementados esos bloques. Se muestras ejemplos para aprender a usarlos directamente
Los pulsadores de la placa Alhambra II, SW1 y SW2, incorporan resistencias de pull-down por lo que se pueden usar desde nuestros circuitos utilizando los bloques button y button-tic directamente, sin necesidad de establecer ningún valor para sus parámetros de configuración
En este ejemplos se muestra el estado de los pulsadores SW1 y SW2 en los LEDs 0 y 1 respectivamente utilizando el bloque button-x02 con sus valores por defecto
Al apretar el pulsador SW1 se emite un pitido corto de 50ms. Se utiliza el bloque button-tic que emite un tic por press al pulsar el botón. Con el pulsador SW2 suena otro pitido, que dura mientras el pulsador esté presionado, y se detiene al soltarlo. Se utiliza la señal de estado del bloque button
(25-Alhambra-II-02-sonidos.ice)

Este es el escenario. Hay dos zumbadores conectados a los pines D0 y D1

Y en este vídeo se muestra su funcionamiento:
Para conectar pulsadores directamente a la placa Alhambra II se utilizan los bloques button_direct
En este ejemplo se usa el bloque button-direct-x02 para mostrar el estado de ambos pulsadores en los LEDs 0 y 1
(26-Direct-buttons-01-leds.ice)

Este es el escenario:

En este vídeo se muestra su funcionamiento
En este ejemplo se usan los bloques Button_direct_tic-x01 y Button_direct-x01 para manejar dos pulsadores conectados directamente. Al apretar uno de ellos se mite un pitido corto de 50ms, y al apretar el otro el pitido dura mientras está apretado. Cada pitido se emite por un zumbador diferente, conectados a D0 y D1
(27-Direct-buttons-02-sonidos.ice)

Este es el escenario:

Y en este vídeo se muestra el ejemplo en funcionamiento
Puesta en marcha del GamePAD descrito en esta sección del cuaderno
Este es el conexionado de la placa

La conexión de los botones es directa, sin ningún circuito de pull-up o pull-down exterior, por lo que para usarlo en nuestros circuitos utilizamos los bloques button-direct
Ejemplo "Hola mundo" de puesta en marcha. Cada vez que se aprieta el botón 1 del GamePad se encienden TODOS los LEDs. Mediante el bloque Copy-8 de la colección iceWires se copia la señal de estado del pulsador y se replica en un bus de 8 bits de salida que se lleva a los 8 LEDs
Este es el escenario. El botón 1 se conecta directamente al pin D0, usando un cable para GND y otro para la señal del pulsador

Y en este vídeo se muestra su funcionamiento:
En este ejemplo probamos los 4 botones del GamePad. Los conectamos a los pines D0-D3 de la Alhambra II, y un zumbador al pin D13. Este es el escenario:
Con las teclas arriba y abajo se mueve un LED verticalmente en la barra de LEDs. Una posición con cada pulsación. Con los botones izquierda/derecha se decrementa o incrementa la intensidad del LED. Este control se hace mediante tiempo: cuanto más tiempo esté apretada la tecla mayor será el cambio de brillo

Con cada pulsación de la tecla se emite un pitido corto. Para la lectura de los botones se usa el bloque button-direct-tic-x04. Por la salida s se tiene un bus con las señales de estado de los 4 pulsadores. Las señales correspondientes a las teclas derecha/izquierda son las que se usan para el control del brillo
La salida press es un bus con los tics emitidos por cada tecla al apretarse. Los tics correspondientes a las teclas arriba/abajo son los que se usan para incrementar/decrementar el registro que da la posición del LED en la barra (0-7)
En este vídeo se puede ver el funcionamiento:
Puesta en marcha del Arduino Joystick Shield descrito en esta sección del cuaderno
Este es el conexionado de la placa

Todos los pulsadores están conectados directamente a los pines Dx, SIN resistencias de pull-up externas. Por ello utilizaremos los bloques button-direct para la lectura de los pulsadores
Ejemplo "Hola mundo" de puesta en marcha. Cada vez que se aprieta el botón A se encienden TODOS los LEDs. Mediante el bloque Copy-8 de la colección iceWires se copia la señal de estado del pulsador y se replica en un bus de 8 bits de salida que se lleva a los 8 LEDs
Este es el escenario. Se tiene la placa Alhambra II a la que se le ha colocado encima el escudo Funduino

Y en este vídeo se muestra su funcionamiento:
En este ejemplo probamos los 7 botones del Arduino Joystick Shield. Este es el escenario:

Cada vez que se aprieta un botón se cambia de estado su LED correspondiente (0-6) y se emite un pitido corto. El LED7 se enciende siempre que haya un botón apretado (cualquiera de los siete). Este es el circuito:
En este vídeo se puede ver el funcionamiento:
Puesta en marcha de la placa Edubásica descrita en esta sección del cuaderno
Este es el conexionado de la placa

Tiene sólo un pulsador, con una resistencia de pull-down, conectado al pin D2. Utilizamos el bloque button para leerlo, dejando sus parámetros pup y not con sus valores por defecto
Este es el ejemplo "Hola mundo" para probar el pulsador y los LEDs. Cada vez que se aprieta el botón se encienden los 3 LEDs a la vez: Rojo, amarillo y verde
En este vídeo se muestra el funcionamiento:
En este ejemplo se utiliza el bloque button-tic para cambiar el estado de los LEDs con cada pulsación. Los LEDs se encienden siguiente la secuencia Verde, Amarillo y Rojo
En este vídeo se muestra el funcionamiento:
Puesta en marcha de la placa Edchina descrita en esta sección del cuaderno
Este es el conexionado de la placa

Tiene dos pulsadores con resistencias de pull-down, en los pines D2 y D3. Utilizamos los bloques button y button-tic para leerlos, dejando sus parámetros pup y not con sus valores por defecto
Este es el ejemplo "Hola mundo" para probar un pulsador y los LEDs. Cada vez que se aprieta el botón se encienden los 3 LEDs a la vez: Rojo, amarillo y verde
Este es el escenario: Una Edchina conectada a la Alhambra II:

En este vídeo se muestra el funcionamiento:
Con el pulsador 1 se cambia el color mostrado en el LED tri-color: Rojo, Azul y Verde. Con el pulsador 2 se enciende el siguiente LED en la secuencia: Rojo, amarillo y verde. Al apretar cualquiera de los pulsadores se emite un pitido corto
En este vídeo se muestra el funcionamiento:
Puesta en marcha de la placa Fenderino Guitar Shield descrita en esta sección del cuaderno
Este es el conexionado de la placa

Tiene un total de 8 pulsadores, que van conectados directamente a los pines de la FPGA. En el Fenderino NO hay procesamiento de las señales: ni resistencias de pull-up ni de pull-down, por lo que hay que usar los bloques button-direct y button-direct-tic
Este es el ejemplo "Hola mundo" para probar un pulsador y los LEDs. Cada vez que se aprieta el botón se encienden los 4 LEDs a la vez
Este es el escenario: Un Fenderino Guitar Shield conectado a la Alhambra II:

En este vídeo se muestra el funcionamiento:
En este ejemplo se asigna una nota a cada tecla. Esta nota se toca mientras la tecla correspondiente esté apretada. Dos leds se encienden siempre que hay una tecla apretada
Además, por los otros dos LEDs se muestra el estado del switch de tres posiciones
En este vídeo se muestra el funcionamiento:
Puesta en marcha de la placa LaleBot Shield-1 descrita en esta sección del cuaderno
Este es el conexionado de la placa

Tiene un total de 3 pulsadores y 2 switches, que van conectados directamente a los pines de la FPGA. NO hay procesamiento de las señales: ni resistencias de pull-up ni de pull-down, por lo que hay que usar los bloques button-direct y button-direct-tic
Este es el ejemplo "Hola mundo" para probar el pulsador y los LEDs. Cada vez que se aprieta el botón se encienden los 2 Tri-LEDs con el color verde
Este es el escenario: la shield-1 sobre la placa maestra conectada a la Alhambra II:

En este vídeo se muestra el funcionamiento:
Los tres pulsadores se usan para determinarl el color (rojo, azul, verde). Este canal de color se saca bien por los LEDs tri-color o bien por los LEDs de la Alhambra II en función del estado de los dos switches de la placa
En este vídeo se muestra el funcionamiento:
Este escudo tiene dos LEDs, uno verde y otro rojo, un zumbador y un pulsador con resistencia de pull-down. Se conecta al escudo maestro

Cada vez que se aprieta el pulsador se emite un pitido corto y se cambia de estado los dos LEDs rojo y verde
Este es el escenario:

En este vídeo se muestra el funcionamiento:
Este escudo tiene un LED, un altavoz, tres sensores de luz (LDRs) y un pulsador con resistencia de pull-down. Se conecta al escudo maestro

Cada vez que se aprieta el pulsador se emite un pitido corto y se cambia el estado del LED. También se muestra por los 8 LEDs de la Alhambra II
Este es el escenario:

Puesta en marcha de la placa Icebreaker DIP Switch descrita en esta sección del cuaderno
Este es el conexionado de la placa

Tiene un total de 8 micro-interruptores, que van conectados a través de resistencias de pull-up, con lógica positiva. Al conectar un switch se recibe un 1 por el pin correspondiente. Lo podemos usar desde nuestros circuitos mediante los bloques button y button-tic usando los parámetros por defecto
El estado de los micro-switches se lee a través del bloque button-tic-x8 y se muestra en los 8 LEDs de la placa Alhambra II. Cada vez que un switch pasa a ON se emite un pitido corto
(42-IceBreaker-Dip-Switch-01.ice)

Este es el escenario:

En este vídeo se muestra el funcionamiento:
Puesta en marcha de la placa Icesugar PMOD Switch descrita en esta sección del cuaderno
Este es el conexionado de la placa

Tiene un total de 8 micro-interruptores, que van conectados a través de resistencias de pull-down, con lógica positiva. Al conectar un switch se recibe un 1 por el pin correspondiente. Lo podemos usar desde nuestros circuitos mediante los bloques button y button-tic usando los parámetros por defecto
El estado de los micro-switches se lee a través del bloque button-tic-x8 y se muestra en los 8 LEDs de la placa Alhambra II. Cada vez que un switch pasa a ON se emite un pitido corto
(43-IceSugar-Pmod-Switch-01.ice)

Este es el escenario:

En este vídeo se muestra el funcionamiento:
Puesta en marcha del pulsador capacitivo descrito en esta sección del cuaderno
Este es el conexionado de la placa:

El estado del pulsador capacitivo se muestra por los 8 LEDs. Cada vez que se aprieta se emite un pitido corto
Este es el escenario:

En este vídeo se muestra el funcionamiento:
Y por último, este es el vídeo del pulsador casero en funcionamiento:
La lectura de pulsadores ya no tiene secretos. Conocemos todo lo que ocurre en el proceso de lectura, a nivel de electrónica digital, y samos cómo se implementa utilizando sólo bloques de Icestudio
- Juan González-Gómez (Obijuan)


- Carlos Venegas. Muchísimas gracias por toda tu ayuda y tus aportaciones 😄
- Icestudio, Nigthly builds
- cuaderno técnico 3: Pines de Entrada salida
- Tutorial de Electrónica digital para makers con FPGAs libres
- Tutorial 9: Pulsadores y entradas
- Tutorial 12: Interruptores y pulsadores externos
- Tutorial 16: Sensores de Infrarojos
- Kit de 37 sensores compatible Arduino. Bricogeek
- tarjeta Skypads 2.0, con 8 pulsadores dispuestos en dos crucetas
- PCB OBPushButton de ElecFreaks
- Vídeoblog: Píldoras de conocimiento
- Ingeniería inversa de un teclado de PC
- Pulsador cherry black
- PCBPrint para Pulsadores Cherry-mx
- Gamepad PCB
- Fenderino guitar shield (Instrucciones de montaje)
- Kit de 37 sensores para arduino, en BricoGeek
- Kit de 27 sensores para arduino (PDF)
- Unidad de PWM de frecuencia aproximada
- VGA Retro: Puesta en marcha. MonsterLED
- Pines de Entrada/Salida
- Control de LEDs
- SPI esclavo
- SPI Maestro
- Display SPI de 4 dígitos de 7 segmentos
- Entrada y Salida de Bits con Componentes Virtuales
- Memorias
- Entradas y pulsadores
- Señales del sistema. Medición con el LEDOscopio
- Controlador LCD 16x2
- Señales periódicas y temporización
- Buses: Medio compartido
- Memoria Flash SPI
- Conexión de LEDs en la Alhambra II. Placa AP‐LED8‐THT
- Periféricos PMOD
- Fundamentos. Sistema Unario
- Autómatas
- Pantallas de vídeo. Fundamentos. Display de 1x4 LEDs
- Pantallas de vídeo. Fundamentos. Matriz de 4x4 LEDs







































































