UNIVERSIDAD NACIONAL DE AVELLANEDA
CARRERA: INGENIERÍA EN INFORMÁTICA
MATERIA: CIRCUITOS Y MEDICIONES ELECTRONICAS
2º Cuatrimestre 2015
(Comisión: Turno Noche)
TRABAJO PRÁCTICO FINAL
Datos de los integrantes:
Apellido y Nombres E-mails
1. Walter Mihaljevic wal.gnr94@[Link]
2. Alexis Ferri ferrialexis@[Link]
3. Alejandro Fernández arfnuevo@[Link]
Profesor: Federico D´Angiolo
Fecha de Presentación: 11/12/2015
Evaluación: Firma del Docente:
Observaciones:
Introducción y principio básico de funcionamiento:
El proyecto original que nuestro grupo ha seleccionado para su realización en clases es un cubo
de LEDS de 3x3x3 controlado por Arduino en forma directa, tal cual se puede apreciar en la
siguiente figura (este proyecto fue modificado como se verá en la próxima página)
Como se puede observar en la figura superior, cualquier nivel alto en las salidas digitales 1 a 9
se intercepta con cualquiera de las masas controladas por los tres transistores, esto brinda un
control independiente de cada led, para activar por ejemplo el led del nivel superior ubicado en
la esquina superior derecha, basta con darle un nivel alto a la salida 7 junto con un nivel alto a
la base del transistor conectado al tercer nivel.
Incorporación de un desplazador (Shift Register)
Pero como no es suficiente con este nivel de control básico visto en la figura anterior, debido a
que no involucra muchos de los temas pertenecientes a la segunda parte de la materia, se
decidió incorporar un chip desplazador (Shift register), unificando además todas las resistencias
que controlan todos los positivos como una sola resistencia en la alimentación del desplazador.
El Desplazador utilizado en nuestro caso es el M74HC164
Como se puede apreciar, este chip nos presenta un único inconveniente a la hora de conectarlo
al cubo, solo puede manejar 8 salidas, y cada nivel del cubo tiene 9 leds, por lo tanto decidimos
que lo mejor sería controlar 8 leds por nivel (24) con el shift register, y los últimos 3 con una
salida extra digital del Arduino, con lo que conseguimos implementar un tema de la segunda
parte de la materia.
Funcionamiento básico del Shift Register:
La arquitectura de este circuito integrado está basada en la utilización de flip-flops, tomando
datos binarios en las entradas, que con un AND configuran una única señal de entrada y que
luego esta ingresa en un primer flip flop junto con la señal del clock, dando una salida que luego
será utilizada por el flip flop siguiente y así sucesivamente hasta el último, desplazando la forma
de la señal de entrada según el clock.
En esta imagen se puede ver el encadenamiento de los flip flops:
En la siguiente imagen se puede ver lo que ocurre con las señales en cada salida, como se puede
ver es común utilizar la entrada B en nivel alto para que solo cuente lo que pasa en A, es decir
que mientras la señal B y el Clear se encuentren a alto nivel, ocurrirá un desplazamiento de la
señal A en las distintas salidas, tomando en cada flip flop el clock como segunda entrada,
causando que los leds se enciendan en secuencia.
Conexionado del shift register:
Pines 9,2 y 14: Compartidos con HIGH, en nuestro caso conectamos la señal clear (pin 9), la señal
B (pin 2) y VCC (pin 14) a 5 volts (con un HIGH en la salida digital de Arduino) ya que solo nos
interesa el desplazamiento de la señal de entrada A.
Pines 3 a 13: Van conectados sin resistencia cada uno de los positivos de los leds, siendo 3
positivos por salida, correspondientes a los 3 niveles, estos como se dijo antes serán luego
intercambiados según la conexión a masa, que es conmutada por transistores, para controlar
los niveles que actúan de forma independiente. No se utilizó resistencia en este punto ya que la
misma fue conectada a la entrada de la señal A (pin 1), todos los leds comparten la misma
resistencia (Aunque funcional, esto fue un error, ver explicación en siguiente punto).
Pin 1: es conectada al Arduino, quien varia en el tiempo la señal de HIGH a LOW para ocasionar
el desplazamiento, es interpuesta en el medio una resistencia. El problema es que como la
resistencia es compartida por todos los leds, no se puede hacer el cálculo exacto de la corriente
que circulará, pues nunca se sabe cuántos leds quedaran encendidos en forma simultánea en
cada caso, entonces lo que ocurrirá es que en algunos casos los leds se enciendan con buena
intensidad, y en otros casos apenas sean visibles, lo hicimos así para evitar el uso excesivo de
resistencias, pero vale aclarar que no fue buena idea, lo mejor hubiera sido que cada led tenga
su propia resistencia, para limitar individualmente la corriente a unos 10mA que es lo que
necesita cada led para encenderse plenamente. Entonces a nivel global, la resistencia usada a
cada instante varía según los leds encendidos y es como debería ser.
Ventajas y desventajas del uso del Shift Register:
Ventaja principal: Permite conectar 8 canales en paralelo, utilizando en la práctica solo 2
entradas (El clock y la señal A, pues el clear y la señal B fueron fijadas en nivel alto), lo que
permite ahorrar salidas del Arduino, lo que se traduce en poder conectar mayor cantidad de
leds, en nuestro caso fueron necesarias solo 6 salidas digitales del Arduino para todo el proyecto,
2 para controlar el shift register, otras 3 para controlar los transistores que conmutan las masas
y la restante para la conexiones de los leds nº9 de cada nivel, los tres conectados por el positivo
a la salida digital del arduino, y por el negativo a cada una de las masas del nivel correspondiente.
Gran desventaja: Se pierde el manejo individual de los leds que teníamos sin el shift register, ya
que reaccionan en cadena, siguiendo un desplazamiento, no se puede encender solo uno y
dejarlo encendido sin que reaccionen los demás. Pero sí se puede controlar el tiempo en que
permanecerán encendidos y apagados. Lo que si podemos controlar en nuestro caso es en que
niveles ocurrirá el desplazamiento, ya que los transistores son controlados de forma
independiente, lo que permite hacer por ejemplo movimientos tipo gusano dentro del cubo.
Código fuente para Arduino:
#define data 2 //utilización de un alias para el pin 2
#define clockp 3 //utilización de un alias para el pin 3
void setup() { //initialization
pinMode(clockp, OUTPUT); //seteo del pin 2 como salida, se utilizará para clock
pinMode(data , OUTPUT); //pin 3 como salida, se utilizará para datos (8 leds por nivel)
pinMode(5,OUTPUT); //seteo del pin 5 como salida, para leds Nº9 de c/nivel
pinMode(10,OUTPUT); //seteo del pin 10 como salida (control transistor nivel 1)
pinMode(11,OUTPUT); //seteo del pin 11 como salida (control transistor nivel 2)
pinMode(12,OUTPUT); //seteo del pin 12 como salida (control transistor nivel 2)
void loop() { //loop
shiftOut(data, clockp, MSBFIRST,random(0,255)); //aleatorio del data y secuencial del Clk
digitalWrite(5,random(0,2)); //aleatorio del led Nº9 en cada nivel
delay(225); //retardo entre cambio de secuencia del data
digitalWrite(10,HIGH); // transistor de nivel 1 encendido
digitalWrite(11,HIGH); // transistor de nivel 2 encendido
digitalWrite(12,HIGH); // transistor de nivel 3 encendido