Ir al contenido principal

Entradas

Mostrando entradas de 2016

Interrupciones en MSP430

En el artículo anterior exploramos los mecanismos básicos de entrada/salida del microcontrolador MSP430. Para ello usábamos una técnica llamada polling o sondeo en la que explícitamente preguntábamos en cada instante el estado del pulsador para poder actuar en consecuencia. Esta técnica es sencilla y directa, pero tiene algún que otro inconveniente. Desde el punto de vista del programador, el código puede complicarse si tenemos que controlar varias señales de E/S y además el código suele ser propenso a errores si no tenemos cuidado. Por otro lado, desde el punto de vista del consumo energético es bastante ineficiente, ya que el micro se pasa todo el tiempo sumido en un bucle infinito preguntando por el estado del pulsador. Huelga decir que en un sistema autónomo alimentado con baterías puede hacer que nuestro diseño sea inviable. Para solventar esta situación se utilizan, entre otras técnicas, las interrupciones. El mecanismo de las interrupciones permite que los periféricos, t...

Gestión de entrada/salida en MSP430

Este es el primero de una serie de artículos dedicados al microcontrolador MSP430 de Texas Instrument. Este microcontrolador de 16 bits está especialmente pensado para aplicaciones embebidas en las que el costo y el consumo son elementos fundamentales. En realidad, se trata de toda una familia de microcontroladres en las que, dependiendo del modelo, encontraremos diferentes características y periféricos. En esta serie de artículos me voy a basar en el MSP430F5529 y concretamente en la placa de desarrollo que ofrece TI: MSP430F5529 LaunchPad. Puertos de entrada/salida del MSP430 Dependiendo del modelo concreto dispondremos de más o menos puertos de entrada/salida. En el MSP430F5529 disponemos de cuatro bloques de puertos denominados PA, PB, PC y PD. Cada uno de estos bloques dispone de dos puertos de ocho bits cada uno. Por ejemplo, PA tiene los puertos P1 y P2 con ocho pines cada uno. Algunos de estos puertos, además de funcionar como entrada/salida de propósito general, ...

Calabaza diabólica para Halloween con Arduino

Hoy os traigo un montaje muy apropiado para estas fechas. Una calabaza diabólica basada en Arduino que se activa por proximidad, habla y enciende sus ojos. Para detectar la proximidad de un individuo tenemos varias opciones. Yo he optado por un sensor de ultrasonidos HC-SR04. Quizá no sea lo más óptimo pero es lo que tenía más a mano. También necesitaremos un par de LEDs con sus respectivas resistencias de 1K y un pequeño altavoz o speaker (cuidado, no lo he probado, pero me temo que con un piezoeléctrico no funcione bien). La idea es que cuando alguien se acerque a la calabaza, emita un sonido digitalizado y encienda sus dos ojos (LEDs). Éste es el circuito. El altavoz se conecta a tierra y al pin 11, el sensor de ultrasonidos a los pines 9 y 10 (además de a VCC y GND), y finalmente, he usado los pines 2 y 3 para controlar el encendido de los LEDs. La cosa queda así. Otro asunto es cómo meter todo en la calabaza. La mía, de plástico, era un poco pequeña y me ha costado ac...

Termómetro sentimental con DHT11 y MAX7219

Admitámoslo, los LEDs molan, y una matriz de LEDs de 8x8 mucho más. En esta ocasión os presento un pequeño proyecto donde volvemos a usar el sensor de temperatura/humedad DHT11 y, por supuesto, una matriz LED controlada por un MAX7219 . Se trata de un termómetro sentimental. Esto quiere decir que según la sensación térmica, la matriz mostrará una carita sonriente, normal o triste. Para el prototipo de este proyecto he usado un Arduino Nano montado sobre una protoboard. El conexionado completo de todo el sistema es el siguiente. No voy a volver a hablaros del funcionamiento del DHT11 porque ya lo vimos en un artículo anterior . Sin embargo, el MAX7219 sí es nuevo para nosotros. El MAX7219 es un chip que nos permite controlar de forma sencilla juegos de LEDs de varios tipos, como pueden ser de siete segmentos normales o matrices de LEDs como la que vamos a usar aquí. Lo bueno es que este chip nos permite encadenar elementos usando un bus SPI, de forma que podríamos controla...

Protocolo I2C y Arduino.

El protocolo I2C (Inter-integrated Circuit) es de uso común en multitud de dispositivos electrónicos y sensores. Permite la comunicación serie entre distintos elementos, por ejemplo, entre un microcontrolador y una pantalla LCD. Te preguntarás qué ventaja puede aportar I2C sobre un enlace serie normal (tipo RS-232 ). La primera diferencia es que I2C sigue un esquema maestro-esclavo en el que un maestro (por ejemplo, un microcontrolador) puede conectarse a múltiples esclavos (hasta un total de 1008 dispositivos). Otra diferencia es que, al contrario que RS-232, se trata de un protocolo síncrono, lo cuál simplifica bastante la circuitería y evita el uso de componentes adicionales como una UART . Existen alternativas como SPI ( Serial Peripheral Interface ) que permiten la interconexión de más de un dispositivo, sin embargo, cada dispositivo que se añade complica el conexionado, ya que, como se ve en el siguiente esquema, se necesita una señal SS (Slave Select) para seleccionar el di...

Placa de prototipado FPGA Cyclone IV EP4CE6

Existen en el mercado multitud de placas de entrenamiento FPGA. Ya hemos visto algunas en este blog, pero os quiero hablar de una que me ha llamado la atención por su enfoque diferente. Elegir una placa de entrenamiento a veces se complica, ya que no sólo hay que buscar una con la familia de FPGA que nos interesa, también hay que evaluar qué elementos periféricos trae consigo. ¿Necesitamos un display de siete segmentos? ¿botones? ¿salida VGA o entrada para teclado? La aproximación de Waveshare me ha resultado interesante, ya que lejos de incluir una serie de elementos periféricos a la FPGA, ha optado por un sistema totalmente modular, lo que tiene ciertas ventajas (y desventajas, claro). La idea es ofrecer una placa FPGA básica, a la que llaman core, con la FPGA que necesitemos (ya sea de Altera o XILINX). Esta placa core puede acoplarse a una placa de expansión con una buena cantidad de conectores. En la fotografía anterior hay una FPGA de la familia Cyclone IV de Altera ...

Pulsador antirebote en VHDL (debouncing)

El uso de actuadores mecánicos como los pulsadores, tiene muchas ventajas, sobre todo económicas, ya que son muy baratos. Sin embargo, precisamente por su naturaleza mecánica, vienen acompañados de ciertos problemas que dependiendo del uso que hagamos de ellos, pueden llegar a ser un verdadero quebradero de cabeza. El mayor de estos inconvenientes es el rebote o bouncing . Al ser accionados, los pulsadores tardan cierto tiempo en alcanzar un estado estable, es decir, que durante muy poco tiempo (del orden de los milisengundos) pueden cambiar entre el estado pulsado y no pulsado hasta que la señal se estabiliza. A pesar de ser muy poco tiempo, es el suficiente para que un sistema digital lo detecte como varias pulsaciones. La siguiente imagen muestra una señal de rebote típica. Hay varias aproximaciones para solucionar este problema, tanto hardware como software (si estamos trabajando con microcontroladores). En este artículo vamos a ver cómo atajar este problema desde el punto...

Reloj digital en VHDL

Si ya hemos hablado de cómo generar un reloj de 1 Hz y también hemos visto cómo controlar un display de siete segmentos con VHDL, el siguiente paso lógico es construir un circuito para un reloj digital de 24 horas. Sólo es cuestión de unir lo ya aprendido en los dos anteriores artículos y añadir algo de lógica de control. Vamos a construir un circuito descrito con VHDL que tiene una sola entrada llamada clk50mhz , que es la señal de reloj (de 50 Mhz en este caso) que va a comandar todo el sistema. Como salida hay dos buses, uno llamado display , que obviamente se encarga de iluminar los leds correspondientes de cada display de siete segmentos, y otra salida llamada cur_display que selecciona qué display, de los cuatro posibles, se ilumina en cada momento. El código es el siguiente. library IEEE; use IEEE.STD_LOGIC_1164.ALL; use IEEE.STD_LOGIC_UNSIGNED.ALL; entity digital_clock_top is port ( clk50mhz: in STD_LOGIC; display: out STD_LOGIC_VECTOR(7 downto 0); cur_displ...

Multiplexado de displays de siete segmentos con VHDL

Cuando un diseño utiliza más de un display de siete segmentos es interesante multiplexarlos para ahorrar en conexiones. Si no lo hacemos así, para controlar cuatro displays necesitaríamos 32 conexiones al microcontrolador si es que queremos manejar directamente los displays sin ningún integrado de por medio. Vamos ver cómo funciona este multiplexado y cómo se puede implementar en una FPGA usando VHDL. Existen dispositivos que empaquetan varios displays que son muy cómodos de usar. En este artículo, como ejemplo usaremos uno de cuatro displays. Sin embargo esta técnica puede usarse con varios displays sueltos. En el siguiente esquema se presenta la manera correcta de hacer las conexiones mediante transistores configurados en emisor común para funcionar como interruptores. Las entradas D0 a D3 permiten seleccionar qué display queremos activar en cada momento, mientras que las entradas A a G (y DP) permiten seleccionar qué leds se han de encender para mostrar e...

Divisor de frecuencia para reloj de 1Hz en VHDL

Los circuitos digitales, a no ser que sean asíncronos, van comandados por un reloj cuya frecuencia puede variar según el tipo de sistema digital del que se trate. Desde microprocesador 6502 que funcionaba con un reloj de 1Mhz hasta los actuales, que funcionan en el orden de los gigahercios, no han pasado ni cuatro décadas. En un sistema digital complejo es habitual que necesitemos obtener diferentes frecuencia de reloj para diferentes subsistemas. Un ejemplo muy claro puede ser el de un reloj digital que tiene que contar los segundos, por lo tanto, necesita un reloj de 1Hz (un pulso por segundo). En este artículo vamos a ver un ejemplo práctico de cómo obtener un reloj de 1Hz a partir de otro de 50Mhz en VHDL, y vamos a probarlo un una FPGA. La técnica usada para dividir la frecuencia de un reloj es usar biestables conectados en cascada. En la siguiente esquema se detalla el funcionamiento. Cada biestable divide la frecuencia a la mitad, así que la idea es ir acoplando biesta...

Placa de control para seis servos basada en Atmega328 (Arduino)

A la hora de diseñar un robot que utilice varios motores servo, nos encontramos con un problema: hay que alimentarlos y son bastante glotones. Un robot articulado normalmente necesitará al menos cuatro servos, lo cual es un problema ya que, dependiendo del tipo de servos, un Arduino podría no ser capaz de proporcionar la intensidad de corriente necesaria para manejarlos. Hay que alimentarlos aparte, lo que también es engorroso, ya que hay que andar distribuyendo cables de alimentación para cada motor. Hay varias soluciones comerciales, pero como es más divertido hacérselo uno mismo, os presento una placa basada en Atmega328 con seis conectores alimentados para servos. Sin más preámbulo, os muestro el esquema y comentamos sobre él. El circuito se ha diseñado para trabajar con 9V, y un 7805 , junto con el condensador electrolítico C4, se encarga de regular la tensión a 5V. La salida de 5V se distribuye a las patillas 7 y 20 del Atmega328, pero también a los seis conecto...