Testing the Digital IO Expander and RS485 Building Block Boards
Digital IO Expander and RS485 Building Block Boards#
Today I received the Rev A versions of the Digital IO Expander and RS485 building block boards from the PCB manufacturer.
After a brief visual inspection, both boards look good. Of course, the real answer only comes once they are on the bench and tested properly.

RS485 Physical Board

Digital IO Expander Physical Board
As I am already in familiar territory with the RS485 building block board, having tested its predecessor, the RS485 + 48 V building block board, I decided to test the Digital IO Expander first.
The Digital IO Expander is a new design, so I wanted to get some early testing done to determine whether a Rev B version will be needed.

Testing the Digital IO Expander Board
Testing began by soldering on the header pins, checking continuity, and checking for shorts. Everything looked fine at that stage.
Next, I connected the board to a Raspberry Pi Pico 2W. I connected the 3.3 V rail, GND, and the required GPIO pins, then powered up the Pico and started testing the board functionality.
Testing the Outputs#
The board has 16 digital inputs and 16 digital outputs, using:
- 2 x 74HC165 shift registers for the inputs
- 2 x 74HC595 shift registers for the outputs
Initial testing focused on the outputs.
I wrote a simple MicroPython script to send different bit patterns to the output shift registers, then probed the output terminals with a multimeter to confirm that the expected pattern appeared on the board.
The script used for this initial test is shown below.
import machine
import time
# Initialize the onboard LED
led = machine.Pin("LED", machine.Pin.OUT)
outclk = machine.Pin(1, machine.Pin.OUT)
outlatch = machine.Pin(2, machine.Pin.OUT)
_outen = machine.Pin(3, machine.Pin.OUT)
outdata = machine.Pin(4, machine.Pin.OUT)
_outclr = machine.Pin(5, machine.Pin.OUT)
# Enable outputs
_outen.value(0)
# Clear the outputs
_outclr.value(0)
time.sleep(0.0001)
_outclr.value(1)
# Prepare to clock data into the shift registers
outlatch.value(0)
outclk.value(0)
time.sleep(0.0001)
# Test pattern
pattern = 0b1111000011110000
outdata.value(0)
# Data is clocked in on the rising edge of the clock
for i in range(16):
outclk.value(0)
time.sleep(0.0001)
bit_to_set = (pattern >> (15 - i)) & 1
outdata.value(bit_to_set)
led.value(bit_to_set)
outclk.value(1)
time.sleep(0.0001)
# Latch the shifted data onto the outputs
outlatch.value(1)
The process of sending data to the output side of the board is fairly simple.
First, the outputs are enabled. Then the output clear pin is pulsed low and brought high again to clear any previous pattern. After that, each bit is clocked into the shift registers one by one by setting the data line and pulsing the clock line high.
Once all 16 bits have been clocked in, the latch line is taken high, transferring the shifted data onto the output pins.
After sending several different patterns and checking the output states, everything appears to be working correctly on the output side of the board.
Next Steps#
Unfortunately, I ran out of time and had to deal with other business admin, so I have not yet tested the input side of the board.
That will be the next step. I will also be testing the RS485 building block board in the next instalment.
If you are looking for reusable open hardware modules to speed up your bench testing, or need support designing custom breakout circuits, check out our catalog at Protoworks (NI).
- 2026-10-17 Refining the Protoworks service offerings Lab
- 2026-09-27 Belfast Tech Week Lab
- 2026-09-19 Refining the UCMOD Architecture R&D
- 2026-09-06 Giving AI Agents a Way to Talk to Protoworks Software
- 2026-09-03 A Morning at a Manufacturing Trade Show Lab
- 2026-09-01 Debugging 921600 Baud on the ATtiny1614 R&D