# ############################################################################
# ** Proyecto : torreta 8 leds controlada por CI-74hc595
# ** Plataforma : ESP32 / WROOM
# ** Herramienta : https://www.wokwi.com
# ** : Thonny aplicacion de escritorio descargar en www.thonny.org
# ** Compilador : wokwi Simulador online
# ** Version : 1.0
# ** Fecha/Hora : 26-02-2025, 2:35 1m ,
# ** Descripción :
# ** Este programa prende una torre de 8 leds utilizando el
# ** circuito integrado 74HC595.
# **
# ** Versión : 1.1
# ** Revisión : A
# ** Release : 0
# ** Bugs & Fixes :
# ** Date : 26/02/2025
# **
# ** By : Jorge Anzaldo
# ** contact : [email protected]
# ** twitter x : @janzaldob
# #############################################################################
# ::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
# : Librerias / Bibliotecas / Modulos | :
# ::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
from machine import Pin
import time
# +-------------------------------------------------------------------------------
# | V A R I A B L E S / O B J E T O S - G L O B A L E S |
# +-------------------------------------------------------------------------------
# +-------------------------------------------------------------------------------
# | DEFINICION Y DESARROLLO DE CLASES O FUNCIONE DE PROGRAMADOR |
# +-------------------------------------------------------------------------------
# clas Torreta con CI-74HC595
class Torreta74hc595:
def __init__(self,pinSER, pinRCKL, pinSRCLK):
self._ser = Pin(pinSER, Pin.OUT) # Pin de datos (SER) 23
self._rckl = Pin(pinRCKL, Pin.OUT) # Pin de latch (RCLK) 5
self._srclk = Pin(pinSRCLK, Pin.OUT) # Pin de reloj de desplazamiento (SRCLK) 18
# metodo para enviar un bit a través del 74HC595
def _desplazamiento(self,data): #shift_out
for i in range(8):
# Enviar el bit más significativo (del primer bit de datos)
self._ser.value((data >> (7 - i)) & 1)
# Pulsar el reloj de desplazamiento para mover los datos
self._srclk.value(1)
time.sleep_us(1) # Espera breve
self._srclk.value(0)
# metodo para actualizar los LEDs
def _actualizar(self,estado):
# Estado es un número de 8 bits donde cada bit representa un LED
# 0b11111111 enciende 8 LEDs
# 0b00000000 apagar 8LEDS
# Primero, poner el latch en bajo para preparar el registro
self._rckl.value(0)
self._desplazamiento(estado) # Enviar los datos (estado de los LEDs)
# Luego, poner el latch en alto para almacenar los datos y actualizarlos
self._rckl.value(1)
# metodo prender toda la torreta
def prender(self,tiempoEspera):
self._actualizar(0b11111111)
time.sleep(tiempoEspera)
# metodo apagar toda la torreta
def apagar(self,tiempoEspera):
self._actualizar(0b00000000)
time.sleep(tiempoEspera)
# metodo prender la torreta de Izquierda a Derecha
def prendeIzquierdaDerecha(self,tiempoEspera):
for i in range(8):
# Encender solo el LED correspondiente (de izquierda a derecha)
self._actualizar(1 << i) # 1 << i mueve un bit a la posición correspondiente
time.sleep(0.1) # Espera 0.5 segundos entre cada LED encendido
# Apagar todos los LEDs al final
self._actualizar(0b0000000)
time.sleep(tiempoEspera)
# metodo prender la torreta de Derecha a Izquierda
def prendeDerechaIzquierda(self,tiempoEspera):
for i in range(7, -1, -1):
# Encender solo el LED correspondiente (de izquierda a derecha)
self._actualizar(1 << i) # 1 << i mueve un bit a la posición correspondiente
time.sleep(0.1) # Espera 0.5 segundos entre cada LED encendido
# Apagar todos los LEDs al final
self._actualizar(0b0000000)
time.sleep(tiempoEspera)
def __del__():
pass
# ===============================================================================
# || ||
# || P R O G R A M A / F U N C I O N P R I N C I P A L ||
# || ||
# ===============================================================================
if __name__ == "__main__":
torreta1=Torreta74hc595(23,5,18) #argumento par pinSER, pinRCKL, pinSRCLK
torreta2=Torreta74hc595(13,15,14)
while True:
# Prender los 8 LEDs (0b11111111)
torreta1.prender(0)
torreta2.prender(.5)
# Apagar todos los LEDs (0b00000000)
torreta1.apagar(0)
torreta2.apagar(.5)
# Prender los LEDs uno por uno de derecha a Izquierda
torreta1.prendeIzquierdaDerecha(0.1)
torreta2.prendeIzquierdaDerecha(0.1)
# Prender los LEDs uno por uno de derecha a Izquierda
torreta2.prendeDerechaIzquierda(0.1)
torreta1.prendeDerechaIzquierda(0.1)
# ********************************************************************************
#
# R E F E R E N C I A S / C O M E N T A R I O S
#
# ********************************************************************************
'''
El 74HC595 es un registro de desplazamiento de 8 bits con salida en paralelo, ampliamente utilizado para expandir la cantidad de pines de salida en microcontroladores o sistemas embebidos.
Diagrama de conexiones ESP32 : https://docs.sunfounder.com/projects/esp32-starter-kit/es/latest/_images/esp32_pinout.jpg
Diagrama de conexiones 74HC595 : https://programarfacil.com/wp-content/uploads/2016/02/74HC595.jpg
Características principales:
Tipo: Registro de desplazamiento con salida en paralelo.
Número de salidas: 8 (Q0 - Q7).
Entradas principales:
DS (Data, Pin 14): Entrada de datos en serie.
SHCP (Shift Clock, Pin 11): Reloj de desplazamiento de bits.
STCP (Storage Clock, Pin 12): Reloj de almacenamiento que actualiza las salidas.
OE (Output Enable, Pin 13): Habilita o deshabilita las salidas (activo en bajo).
MR (Master Reset, Pin 10): Reinicia el registro de desplazamiento (activo en bajo).
Expansión en cascada: Se pueden conectar varios en serie para ampliar las salidas.
Tecnología: CMOS de alta velocidad.
¿Para qué sirve?
El 74HC595 se usa principalmente para ahorrar pines de salida en microcontroladores, permitiendo controlar 8 LEDs, motores, displays de 7 segmentos, o relés con solo 3 pines del microcontrolador.
Cómo funciona?
Se envían los datos en serie al registro de desplazamiento (DS) sincronizados con el pulso de reloj (SHCP).
Cuando se completan los 8 bits, se activa STCP para actualizar las salidas en paralelo.
Los datos se mantienen en las salidas hasta que se actualicen nuevamente.
--------------
(data >> (7 - i)) & 1
sirve para extraer un bit específico de un número binario (como data),
desplazándolo y aplicando una máscara (& 1).
data >> (7 - i) :
El operador >> (desplazamiento a la derecha) mueve los bits 7 - i posiciones a la derecha.
Esto coloca el bit de interés en la posición menos significativa (bit 0).
& 1 :
Se usa para obtener solo el bit menos significativo (LSB, Least Significant Bit).
Si el bit en la posición 7 - i era 1, el resultado será 1, de lo contrario será 0.
'''