Skip to content

S5: Sensores binarios

Juan Gonzalez-Gomez edited this page Nov 8, 2022 · 134 revisions

Sesión 5: Sensores binarios

  • Tiempo: 2h
  • Fecha: Lunes, 8 de Noviembre de 2022
  • Objetivos de la sesión:
    • Entender todo lo que ocurre desde que se aprieta un pulsador hasta que se obtiene una señal estable
    • Utilizar los sensores de IR

Contenido

Introducción

Los robots obtienen información del entorno a través de los sensores. Estas señales llegan a la unidad de procesamiento y se usan para generar unas respuestas en los actuadores, lo que provoca la aparición de un comportamiento en el robot

Empezaremos con el estudio de los sensores más básicos: Los sensores binarios. Sólo pueden estar en dos estados diferentes, y nos aportan 1 bit de información: pulsado/no pulsado, detectado/no detectado, activado/no activado, ON/OFF, 0/1...

Haremos un viaje desde la generación de la información en la etapa física del sensor hasta la obtención de la señal de estado. Una señal digital pura y perfecta, que nos indica en qué estado se encuentra el sensor binario

Para que nuestro viaje sea más concreto, utilizaremos como ejemplo un sensor muy básico: El pulsador. Muchos de los sensores binarios se basan en el mismo principio de funcionamiento que el pulsador, y por tanto se aplica el mismo procesamiento

Ejemplos de sensores binarios

Algunos ejemplos de sensores binarios son:

Pulsadores

  • Estado: Pulsado/no pulsado
  • Principio de funcionamiento: Contacto entre dos partes conductoras (metales). Los electrones pasan de una parte a otra cuando se aplica un campo eléctrico, si las partes están en conexión. Es un sensor mecánico

Este principio de funcionamiento se utiliza en muchos otros sensores binarios

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. Los típicos son los que tiene 3 patas y dos posiciones estables:

La forma y tamaño de los interruptores varía mucho. En esta foto se muestran 3 tipos diferentes de micro-interruptores

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 los robots móviles se suelen colocar en el perímetro del robot para detectar cuándo se ha contactado con un objeto exterior

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)

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

Sensor magnético

Los sensores magnéticos detectan la presencia de un campo magnético. Hay de varios tipos

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)

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

Etapas de procesamiento

En esta animación se muestra el funcionamiento simplificado del sensor binario que usaremos de ejemplo: Un pulsador. Tras el procesamiento preliminar se obtiene su señal de estado: 0 para indicar pulsador no apretado, y 1 si está pulsado

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

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

Generación de eventos

Las señales de estados contienen la información del sensor. A partir de ellas generamos los eventos que nos indican que ha ocurrido algo: cambio del sensor de 0 a 1 (Flanco de subida), cambio del sensor de 1 a 0 (Flanco de bajada), activacion del sensor superior a un cierto umbral de tiempo, etc...

Estos circuitos de generación de eventos ya no dependen del sensor en cuestión. La señal de estado condensa la información del sensor, y hace abstraccion de todos sus detalles. Por ello, estos circuitos de procesamiento nos valen para cualquier sensor binario o cualquier otra señal binaria

Las dos circuitos de procesamiento más básicos son los de detección de los flancos, que se encuentran en la coleccion icesignal

Etapa 0 (física)

Comenzamos nuestro viaje desde el principio: por la etapa física. Utilizaremos como ejemplo un pulsador. Como ya habíamos visto, los pulsadores están formados por dos partes metálicas que entran en contacto. La parte móvil es sobre la que ejercemos la fuerza y dispone de un muelle para volver a su posición original una vez dejamos de apretarlo, separando los contactos

Micro-pulsadores

Los pulsadores más básicos son los micropulsadores, que los podemos colocar sobre una protoboard

O bien soldar sobre circuitos impresos (PCBs). Comerciales o construidos por nosotroos

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

A los micropulsadores se les puede acoplar un capuchón para hacer más fácil la pulsación del botón. Este es el PCB OBPushButton de ElecFreaks

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. En vez de un muelle para recuperar la posición original, se usa una cubierta de goma, que se deforma al pulsarse y recupera la forma al dejar de apretar

Teclas

Las teclas de los ordenadores son pulsadores. Hay varias implementaciones. La más típica es utilizando membranas de silicona

Cada tecla es un simple contacto que se cierra al presionar sobre él. Está implementado mediante 4 capas

Empezando por la parte inferior, las capas son:

  • Capa 1: PCB flexible, transparente. Contiene el contacto inferior (Determina el número de columna)
  • Capa 2: Acetato. Capa no conductora, que tiene agujeros en las zonas de los contactos
  • Capa 3: PCB Flexible, transparente. Contiene el contacto inferior (Número de fila)
  • Capa 4: Silicona flexible. Tiene partes planas y partes salientes en las zonas de los contactos. Estos tetones flexibles están huecos en el interior, y se deforman al pulsarse. Luego recuperan la forma original
  • Capa 5: Es el chásis del teclado, de plástico rígido
  • Capa 6: Teclas móviles, que pueden subir y bajar. Estan apoyadas sobre la silicona flexible

En este dibujo se muestra la sección cuando la tecla no está pulsada, y lo que ocurre cuándo se pulsa: El tetón de silicona se deforma y ejerce presión sobre el contacto superior del PCB flexible empujándolo a traváes del agujero del acetato hasta tocar con el contacto inferior

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

Pulsador casero

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

Por ejemplo utilizando como elementos metálicos dos cables que unimos y separamos manualmente

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)

Este es otro tipo de pulsador casero: 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

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

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

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

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

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

El bloque Sync

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

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. 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

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

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

(01-debouncer-counter.ice)

La señal input se saca también por el pin D0 para medirla con un analizador lógico externo

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

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

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

(02-debouncer-counter-2.ice)

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

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

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

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

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

(03-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: 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

(04-button-x1-direct.ice)

¡A Practicar!

Reto 1: Detector IR sonoro

Diseña un circuito que emita un pitido cuando el sensor IR detecte el color negro, y que se apague cuando detecte blanco

Reto 2: Encoder con IR

Diseña un circuito que cuente el número de veces que se interrumpte el haz de infrarrojos. Haz que cada vez que se interrumpa se emita un pitido en el zumbador

Una vez que tengas el circuito funciona prueba a usar un spiner para interrumpir el haz, y que funcione como un enconder

Autor

Licencia

Créditos

Enlaces

Clone this wiki locally