Aplicación del 74HC595 para Arduino.
INTRODUCCIÓN.
Hace unos días (vaya, han pasado 27 días) decidí realizar un trabajo que muestra como poner un voltímetro en una fuente de alimentación utilizando una pantalla LCD numérica como la HD44780. Cuando terminé el artículo, me di cuenta que quizás el costo no era el adecuado, así que, pensé en utilizar un pequeño micro de ATmel. He estado evaluando cual utilizar si un Attny45, un 85 la diferencia más llamativa es la memoria 4K y 8K de uno y otro con 8 pines o los Attny44/84 con 14 pines.
Como he dicho estuve tentado de utilizar un Attiny 45, de pronto me di cuenta que necesitaría un número de pines que éste micro no dispone, tenía que apuntar en otra dirección, así que, comencé por pensar en cuantos pines necesitaría en el proyecto, esto me llevaría a decidirme por las mejores posibilidades y llegar a una conclusión, decidí trazar un esquema de partida y modificarlo si fuera el caso.
Después de haber escrito el mencionado artículo para el control de la pantalla LCD, pensé: Sería bueno tener una pequeña placa de circuito que se conecte en la parte posterior de la pantalla LCD, de modo que no tenga que utilizar un gran espacio para mi proyecto, así que, empecemos. Unas posibles soluciones a tener en cuenta es, utilizar los registros de desplazamiento, entre los que podemos destacar los conocidos 74HC164 o el 74HC595.
En este artículo realizaré una interfase para controlar un LCD con el Shift Register 74HC595 con sólo tres registros de un microcontrolador de la serie ATtiny. Primero he probado que funciona utilizando los pines de Datos, Latch y Clock procedentes de Arduino, lo que se puede ver en las imágenes que se adjuntan, luego voy a implementar el mismo código en un Attiny85, ya que dispone de 8K de memoria. Así que empiece la sesión.
El siguiente es un esquema de bloques del contenido de un 74HC595, información que usted puede encontrar en las hojas de datos del mismo.
Como parece bastante explícito, considero innecesario entrar en más detalles.
EL ESQUEMA.
Voy a utilizar un esquema sencillo que he modificado para mejorar un detalle, que puede ser inadvertido, pero es de peso relativo.
Este esquema es más sencillo de leer. Estos son los componentes que necesitamos:
- 1 – Zócalo DIL de 16 pines.
- 1 – Terminal de 16 pines hembra.
- 1 – Terminal de 6 pines hembra
- 1 – Transistor NPN BC547
- 1 – Condensador Electrolítico 100uf/16V
- 1 – Circuito integrado 74HC595
- 1 – LCD HD44780 de 16×2 o 20×4
- 1 – Potenciómetro de 10k
- 1 – Pedazo de placa (de 17 tiras x 16 agujeros) de tiras perforadas (ver imágenes).
- Y varios hilos para puentes.
Estas son las imágenes de los pasos importantes realizados para crear la tarjeta pcb del adaptador para la LCD.
Fig. 4
Este es el boceto con el voy a probar su idoneidad, ya que del resultado depende que lo aplique en el proyecto que estoy preparando.
PRUEBA CON UN 74HC595 Y LCD
Código de ejemplo para visualizar valores en un LCD con 3 hilos.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 |
/* * lcd_tres_hilos.pde * Interface para HD44780 LCDs via 74HC595 3-pin Arduino * by Rowan Simms code@rowansimms.com * License: Creative Commons - Attribution. * Full Documentation and Description: * http://rowansimms.com/article.php/lcd-hookup-in-seconds * * Este boceto Arduinos permite utilizar un registro de desplazamiento para * controlar un LCD, lo que permite una reducción de pines de 6 a 3 mientras * que todavía conserva el control total incluida la retroiluminación on/off. * Esto requiere el uso de la biblioteca LiquidCrystal595 * disponibles en: http://code.google.com/p/arduino-lcd-3pin/ * */ #include // incluye la libreria LiquidCrystal595 lcd(9,8,7); // pines data, latch, clock void setup() { lcd.begin(20,4); // 20 caracteres, 4 cols. lcd.clear(); lcd.setCursor(0,0); lcd.print("Wow con solo 3 pines"); lcd.setCursor(6,1); lcd.print("¡Fabuloso!"); lcd.setCursor(3,3); lcd.print("hispavila.com"); } void loop() { // no usedo. } |
En la foto anterior, se muestran los 3 hilos en las salidas digitales de Arduino y la alimentación en la parte inferior. Después de las primeras pruebas y viendo los resultados obtenidos, parece que este sistema me permite utilizarlo en mi proyecto ya que ciertos Attiny’s no contemplan el I2C, motivo por el cual no he optado por el I2C-Bus. Este boceto toma 2Kbytes, claro que no tiene nada. Ahora voy a probarlo más a fondo, voy a utilizar el boceto del voltímetro y así podré hacerme una idea más real de como se comporta.
PRUEBA DEL 74HC595 Y LCD PARA EL VOLTÍMETRO.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 |
/* voltimetroSRegister.ino Probando este boceto con el Shift Register 74HC595. 2015.11.08 18:21 En prueba 2015.11.08 18:27 Funciona bien. Sólo tiene que conectar mediante un divisor de tensión A0 hasta el elemento positivo y GND al lado negitivo. http://hispavila.com Upload this code to your arduino: El circuito: * LCD RS pin to digital pin 2 * LCD Enable pin to digital pin 6 * LCD D4 pin to digital pin 17 * LCD D5 pin to digital pin 16 * LCD D6 pin to digital pin 15 * LCD D7 pin to digital pin 14 * LCD R/W pin to ground * * Tamaño binario del Sketch: 5.232 bytes * * La prueba ha concluido bien y el boceto consume 5.048 byte, * lo que consume menos */ // include the library code: #include // incluye la libreria // initializamos la librería con los de pines de la interface LiquidCrystal595 lcd(9,8,7); // pines data, latch, clock #define NUMREADINGS 20 //10 los valores para leer float inputPin = A0; // pin analogico A0 = pin 12 del ATtiny2313 float vcc = 4.98; // valor real de la alimentacion de Arduino, Vcc int val = 0; float r1 = 1000000; // 1M float float r2 = 100000; // 100K float int readings[NUMREADINGS]; //Las lecturas de la entrada analógica int int index = 0; //Indice de la lectura actual int int total = 0; //Total lectura int int average = 0; //Media int void setup() { lcd.begin(20, 4); pinMode (inputPin, INPUT); //pinMode (miliam, INPUT); digitalWrite(inputPin, LOW); //digitalWrite(miliam, LOW); lcd.setCursor(2, 0); // lcd.print("Voltimetro"); lcd.setCursor(0,1); lcd.print("11-2015 - hispavila"); lcd.setCursor(0,2); lcd.print("Voltimetro v02"); delay(2500); lcd.clear(); } // factor de división = tensión max. de entrada ÷ tensión de salida (para A0) // Por ejemplo, si la primera o la entrada de voltaje maximo es 55V y la // segunda o la salida de voltaje es 4.96V, entonces el factor de división es: // 55V ÷ 4.96 = 11.08; factor = 11.08 void loop() { total -= readings[index]; //Resta la última lectura readings[index] = analogRead(inputPin); //Lee los valores de A0 y las guarda en la matriz total += readings[index]; //Añade la lectura a total index ++; //Incrementa el índice if (index >= NUMREADINGS) index = 0; //Al final de la matriz se restablecerá el índice a 0 average = total / NUMREADINGS; //Calcula la media lcd.setCursor(0,0); //Col 0, Row 0 lcd.print("Voltimetro "); //Change the name here. lcd.print((int)(vcc / (r2 / (r1 + r2)))); lcd.print(" V max."); lcd.setCursor(0,2); //Col 0, Row 1 lcd.print("Voltios: "); //Unit goes here. lcd.setCursor(9,2); //Col 9, Row 1 // lectura analogica por factor / media por bit lcd.print(analogRead(inputPin)*11.0123/204.607); delay(1500); //Slows down update rate, so you can see it. } |
Sin lugar a dudas que me decido por el sistema de registros de desplazamiento con el 74HC595. Las pruebas que he realizado me llevan a la conclusión de emplear este para el voltímetro, ahora, he de buscar el Attiny más pequeño y suficientemente capaz de soportar el boceto adaptado de Arduino. Dicho micro necesita una capacidad de 8K bytes, mínimo dos registros analógicos para las entradas de tensión y corriente y si tiene más opciones, mejor.
Como ya hemos visto, he reducido el número de pines para controlar el LCD con el 74HC595, es hora de elegir un micro de la serie Attiny adecuado. En un principio no todos estos «pequeños», pensé en utilizar un Attiny2313 dispone de 15 puertos de E/S. Creí que me serviría y comencé a trazar el esquema, de pronto reparé en que no dispone de puertos ADC, ya que los PA0-PA2 son el Reset, XTAL1 y XTAL2 que, si los quiero utilizar como ADC, me complicarían el código y considero que no es lo mejor. Así que desestimo el Attiny2313.
Después de varios intentos me he decidido por el ATtiny84, con 8K de memoria y el puerto analógico completo PA0-PA7, entre otras posibilidades como se puede apreciar en la imagen que sigue:
En principio este dispositivo ATtiny84 puede ser la respuesta a nuestro esfuerzo para crear una aplicación de utilidad en nuestro laboratorio.
Fig. 9
Hemos llegado al punto de tener que programar un micro de la serie Attiny y ese será el desafío siguiente. En un próximo artículo abordaremos los pasos a seguir para crear un programador utilizando como herramienta nuestro habitual Arduino. Espero que sea pronto, imagino que algunos estaréis ilusionados por ver el proyecto terminado.
Quizás en otra tutoría, abordemos como hacer este mismo adaptador con el registro de desplazamiento 74CH164, que se utilizó mucho en los años 80.
Excelente gracias por la aportacion muy bueno felicitaciones buen trabajo
Gracias por tus palabras Juan