Welcome to IDI Electronica!!!



Welcome!!! IDI Electronica is a blog for my personal projects and articles to help electronics enthusiasts like me.

Bienvenidos!!! IDI Electronica es un blog con mis proyectos personales y artículos con el fin de ayudar a entusiastas de la electrónica como yo.

Sunday, August 10, 2014

¿Qué es la Histéresis?

Si tienes experiencia trabajando con diseños digitales, seguramente has escuchado la palabra histéresis. Lo más probable, es que hayas buscado la palabra en la internet y la explicación te haya confundido más. Esto se debe a que el término es usado no sólo en electrónica, sino también en mecánica, física, y economía, entre otros.

Para entender el concepto de histéresis, comencemos hablando sobre la lógica digital. Los circuitos digitales utilizan un sistema binario basado en voltajes altos y bajos para representar 1's y 0's. Normalmente, el valor de estos voltajes es definido por estándares. Por ejemplo, la lógica TTL define altos y bajos como +5V y 0V. Debido a esta definición, muchos asumen que las señales son exclusivamente altos o bajos (como en la figura 1).



Fig 1. Señales cuadradas representando 1's y 0's.


En realidad, las señales toman tiempo para transicionar de un nivel a otro. Dependiendo del diseño del circuito, éstas señales pueden sobrepasarse, demorar en transicionar, oscilar o ser afectadas por ruido eléctrico. La figura 2 muestra una transición de 0 a 1, donde vemos a la señal sobrepasándose por casi 40% y luego oscilando.


Fig 2. Escalón unitario mostrando sobrepaso y oscilación.


Los circuitos digitales normalmente usan una barrera para decidir si la señal es alta o baja. Si el voltaje de la señal de entrada es mayor a esta barrera (llamada threshold en inglés), la señal de salida es 1. Si es menor, la señal de salida es 0. Sin embargo, cuando una señal de entrada es afectada por oscilaciones o ruido eléctrico, esta misma puede cruzar la barrera múltiples veces y la señal de salida termina mostrando varias transiciones entre altos y bajos (figura 3).



Fig 3. Señales digitales mostrando varias transiciones por ruido eléctrico


Entonces, ¿qué es la histeresis? Histéresis es una región creada alrededor de una barrera lógica en la cual cambios de la señal de entrada no tienen ningún efecto en la señal de salida (figura 4). Básicamente, esta propiedad crea 2 barreras separadas para cambiar de alto a bajo, y viceversa.

Vale la pena mencionar que si no prestamos atención, podemos encontrar problemas sincronizando diferentes señales debido a que la señal de entrada puede tardar mucho tiempo en cruzar la histéresis.



Fig 4. Barrera digital rodeada por banda de histéresis


Una aplicación de histerésis puede ser observada en la lógica TTL. La señal de salida sólo cambia a 1 si la señal de entrada tiene voltaje de 2V a 5V. En caso de haber ruido eléctrico u oscilaciones, la señal de salida no cambiaría de alto a bajo a menos que la señal de entrada sea menor a 800mV, o que el ruido sea tan alto que llegue a cruzar estas barreras.



Fig 5. TTL signal levels



Saturday, August 9, 2014

[ES] Interfaz entre Módulo de LCD SainSmart de 20x4 con Arduino Uno

Este es un proyecto simple diseñado para crear interfaz entre el módulo de LCD SainSmart de 20x4 (20 caracteres, 4 líneas). Yo compre mi módulo de LCD en Amazon, ofrecido como SainSmart LCD Module For Arduino 20 X 4, PCB Board, White On Blue.

Basándome en las opiniones de los usuarios, el módulo puede venir en dos versiones dependiendo del vendedor (Amazon distribuye productos para diferentes vendedores). La diferencia de las versiones es que el módulo puede incluir, o no, el adaptador de comunicaciones I2C. Yo compré mi módulo a la tienda BeesClover e incluyó el adaptador de I2C. Algunos usuarios también han recibido el producto sin la hoja de datos (datasheet), la cual incluye la dirección del módulo de I2C. Este módulo tiene un precio módico comparado a otras tiendas. Sobre todo, si tienes una suscripción con Amazon Prime, debido a que el costo de envío es casi la mitad que el precio del producto.



Fig 1. Módulo de LCD SainSmart- Frente


Fig 2. Módulo de LCD SainSmart-Reverso


Fig 3. Adaptador de I2C. El interruptor rotativo controla el contraste.



Estas instrucciones están diseñadas para el módulo de LCD con el adaptador de I2C:

1. Hacer una búsqueda en línea de la librería de Arduino LiquidCrystal_V1.2.1.zip y descargar. El archivo fue creado por F. Malpartida y modifica la librería original de Arduino para LCD, haciéndola compatible con módulos Hitachi HD44780 y de similar arquitectura.

2. Reemplazar la librería de Arduino original LiquidCrystal  con la librería en el archivo descargado. Para abrir el archivo ZIP puedes descargar el programa 7z.

3. Conectar los pines del adaptador de I2C al Arduino Uno, conectando los pines de 5V y GND respectivamente, de SDA (data) al pin A4 y de SCL (reloj) al pin A5.

Nota: Los pines varían para otras placas de Arduíno. Para el Mega2560, usar pines 20, 21; para el Leonardo, pines 2, 3; para el Due, pines 20, 21, SDA1, SCL1.

4. Buscar la dirección del adaptador de I2C en la hoja de data. La dirección en mi módulo es 0x27. Sino, usar la librería  I2cScanner para identificar la dirección en tu adaptador.

5. Compilar y cargar el siguiente código al Arduino. La pantalla debe de mostrar "Hello World" en cada una de las 4 líneas y parpadear cada segundo. Asegurarse que la dirección junto a la línea #define I2C_ADDR es la misma que en la hoja de data.

#include <Wire.h>                // Carga librería de interfaz I2C


#include <LiquidCrystal_I2C.h>   // Carga librería de I2C para LCDs

#define I2C_ADDR 0x27    // Configurar dirección de I2C


//Define pines en controlador de LCD usando I2C. No cambiar.
#define BACKLIGHT_PIN 3 
#define En_pin 2
#define Rw_pin 1
#define Rs_pin 0
#define D4_pin 4
#define D5_pin 5
#define D6_pin 6
#define D7_pin 7

LiquidCrystal_I2C lcd(I2C_ADDR,En_pin,Rw_pin,Rs_pin,D4_pin, D5_pin,D6_pin,D7_pin);

void setup()
{
lcd.begin (20,4,LCD_5x8DOTS);    //Define tipo de pantalla LCD
lcd.setBacklightPin(BACKLIGHT_PIN,POSITIVE);
}


// Start LCD display loop
void loop()                 
{
lcd.setBacklight(HIGH);      // Enciende luz de fondo en LCD
lcd.clear();                 // Borra caracteres en LCD
lcd.print("HELLO WORLD 1       "); // Escribe en líneas 1 a 4
lcd.print("HELLO WORLD 2       ");
lcd.print("HELLO WORLD 3       ");
lcd.print("HELLO WORLD 4       ");
delay(1000);                 // Espera 1000 ms (1 sec)
lcd.clear();                 // Borra caracteres    
lcd.setBacklight(LOW);       // Apaga luz de fondo
delay(1000);                 // Espera 1000 ms (1 sec)
}

Nota: El archivo con este código se puede descargar de mi repositorio https://github.com/sphanlung/Arduino bajo el nombre SainsmartLCD-ES.ino


 Fig 4. Interfaz de Arduino Uno con LCD

Fig 5. LCD mostrando Hello World



Fig 6. Hoja de data - Página 1



Fig 7. Hoja de data - Página 2