MicroPython driver for 74HC595 shift registers

Overview

MicroPython 74HC595

A MicroPython library for 74HC595 8-bit shift registers.

There's both an SPI version and a bit-bang version, each with a slightly different interface.

demo

SPI Version

You can use either HSPI or SPI. This version is significantly faster than the bit-bang version, but is limited to writing whole bytes of data.

SPI Example

Basic Usage

from machine import Pin, SPI
from sr_74hc595_spi import SR

spi = SPI(1, 100000)
rclk = Pin(5, Pin.OUT)

oe = Pin(33, Pin.OUT, value=0)    # low enables output
srclr = Pin(32, Pin.OUT, value=1) # pulsing low clears data

sr = SR(spi, rclk, 2) # chain of 2 shift registers

sr.pin(2,1)  # set pin 2 high of furthest shift register
sr.pin(2)    # read pin 2
sr.pin(2,0)  # set pin 2 low

sr.toggle(8) # toggle first pin of closest shift register

sr[0] = 0xff # set all pins high on furthest shift register
sr[1] = 240  # set half pins high on closest shift register
sr[1]        # read pins

oe.value(0)  # disable outputs
oe.value(1)  # enable outputs

# pulse to clear shift register memory
srclr.value(1)
srclr.value(0)

SPI Methods

Construct with a reference to spi and the rclk pin used for latching and an optional number of cascading shift registers.

Pins srclr and oe are optional. If you don't need to clear the outputs, connect srclr to vcc. If you don't need to disable the outputs, connect oe to gnd.

__init__(spi, rclk, len=1, srclr=None, oe=None)

Read the boolean value of a pin. First pin is index 0. If you are cascading shift registers, the first pin of the second shift register is index 8 and so on. Index 0-7 are the furthest away shift register from the serial data in.

pin(index)

Writes a boolean value to a pin. This updates the internal buffer of pin values then writes all of the values to each shift register in the chain.

pin(index, value, latch=True)

This toggles a single pin by index. Helper for reading a pin then writing the opposite value.

toggle(index, latch=True)

This lets you treat the class like a list, where each index represents a whole shift register. Returns an 8-bit value for the shift register by index, where lowest index is furthest away.

__getitem__(index)

Write an 8-bit value to a shift register at the given index.

__setitem__(index, value)

Private method for sending the entire internal buffer over SPI.

_write(latch=False)

Private method for pulsing the rclk pin, which latches the outputs from the shift register to the storage register and makes the outputs appear.

_latch()

Bit Bang Version

This version lets you have greater control over sending individual bits of data at the expense of the performance you get using SPI.

Bit Bang Example

Basic Usage

from machine import Pin
from sr_74hc595_bitbang import SR

ser = Pin(23, Pin.OUT)
rclk = Pin(5, Pin.OUT)
srclk = Pin(18, Pin.OUT)

# construct without optional pins
sr = SR(ser, srclk, rclk)

sr.clear()  # raises RuntimeError because you haven't provide srclr pin
sr.enable() # raises RuntimeError because you haven't provide oe pin

# reconstruct with all pins
oe = Pin(33, Pin.OUT, value=0)    # low enables output
srclr = Pin(32, Pin.OUT, value=1) # pulsing low clears data

sr = SR(ser, srclk, rclk, srclr, oe)

sr.bit(1)  # send high bit, do not latch yet
sr.bit(0)  # send low bit, do not latch yet
sr.latch() # latch outputs, outputs=0000_0010

sr.bit(1, 1) # send high bit and latch, outputs=0000_0101
sr.bit(0, 1) # send low bit and latch, outputs=0000_1010

sr.bits(0xff, 4) # send 4 lowest bits of 0xff (sends 0x0f), outputs=1010_1111

sr.clear(0) # clear the memory but don't latch yet
sr.latch()  # next latch shows the outputs have been reset

sr.bits(0b1010_1010, 8) # write some bits
sr.clear()  # clear the memory and latch, outputs have been reset

sr.enable()  # outputs enabled
sr.enable(0) # outputs disabled

Bit Bang Methods

Construct with references to each of the pins needed to write to the shift register(s).

Pins ser, srclk and rclk are required. Pins srclr and oe are optional. If you don't need to clear the outputs, connect srclr to vcc. If you don't need to disable the outputs, connect oe to gnd.

__init__(ser, srclk, rclk, srclr=None, oe=None)

Writes a single value and can optionally latch to make it visible.

bit(value, latch=False)

Write multiple (num_bits) values from the supplied value and optionally can latch.

bits(value, num_bits, latch=False)

Pulses the rclk pin to latch the outputs. Without this, all of the bits you have written are remain hidden.

latch()

Clears the shift register memory by pulsing the srclr pin. You will get a runtime error unless you have provided this pin on construct.

clear(latch=True)

Toggles the output of the shift register by toggling the output enable (oe) pin. You will get a runtime error unless you have provided this pin on construct.

enable(enabled=True)

Private method for pulsing the srclk pin, which tells the shift register to read the current state of the ser pin and copy it to the shift register memory.

_clock()

Chaining

You can connect multiple 74HC595 shift registers together to form a chain.

Connect each shift registers rclk, srclk, oe and srclr together. If you don't need to disable outputs, you can tie each oe to ground. If you don't need to clear any outputs, you can tie each srclr to vcc.

Your micro controller provides data to just the first shift registers ser pin.

The QH\`` output pin on the first shift register goes into the next shift register ser` pin and so on.

When clocking in data, the values appear on the closest shift register to the micro controller first, before overflowing into each chained shift register.

Parts

Connections

TinyPICO 74HC595
3V3 VCC
G GND
G (or a pin) OE
23 MOSI SER
18 SCK SRCLK
5 RCLK
3V3 (or a pin) SRCLR
Pin Name Description
OE Output Enable Active low. Drive high to disable outputs.
SER Serial Input Serial data sent LSB first.
RCLK Storage Register Clock Pulse to latch data to outputs.
SRCLK Shift Register Clock Serial input is read on rising edge.
SRCLR Shift Register Clear Active low. Drive high to clear contents.
QA-QH Outputs 8 output pins
QH` Serial Output Connect to the next 74HC595 SER pin

Links

License

Licensed under the MIT License.

Copyright (c) 2021 Mike Causer

Owner
Mike Causer
Mike Causer
PyTorch implementation of paper "MT-ORL: Multi-Task Occlusion Relationship Learning" (ICCV 2021)

MT-ORL: Multi-Task Occlusion Relationship Learning Official implementation of paper "MT-ORL: Multi-Task Occlusion Relationship Learning" (ICCV 2021) P

Panhe Feng 12 Oct 11, 2022
Home Assistant custom component to help ev-chargers stay below peak hourly energy levels.

Peaqev ev-charging Peaqev ev-charging is an attempt of charging an ev without breaching a preset monthly max-peak energy level. In order for this inte

Magnus Eldén 35 Dec 24, 2022
View your medication from Medisafe Cloud in Home Assistant

Medisafe View your medication from Medisafe Cloud in Home Assistant. This integration adds sensors for today's upcoming, taken, skipped, and missed do

Sam Steele 12 Dec 27, 2022
The PicoEMP is a low-cost Electromagnetic Fault Injection (EMFI) tool,

ChipSHOUTER-PicoEMP The PicoEMP is a low-cost Electromagnetic Fault Injection (EMFI) tool, designed specifically for self-study and hobbiest research.

NewAE Technology Inc. 312 Jan 07, 2023
An embedded application for toy-car controlling based on Raspberry Pi 3 Model B and AlphaBot2-Pi.

An embedded application for toy-car controlling based on Raspberry Pi 3 Model B and AlphaBot2-Pi. This is the source codes of my programming assignmen

StardustDL 4 Oct 19, 2022
Scripts for measuring and displaying thermal behavior on Voron 3D printers

Thermal Profiling Measuring gantry deflection and frame expansion This script runs a series of defined homing and probing routines designed to charact

Jon Sanders 30 Nov 27, 2022
Detic ros - A simple ROS wrapper for Detic instance segmentation using pre-trained dataset

Detic ros - A simple ROS wrapper for Detic instance segmentation using pre-trained dataset

Hirokazu Ishida 12 Nov 19, 2022
Raspberry Pi Spectrometer

PySpectrometer 2021-03-05 Raspberry Pi Spectrometer The PySpectrometer is a Python (OpenCV and Tkinter) implementation of an optical spectrometer. The

Les Wright 538 Jan 05, 2023
A Python program that makes it easy to manage modules on a CircuitPython device!

CircuitPython-Bundle-Manager-v2 A Python program that makes it easy to manage modules on a CircuitPython device! The CircuitPython Bundle Manager v2 i

Ckyiu 1 Dec 18, 2021
An open source operating system designed primarily for the Raspberry Pi Pico, written entirely in MicroPython

PycOS An open source operating system designed primarily for the Raspberry Pi Pico, written entirely in MicroPython. "PycOS" is an combination of the

8 Oct 06, 2022
ok-system-helper是一个简单的系统硬件的实时信息收集工具,使用python3.x开发

ok-system-helper ok-system-helper是一个简单的系统硬件的实时信息收集工具,使用python3.x开发,支持哪些硬件:CPU、内存、SWAP、磁盘、网卡流量。用户可在自己的项目中直接引入、开箱即用,或者结合flask等web框架轻松做成http接口供前端调用,亦可通过注

xlvchao 1 Feb 08, 2022
A low power 1U Raspberry Pi cluster server for inexpensive colocation.

Raspberry Pi 1U Server There are server colocation providers that allow hosting a 1U server for as low as $30/month, but there's a catch: There are re

Paul Brown 627 Dec 31, 2022
Claussoft Personal Digital Assistant

Claussoft Personal Digital Assistant Install on Linux $ sudo apt update $ sudo apt install espeak ffmpeg libespeak1 portaudio19-dev $ pip install -r r

Christian Clauss 3 Dec 14, 2022
A simple small scale electric car was build which can be driven by remote control and features a fully autonomous parking procedure.

personal-autonomous-parking-car-raspberry A simple electric car model was build using Raspbery pi. The car has remote control and autonomous operation

Kostas Ziovas 2 Jan 26, 2022
E-Ink Magic Calendar that automatically syncs to Google Calendar and runs off a battery powered Raspberry Pi Zero

E-Ink Magic Calendar that automatically syncs to Google Calendar and runs off a battery powered Raspberry Pi Zero

2.8k Dec 30, 2022
Rasberry Pie GPIO memory game. Press the corresponding key to the lit LED.

RPie-keyboard-game Rasberry Pie GPIO memory game. Press the corresponding key to the lit LED. Randem LED (general output) is lit up on rasberrypi rand

Shawn Dowling 1 Oct 24, 2021
Jarvis: a personal assistant which can help you to manage your system

Jarvis Jarvis is personal AI based assistant which can help you to manage stuff in your computer. This is demo but I decided to make it more better so

2 Jun 02, 2022
A Home Assistant sensor that tells you what holiday is next

Next Holiday Sensor This sensor tells you what holiday is coming up next. You can use it to set holiday light colors or other scenes. The state of the

Nick Touran 20 Dec 04, 2022
The example shows using local self-hosted runners on-premises by making use of a runner on a Raspberry Pi with LED's attached to it

The example shows using local self-hosted runners on-premises by making use of a runner on a Raspberry Pi with LED's attached to it

Martin Woodward 6 Nov 13, 2021
A lightweight script for updating custom components for Home Assistant

Updater for Home Assistant This is a lightweight script for updating custom components for Home Assistant. If for some reason you do not want to use H

Alex X 12 Sep 21, 2022