The SubWelton board avoids duplication

The SubWelton board avoids duplication of pins and so has only two plug connectors rather than four. It is still an IoExpander board with 32 channels of inputs and outputs, along with interrupt capability. This configuration is not compatible with my current range of peripherals, except for the matching Saxilby board, but it allow the user to develop projects with less cables. Show test video.

This SubWelton Board is available for $7NZD plus postage, as shown directly below.

# latchiopinSubWeltonTest_main.py
# MIT License (MIT)
# Copyright (c) 2025 Microtron Ltd NZ - Stephen Eichler
# https://opensource.org/licenses/MIT
# Written 2025/11/09
#from machine import Pin, I2C
import latchiopin
import time
import sys
#import iopin

latchdrv0=latchiopin.LatchIoPin(0) 
latchdrv1=latchiopin.LatchIoPin(1) 
latchdrv2=latchiopin.LatchIoPin(2) 
latchdrv3=latchiopin.LatchIoPin(3) 
#ipin0=iopin.IoPin(0)

#print ("Press enter to continue.")
'''
i2c = I2C(id=0, scl=Pin(1), sda=Pin(0))

def i2c_scan(i2c):
    try:
        devices = i2c.scan()
        if len(devices) == 0:
            print("No I2C devices found.")
        else:
            print("Found the following I2C devices:")
            for device in devices:
                print(f"Device address: 0x{device:02X}")
    except OSError as e:
        print(f"An error occurred during the I2C scan: {e}")
        
i2c_scan(i2c)
'''
'''
latchdrv0.reset()
latchdrv1.reset()
latchdrv2.reset()
latchdrv3.reset()
'''

while 1:
    
    latchdrv0.d0.value = 1
    time.sleep_ms(500)
    print ("latchdrv0.d0.value ", latchdrv0.d0.value)
    #data = sys.stdin.buffer.read(2)
    latchdrv0.d0.value = 0
    print ("latchdrv0.d0.value ", latchdrv0.d0.value)
    time.sleep_ms(500)

    latchdrv0.d1.value = 1
    time.sleep_ms(500)
    print ("latchdrv0.d1.value ", latchdrv0.d1.value)
    #data = sys.stdin.buffer.read(2)
    latchdrv0.d1.value = 0
    print ("latchdrv0.d1.value ", latchdrv0.d1.value)
    time.sleep_ms(500)

    latchdrv0.d2.value = 1
    time.sleep_ms(500)
    print ("latchdrv0.d2.value")
    #data = sys.stdin.buffer.read(2)
    latchdrv0.d2.value = 0
    time.sleep_ms(500)

    latchdrv0.d3.value = 1
    time.sleep_ms(500)
    print ("latchdrv0.d3.value")
    #data = sys.stdin.buffer.read(2)
    latchdrv0.d3.value = 0
    time.sleep_ms(500)

    latchdrv0.d4.value = 1
    time.sleep_ms(500)
    print ("latchdrv0.d4.value")
    #data = sys.stdin.buffer.read(2)
    latchdrv0.d4.value = 0
    time.sleep_ms(500)

    latchdrv0.d5.value = 1
    time.sleep_ms(500)
    print ("latchdrv0.d5.value")
    #data = sys.stdin.buffer.read(2)
    latchdrv0.d5.value = 0
    time.sleep_ms(500)

    latchdrv0.d6.value = 1
    time.sleep_ms(500)
    print ("latchdrv0.d6.value")
    #data = sys.stdin.buffer.read(2)
    latchdrv0.d6.value = 0
    time.sleep_ms(500)

    latchdrv0.d7.value = 1
    time.sleep_ms(500)
    print ("latchdrv0.d7.value")
    #data = sys.stdin.buffer.read(2)
    latchdrv0.d7.value = 0
    time.sleep_ms(500)


    
    latchdrv1.d0.value = 1
    time.sleep_ms(500)
    print ("latchdrv1.d0.value ", latchdrv1.d0.value)
    #data = sys.stdin.buffer.read(2)
    latchdrv1.d0.value = 0
    print ("latchdrv1.d0.value ", latchdrv1.d0.value)
    time.sleep_ms(500)

    latchdrv1.d1.value = 1
    time.sleep_ms(500)
    print ("latchdrv1.d1.value ", latchdrv1.d1.value)
    #data = sys.stdin.buffer.read(2)
    latchdrv1.d1.value = 0
    print ("latchdrv1.d1.value ", latchdrv1.d1.value)
    time.sleep_ms(500)

    latchdrv1.d2.value = 1
    time.sleep_ms(500)
    print ("latchdrv1.d2.value")
    #data = sys.stdin.buffer.read(2)
    latchdrv1.d2.value = 0
    time.sleep_ms(500)

    latchdrv1.d3.value = 1
    time.sleep_ms(500)
    print ("latchdrv1.d3.value")
    #data = sys.stdin.buffer.read(2)
    latchdrv1.d3.value = 0
    time.sleep_ms(500)

    latchdrv1.d4.value = 1
    time.sleep_ms(500)
    print ("latchdrv1.d4.value")
    #data = sys.stdin.buffer.read(2)
    latchdrv1.d4.value = 0
    time.sleep_ms(500)

    latchdrv1.d5.value = 1
    time.sleep_ms(500)
    print ("latchdrv1.d5.value")
    #data = sys.stdin.buffer.read(2)
    latchdrv1.d5.value = 0
    time.sleep_ms(500)

    latchdrv1.d6.value = 1
    time.sleep_ms(500)
    print ("latchdrv1.d6.value")
    #data = sys.stdin.buffer.read(2)
    latchdrv1.d6.value = 0
    time.sleep_ms(500)

    latchdrv1.d7.value = 1
    time.sleep_ms(500)
    print ("latchdrv1.d7.value")
    #data = sys.stdin.buffer.read(2)
    latchdrv1.d7.value = 0
    time.sleep_ms(500)
    





    
    latchdrv2.d0.value = 1
    time.sleep_ms(500)
    print ("latchdrv2.d0.value ", latchdrv2.d0.value)
    #data = sys.stdin.buffer.read(2)
    latchdrv2.d0.value = 0
    print ("latchdrv2.d0.value ", latchdrv2.d0.value)
    time.sleep_ms(500)

    latchdrv2.d1.value = 1
    time.sleep_ms(500)
    print ("latchdrv2.d1.value ", latchdrv2.d1.value)
    #data = sys.stdin.buffer.read(2)
    latchdrv2.d1.value = 0
    print ("latchdrv2.d1.value ", latchdrv2.d1.value)
    time.sleep_ms(500)

    latchdrv2.d2.value = 1
    time.sleep_ms(500)
    print ("latchdrv2.d2.value")
    #data = sys.stdin.buffer.read(2)
    latchdrv2.d2.value = 0
    time.sleep_ms(500)

    latchdrv2.d3.value = 1
    time.sleep_ms(500)
    print ("latchdrv2.d3.value")
    #data = sys.stdin.buffer.read(2)
    latchdrv2.d3.value = 0
    time.sleep_ms(500)

    latchdrv2.d4.value = 1
    time.sleep_ms(500)
    print ("latchdrv2.d4.value")
    #data = sys.stdin.buffer.read(2)
    latchdrv2.d4.value = 0
    time.sleep_ms(500)

    latchdrv2.d5.value = 1
    time.sleep_ms(500)
    print ("latchdrv2.d5.value")
    #data = sys.stdin.buffer.read(2)
    latchdrv2.d5.value = 0
    time.sleep_ms(500)

    latchdrv2.d6.value = 1
    time.sleep_ms(500)
    print ("latchdrv2.d6.value")
    #data = sys.stdin.buffer.read(2)
    latchdrv2.d6.value = 0
    time.sleep_ms(500)

    latchdrv2.d7.value = 1
    time.sleep_ms(500)
    print ("latchdrv2.d7.value")
    #data = sys.stdin.buffer.read(2)
    latchdrv2.d7.value = 0
    time.sleep_ms(500)







    latchdrv3.d0.value = 1
    time.sleep_ms(500)
    print ("latchdrv3.d0.value ", latchdrv3.d0.value)
    #data = sys.stdin.buffer.read(2)
    latchdrv3.d0.value = 0
    print ("latchdrv3.d0.value ", latchdrv3.d0.value)
    time.sleep_ms(500)

    latchdrv3.d1.value = 1
    time.sleep_ms(500)
    print ("latchdrv3.d1.value ", latchdrv3.d1.value)
    #data = sys.stdin.buffer.read(2)
    latchdrv3.d1.value = 0
    print ("latchdrv3.d1.value ", latchdrv3.d1.value)
    time.sleep_ms(500)

    latchdrv3.d2.value = 1
    time.sleep_ms(500)
    print ("latchdrv3.d2.value")
    #data = sys.stdin.buffer.read(2)
    latchdrv3.d2.value = 0
    time.sleep_ms(500)

    latchdrv3.d3.value = 1
    time.sleep_ms(500)
    print ("latchdrv3.d3.value")
    #data = sys.stdin.buffer.read(2)
    latchdrv3.d3.value = 0
    time.sleep_ms(500)

    latchdrv3.d4.value = 1
    time.sleep_ms(500)
    print ("latchdrv3.d4.value")
    #data = sys.stdin.buffer.read(2)
    latchdrv3.d4.value = 0
    time.sleep_ms(500)

    latchdrv3.d5.value = 1
    time.sleep_ms(500)
    print ("latchdrv3.d5.value")
    #data = sys.stdin.buffer.read(2)
    latchdrv3.d5.value = 0
    time.sleep_ms(500)

    latchdrv3.d6.value = 1
    time.sleep_ms(500)
    print ("latchdrv3.d6.value")
    #data = sys.stdin.buffer.read(2)
    latchdrv3.d6.value = 0
    time.sleep_ms(500)

    latchdrv3.d7.value = 1
    time.sleep_ms(500)
    print ("latchdrv3.d7.value")
    #data = sys.stdin.buffer.read(2)
    latchdrv3.d7.value = 0
    time.sleep_ms(500)