Skip to content

CT.10: Entradas y pulsadores

Juan Gonzalez-Gomez edited this page May 17, 2024 · 859 revisions

Descripción

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

Historial

  • 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

Vídeos

Vídeo 1: Etapas de procesamiento de las entradas

  • Fecha: 07-Abril-2021

Haz click en la imagen para ver el vídeo en Youtube

Click to see the youtube video

Vídeo 2: La etapa física. Pulsadores y placas

  • Fecha: 08-Abril-2021

Haz click en la imagen para ver el vídeo en Youtube

Click to see the youtube video

Vídeo 3: Etapas 1 y 2. Procesado analógico. Pull-ups y Pull-downs

  • Fecha: 13-Abril-2021

Haz click en la imagen para ver el vídeo en Youtube

Click to see the youtube video

Vídeo 4: Etapa 3: Sincronización

  • Fecha: 05-Mayo-2021

Haz click en la imagen para ver el vídeo en Youtube

Click to see the youtube video

Vídeo 5: Etapa 4: Normalización

  • Fecha: 06-Mayo-2021

Haz click en la imagen para ver el vídeo en Youtube

Click to see the youtube video

Vídeo 6: Etapa 5: Antirrebotes

  • Fecha: 08-Mayo-2021

Haz click en la imagen para ver el vídeo en Youtube

Click to see the youtube video

Vídeo 7: Pulsadores: Ejemplos de uso

  • Fecha: 09-Mayo-2021

Haz click en la imagen para ver el vídeo en Youtube

Click to see the youtube video

Icestudio

Todos los ejemplos se han probado con Icestudio 0.12. Usa esta versión o superior

Colección

  • iceInput: Colección para este cuaderno técnico. Descargar e instalar la última versión

Ejemplos

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

Contenido

Introducción

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

Señal de estado

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)

Etapas de entrada previas a la señal de estado

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

Etapa física

En esta etapa están los elementos físicos: pulsadores, interruptores, micro-switches...

Pulsadores

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

Pulsadores para circuito impreso

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

Conexión en protoboard

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

Conexión en PCBprint

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

Conexión en PCB Prototipo

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

PCB Comecial: KY004. Un pulsador

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:

PCB comecial: Octopus pushbutton

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

PCB comercial: PiGrrl Gamepad

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

Pulsadores tipo Tecla de PC

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

Pulsadores Cherry-mx

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

PCBPrint para pulsadores 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

Mini-teclados caseros con pulsadores Cherry-mx

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

Pulsadores de mini-teclados

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

Mini-teclado hexadecimal de membrana

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

Mini-teclado numérico de 12 teclas

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

Teclado numérico de PC

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.

Shields con pulsadores

Hay muchas shields para Arduino UNO que incluyen pulsadores, además de otros periféricos. Estas shields son compatibles con la Alhambra II

Arduino Joystick shield

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

LCD Keypad shield

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

Edubásica V2.0

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

Echidna Shield

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

Fenderino Guitar Shield

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

Pulsadores capacitivos

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

Pulsadores caseros

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

Mediante dos cables

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)

Pulsador de papel

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

Interruptores

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

Interruptor para circuito impreso

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)

Conexión en protoboard

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:

Conexión en PCBPrint

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:

Microinterruptores en array

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)

Conexión en Protoboard

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

PCBs con Arrays de microinterruptores

Hay muchas placas que integran arrays de microinterruptores para hacer pruebas. Mostraremos algunas de ellas

Placa con pulsadores y switches de Diego Lale

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)

IceBreaker Dip-Switch PMOD

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

PMOD switch v1.0

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

Sensores

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

Finales de carrera

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)

Sensor de choque

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

Sensor de inclinación

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

Sensor magnético

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

Sensor de lengueta

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

Sensor de efecto Hall

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

Sensor de Infrarrojos

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

Etapa 1: Procesamiento externo

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

Resistencia de pull-up

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

Resistencia de pull-down

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

Etapa 2: Pull-up interno

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

Bloques pull-up de 1 pin

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

Implementación

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)
  );

Ejemplo 1: Un pulsador con pull-up interno

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

(01-pull-up-x1.ice)

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

Click to see the youtube video

Ejemplo 2: Un pulsador con pull-up interno no conectado

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

(02-pull-up-x1-on-off.ice)

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

Ejemplo 3: ERROR: No wire found for port PACKAGE_PIN...

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

(03-pull-up-x1-error.ice)

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

Ejemplo 4: Dos pulsadores de entrada con pull-up

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

(04-pull-up-x1-two.ice)

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

Click to see the youtube video

Bloques pull-up de varios pines

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

Implementación

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

Ejemplo 5: Dos pulsadores de entrada y un bloque de pull-up

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

(05-pull-up-x2.ice)

El escenario de prueba y el vídeo son los mismos que los del ejemplo 4

Ejemplo 6: Conexión de 4 micro-switches

Conectamos un array de 4 micro-interruptores activando sus cuatro pull-ups mediante el bloque pull-up-x4

(06-pull-up-x4-switches.ice)

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:

Click to see the youtube video

Etapa 3: Sincronizació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

Circuitos síncronos

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

Señales estables

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

Señal de reloj

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

Metaestabilidad: captura de señales transitorias

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.

Solución: Biestables encadenados

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 de 1 pin

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

Implementación

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;
end

Ejemplo 7: Midiendo el bloque con IceRok

Para 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:

(07-sync-x1-icerok-test.ice)

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

Ejemplo 8: Un pulsador: Pull-up + sincronización

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

(08-sync-x1-pull-up.ice)

El escenario y el vídeo de prueba son los mismos que los del ejemplo 1

Bloque Sync para varios pines

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

Implementación

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

endgenerate

Ambas implementaciones, la de bloques y la de Verilog, son equivalentes. Consumen exactamente los mismos recursos

Ejemplo 9: 8 Switches con pull-up y Sincronización

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

(09-sync-x8-pull-up.ice)

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

Click to see the youtube video

Etapa 4: Normalización: Lógica positiva

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

Bloque Not-wire de 1 bit

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

Implementación

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;

Experimento: Recursos consumidos por Not-Wire-x1

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

Ejemplo 10: Probando el bloque Not-Wire-x1

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

(10-not-wire-x1.ice)

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

Click to see the youtube video

Ejemplo 11: Probando el pulsador de la Alhambra II

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)

Bloque Not-wire de varios bits

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

Implementación

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
  
endgenerate

Ambas implementaciones, la de bloques y la de Verilog, son equivalentes. Consumen exactamente los mismos recursos

Ejemplo 12: Conexión de 8 switches

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

(12-not-wire-x8-swithces.ice)

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

Click to see the youtube video

Parámetros de Configuración de los diferentes pulsadores

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

Etapa 5: Antirrebotes

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

Ejemplo 13: Circuito detector de rebotes

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

(13-debouncer-counter.ice)

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

Click to see the youtube video

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

Midiendo los rebotes

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 de un pin

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

Implementación

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

Ejemplo 14: Probando el bloque antirrebotes con un LED

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

(14-debouncer-x1.ice)

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

Ejemplo 15: Prueba con el circuito detector de rebotes

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

(15-debouncer-counter-2.ice)

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

Click to see the youtube video

Midiendo la señal de estado

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

El bloque debouncer de varios pines

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

Implementación

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:

Ejemplo 16: Conexión de 8 switches

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

Click to see the youtube video

Bloques para pulsadores

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

Botones genéricos: Bloque button

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

Implementación

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:

Ejemplo 17: Pulsador de la Alhambra II

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

Ejemplo 18: Conexión de los dos pulsadores de la Alhambra II

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

Ejemplo 19: Conexión directa de un pulsador

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

(19-button-x1-direct.ice)

El escenario es exactamente el mismo que el del ejemplo 10, así como el vídeo de funcionamiento

Botones directos: Bloque button_direct

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

Implementación

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:

Ejemplo 20: Conexión directa de un pulsador externo

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

(20-button-direct-x1.ice)

El escenario es exactamente el mismo que el del ejemplo 10, así como el vídeo de funcionamiento

Ejemplo 21: Conexión directa de 8 switches

Ejemplo de conexión directa de 8 switches. Sus señeles de estado se muestran por los LEDs 0 - 7

(21-button-direct-x8.ice)

El escenario y el vídeo son los mismos que los del Ejemplo 16

Botones con salida tic

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

Implementación

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)

Ejemplo 22: Incrementando un contador con el pulsador de la Alhambra II

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

(22-button-tic.ice)

El escenario está compuesto por una placa Alhambra II, sin ninguna conexión exterior. En este vídeo se muestra el funcionamiento del ejemplo

Click to see the youtube video

Ejemplo 23: Contando las activaciones de dos switches

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

(23-button-direct-tic.ice)

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

Click to see the youtube video

Aplicaciones

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

Pulsadores de la Placa Alhambra II

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

Ejemplo 24: Pulsadores en LEDs

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

(24-Alhambra-II-01-leds.ice)

Ejemplo 25: Pulsadores y sonido

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:

Click to see the youtube video

Conexión directa de pulsadores

Para conectar pulsadores directamente a la placa Alhambra II se utilizan los bloques button_direct

Ejemplo 26: Pulsadores en LEDs

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

Click to see the youtube video

Ejemplo 27: Pulsadores y sonido

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

Click to see the youtube video

GamePAD PCB

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 28: Probando el botón 1

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

(28-Gamepad-01.ice)

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:

Click to see the youtube video

Ejemplo 29: Controlando un LED con el gamepad

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:

(29-Gamepad-02.ice)

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:

Click to see the youtube video

Arduino Joystick Shield

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 30: Probando el botón A

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

(30-Arduino-Joystick-01.ice)

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:

Click to see the youtube video

Ejemplo 31: Botones y LEDs

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:

(31-Arduino-Joystick-02.ice)

En este vídeo se puede ver el funcionamiento:

Click to see the youtube video

Tarjeta Edubásica

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

Ejemplo 32: Probando el pulsador

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

(32-Edubasica-01.ice)

En este vídeo se muestra el funcionamiento:

Click to see the youtube video

Ejemplo 33: Rotación de LEDs

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

(33-Edubasica-02.ice)

En este vídeo se muestra el funcionamiento:

Click to see the youtube video

Tarjeta Edchina

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

Ejemplo 34: Probando un pulsador

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

(34-Edchina-01.ice)

Este es el escenario: Una Edchina conectada a la Alhambra II:

En este vídeo se muestra el funcionamiento:

Click to see the youtube video

Ejemplo 35: Rotación de LEDs y colores

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

(35-Edchina-02.ice)

En este vídeo se muestra el funcionamiento:

Click to see the youtube video

Fenderino Guitar Shield

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

Ejemplo 36: Probando un pulsador

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

(36-Fenderino-Guitar-01.ice)

Este es el escenario: Un Fenderino Guitar Shield conectado a la Alhambra II:

En este vídeo se muestra el funcionamiento:

Click to see the youtube video

Ejemplo 37: Teclas y Notas

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

(37-Fenderino-Guitar-02.ice)

En este vídeo se muestra el funcionamiento:

Click to see the youtube video

LaleBot Shield-1

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

Ejemplo 38: Pruebas del pulsador

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

(38-Lalebot-shield1-01.ice)

Este es el escenario: la shield-1 sobre la placa maestra conectada a la Alhambra II:

En este vídeo se muestra el funcionamiento:

Click to see the youtube video

Ejemplo 39: Pulsadores y Switches

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

(39-Lalebot-shield1-02.ice)

En este vídeo se muestra el funcionamiento:

Click to see the youtube video

LaleBot Shield-2

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

Ejemplo 40: Test

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

(40-Lalebot-shield2-01.ice)

Este es el escenario:

En este vídeo se muestra el funcionamiento:

Click to see the youtube video

LaleBot Shield-3

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

Ejemplo 41: Test

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

(41-Lalebot-shield3-01.ice)

Este es el escenario:

Icebreaker DIP switch

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

Ejemplo 42: Test

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:

Click to see the youtube video

Icesugar PMOD Switch

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

Ejemplo 43: Test

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:

Click to see the youtube video

Pulsador capacitivo

Puesta en marcha del pulsador capacitivo descrito en esta sección del cuaderno

Este es el conexionado de la placa:

Ejemplo 44: Test

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

(44-Capacitivo-01.ice)

Este es el escenario:

En este vídeo se muestra el funcionamiento:

Click to see the youtube video

Pulsador casero

Y por último, este es el vídeo del pulsador casero en funcionamiento:

Click to see the youtube video

Conclusiones

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

Autor

Licencia

Créditos y agradecimientos

  • Carlos Venegas. Muchísimas gracias por toda tu ayuda y tus aportaciones 😄

Enlaces

Clone this wiki locally