Fig. 1 Raspberry Pi 4 connected to 2 PCF8574P GPIO expanders.
Connecting PCF8574P GPIO Expander to Raspberry Pi
by Lewis Loflin
Here I'll connect the PCF8574P (above) GPIO expander to a Raspberry Pi. To cover the basic operation of the PCF8574P see Programming PCF8574P 8-bit I-O Expander with PICAXE, Arduino.
I'll connect 8 LEDs to one PCF8574P and 8 switches on another. We will read the switches then alter the LEDs, etc.
Only four connections besides power, ground are used on the Raspberry Pi. The PCF8574P is an I2C device using GPIO-2 (SDA) and GPIO-3 (SCL). A push button switch to ground from GPIO-21. GPIO-20 connected to the interrupt pin of one PCF8574Ps.
Fig. 2 PCF8574P pin connections.
Fig. 2 illustrates the pin connections of the PCF8475P.
Fig. 3 PCF8574P connected to 8 LEDs.
Fig. 4 PCF8574P connected to 8 switches.
Fig. 5 PCF8574P device addresses with i2cdetect.
Demo 1
Connect switch from GPIO-21 to GND. GPIO-20 not used. A FOR loop counts from 0-256, uses an XOR to invert bits, then writes value to U1.
Program will either time out or pressing SW in GPIO-21 terminates program regardless of count.
#!/usr/bin/env python # File picount_sw.py # By Lewis Loflin - lewis@bvu.net # uses 2 PCF8574P I2C 8-bit GPIOs # Count 0-256 on 8 LEDs # Press sw terminates count # External module imports import smbus import time as t import RPi.GPIO as GPIO bus = smbus.SMBus(1) # PCF8574P device addresses U1 = 0x20 # 8 LEDs U2 = 0x21 # 8 switches # use BCM channel numbers GPIO.setmode(GPIO.BCM) # use GPIO 20, 21 int_pin = 20 # not used here GPIO.setup(int_pin, GPIO.IN) sw = 21 # to GND GPIO.setup(sw, GPIO.IN, pull_up_down=GPIO.PUD_UP) def writeVal(value): bus.write_byte(U1, value) return 0 def readVal(): num1 = bus.read_byte(U2) return num1 for x in range(0,256): if GPIO.input(sw) == 0: break # end loop print x # XOR inverts bits x = x ^ 0xFF writeVal(x) #delay 200 mSec. t.sleep(.2) # turn LEDs off writeVal(0xFF) GPIO.cleanup() print "Good by!" exit
Demo 2
If a switch is pressed on U2 write value to U1. If no switch pressed don't write to U1. If switches P0 and P1 are pressed together exit program.
#!/usr/bin/env python # File pcf8574_demo2.py # By Lewis Loflin - lewis@bvu.net # uses 2 PCF8574P I2C 8-bit GPIOs # module imports import smbus import time as t # use BCM channel numbers GPIO.setmode(GPIO.BCM) # connect I2C bus = smbus.SMBus(1) # PCF8574P device addresses U1 = 0x20 # 8 LEDs U2 = 0x21 # 8 switches # LEDs OFF bus.write_byte(U1, 0xFF) # switch pull ups on bus.write_byte(U2, 0xFF) def writeVal(num0): bus.write_byte(U1, num0) return 0 def readVal(): num1 = bus.read_byte(U2) return num1 temp = 0 while (temp != 3): temp = readVal() if temp != 0xFF: writeVal(temp) # delay 200 mSec. t.sleep(.2) # turn LEDs off writeVal(0xFF) GPIO.cleanup() print "Good by!" exit
Demo 3
Connect U2 INT pin to GPIO-21. Connect a switch from GPIO-20 to GND. Check for interrupt from U2, read U2 write value to U1.
The PCF8574P interrupt is interrupt on change, thus a key press generates 2 interrupts. Ignore 2nd interrupt which returns 0xFF.
#!/usr/bin/env python # File picount_int.py # By Lewis Loflin - lewis@bvu.net # uses 2 PCF8574P I2C 8-bit GPIOs # External module imports import smbus # I2C import time as t import RPi.GPIO as GPIO bus = smbus.SMBus(1) # PCF8574 device addresses U1 = 0x20 # 8 LEDs U2 = 0x21 # 8 switches # use BCM channel numbers GPIO.setmode(GPIO.BCM) # use GPIO 20, 21 int_pin = 20 GPIO.setup(int_pin, GPIO.IN) sw = 21 GPIO.setup(sw, GPIO.IN, pull_up_down=GPIO.PUD_UP) def writeVal(value): bus.write_byte(U1, value) return 0 def readVal(): num1 = bus.read_byte(U2) return num1 def pcf8574_bits(): temp = readVal() if temp == 255: return 0 writeVal(temp) return 0 writeVal(0xFF) # turn LEDs off while (GPIO.input(sw) == 1 ): # check for sw pressed if GPIO.input(int_pin) == 0: pcf8574_bits() t.sleep(.3) # turn LEDs off writeVal(0xFF) GPIO.cleanup() print "Good bye!" exit
- MOSFET-Transistor Drivers with TC4420 and TC4429, IGBTs, etc.
- Introduction TC4420-TC4429 MOSFET Drivers
- Use TC4420 MOSFET Driver for Simple H-Bridge Circuit
- TC4420 MOSFET Driver Various Circuits
- TC4420 MOSFET Driver Replacement Circuits
- Test Power MOSFET Transistors, IGBTs
- Insulated Gate Bipolar Transistor IGBT Circuits
- Issues on Connecting MOSFETs in Parallel
- TC4420 MOSFET Driver Replacement Circuits
- TB6600 Stepper Motor Driver with Arduino
- Interfacing Microcontrollers to CMOS and MOSFET Circuits
- Simplified CMOS-MOSFET H-Bridge Circuit
- Tri-State H-Bridge using CD4093B CMOS Circuit
- Common Collector Opto-Isolated Bipolar Transistor Switches
- Compare 2N3055 MJE10005 Transistor Power Switches
- Connecting PCF8574P GPIO Expander to Raspberry Pi
- Programming PCF8574P 8-bit I-O Expander with Arduino
- DS1307 RTC with a CD4040 as a Precision Time Base
- CD4040 12-stage Binary Counter with DS1307 RTC Time Base
- Pt. 1 Interfacing Microcontrollers to CMOS and MOSFET Circuits
- Pt. 2 Simplified CMOS-MOSFET H-Bridge Circuit
- Pt. 3 Tri-State H-Bridge using CD4093B CMOS Circuit
- Pt. 1 TB6600 Stepper Motor Driver with Arduino
- Pt. 2 Program TB6600 Stepper Motor Driver with Arduino
- TB6600 Stepper Motor Driver with Arduino
- Off Site:
- Web Master
- Tri-Cities VA-TN
- General Science
- Hobby Electronics
- US Constitution
- Christianity 101
- Religious Themes
© Copyright 2018 Lewis Loflin E-Mail