Decoding the BCM2711: The Anatomy of the 40-Pin Header
The Raspberry Pi 4 Model B represents a massive leap in single-board computing, driven by the Broadcom BCM2711 SoC. Yet, for hardware hackers and DIY engineers, the most critical interface remains the 40-pin GPIO header. While the physical layout is backward-compatible with the Pi 3 B+, the underlying power delivery and peripheral routing demand a precise understanding of the Raspberry Pi 4 Model B pinout to avoid catastrophic hardware failure.
Unlike microcontrollers such as the Arduino Uno or ESP32, the Pi 4 is a fully-fledged Linux computer. Its GPIO pins operate at a strict 3.3V logic level. Applying 5V to any standard GPIO pin will bypass the internal protection diodes, fry the BCM2711 silicon, and permanently brick the board. This tutorial goes beyond basic pin maps, providing a practical, project-based approach to mastering I2C, hardware PWM, and interrupt-driven inputs while respecting the electrical limits of the Pi 4.
Complete Raspberry Pi 4 Model B Pinout Reference
To design reliable circuits, you must differentiate between physical pin numbers (1-40) and Broadcom (BCM) GPIO numbers. Software libraries like gpiozero default to BCM numbering, while physical wiring diagrams use the pin header layout. For a visual map, engineers frequently reference Pinout.xyz, but understanding the functional groupings is vital for PCB design and ribbon cable routing.
| Function Type | Physical Pins | BCM / Details | Electrical Notes |
|---|---|---|---|
| Power Rails | 2, 4 (5V) | 1, 17 (3.3V) | 5V tied to USB-C input; 3.3V from onboard buck converter | Max 3.3V draw is ~50mA for GPIO bank, though the rail can supply more to HATs. |
| Ground | 6, 9, 14, 20, 25, 30, 34, 39 | Common system ground | Use multiple grounds for high-speed SPI to reduce return-path inductance. |
| I2C Bus 1 | 3 (SDA), 5 (SCL) | BCM 2, BCM 3 | Features onboard 1.8kΩ pull-up resistors to 3.3V. |
| SPI0 (Primary) | 19 (MOSI), 21 (MISO), 23 (SCLK), 24 (CE0), 26 (CE1) | BCM 10, 9, 11, 8, 7 | Capable of up to 125MHz, but keep traces short to avoid signal degradation. |
| Hardware PWM | 12, 32 (PWM0) | 33, 35 (PWM1) | BCM 18, 12 | 13, 19 | Essential for smooth LED dimming and servo control without CPU jitter. |
| UART (Serial) | 8 (TX), 10 (RX) | BCM 14, 15 | Must disable serial console in raspi-config to use for GPS/Arduino comms. |
Project Tutorial: I2C Environmental Monitor with PWM Alert
The best way to internalize the Raspberry Pi 4 Model B pinout is to build a multi-protocol circuit. In this tutorial, we will wire a BME280 environmental sensor (I2C), a tactile pushbutton (Interrupt/GPIO), and an LED (Hardware PWM) to create a climate monitor that triggers a visual alert when temperatures exceed a threshold.
Component BOM and Wiring Matrix
This wiring matrix maps the physical components to the Pi 4 header. We utilize Pin 12 (BCM 18) specifically because it supports hardware PWM, ensuring the LED breathes smoothly without burdening the Linux kernel's software PWM scheduler.
| Component | Component Pin | Pi 4 Physical Pin | Pi 4 BCM / Function |
|---|---|---|---|
| BME280 Sensor | VIN / VCC | Pin 1 | 3.3V Power |
| BME280 Sensor | GND | Pin 6 | Ground |
| BME280 Sensor | SDA | Pin 3 | BCM 2 (I2C SDA) |
| BME280 Sensor | SCL | Pin 5 | BCM 3 (I2C SCL) |
| 5mm Red LED | Anode (+) | Pin 12 (via 220Ω Resistor) | BCM 18 (Hardware PWM) |
| 5mm Red LED | Cathode (-) | Pin 14 | Ground |
| Tactile Button | Terminal 1 | Pin 37 | BCM 26 (Input with Pull-up) |
| Tactile Button | Terminal 2 | Pin 39 | Ground |
Python Implementation using gpiozero and smbus2
To interact with the hardware, we rely on the GPIO Zero Documentation for the LED and Button, and the smbus2 library for raw I2C communication. Ensure I2C is enabled via sudo raspi-config before running this script.
import time
from gpiozero import PWMLED, Button
import smbus2
# Initialize Hardware based on BCM Pinout
alert_led = PWMLED(18) # Physical Pin 12
cancel_btn = Button(26, pull_up=True, bounce_time=0.05) # Physical Pin 37
# BME280 I2C Address (usually 0x76 or 0x77)
I2C_ADDR = 0x76
bus = smbus2.SMBus(1) # I2C Bus 1 (Pins 3 & 5)
def read_temperature():
# Simplified BME280 read sequence (requires calibration data in production)
# This block represents the I2C fetch logic
raw_data = bus.read_i2c_block_data(I2C_ADDR, 0xFA, 3)
# ... calibration math omitted for brevity ...
return 24.5 # Mock return for tutorial structure
def alert_sequence():
print('Threshold breached! Initiating PWM Alert.')
for _ in range(5):
alert_led.pulse(fade_in_time=0.5, fade_out_time=0.5)
alert_led.off()
try:
while True:
temp = read_temperature()
print(f'Current Temp: {temp}C')
if temp > 28.0:
alert_sequence()
if cancel_btn.is_pressed:
print('Manual override triggered.')
alert_led.off()
time.sleep(2)
except KeyboardInterrupt:
alert_led.off()
bus.close()
Critical Hardware Protection: Avoiding the Magic Smoke
According to the Raspberry Pi Foundation, the BCM2711 SoC is highly sensitive to overvoltage. When designing circuits around the Pi 4 pinout, you must implement hardware protection strategies.
The 3.3V vs 5V Logic Level Trap
Many popular hobbyist sensors (like the HC-SR04 ultrasonic distance sensor or standard 5V Arduino modules) output 5V logic. If you wire a 5V output directly to a Pi 4 GPIO input, you will force current backward through the SoC's ESD protection diodes, eventually melting the internal bonding wires.
- The Solution: Use a bidirectional logic level shifter (e.g., Texas Instruments TXB0106 or a cheap MOSFET-based 4-channel module). Connect the low-voltage (LV) side to Pin 1 (3.3V) and the high-voltage (HV) side to Pin 2 or 4 (5V).
- Voltage Divider Alternative: For simple one-way 5V to 3.3V inputs (like the HC-SR04 Echo pin), use a resistor voltage divider. A 1kΩ resistor in series with the signal, and a 2kΩ resistor to ground, will safely step 5V down to ~3.33V.
Current Sinking vs. Sourcing
Engineering Rule of Thumb: The Raspberry Pi 4 GPIO pins are vastly superior at sinking current (pulling to ground) than sourcing current (providing 3.3V). Whenever possible, wire your LEDs and relays so the GPIO pin acts as the ground switch, with the 3.3V or 5V rail providing the primary power.
Furthermore, never drive inductive loads (like relays, solenoids, or DC motors) directly from the GPIO header. The back-EMF spike will instantly destroy the BCM2711. Always use an optocoupler or a logic-level MOSFET (like the IRLZ44N) paired with a flyback diode.
Advanced Configurations: HAT EEPROM and UART Conflicts
Two specific areas of the Raspberry Pi 4 Model B pinout frequently trap intermediate makers: the ID pins and the primary UART bus.
Pins 27 and 28: The HAT Identification Bus
Physical pins 27 (ID_SD) and 28 (ID_SC) are a dedicated I2C bus connected to the BCM2711. They are strictly reserved for reading the EEPROM on Raspberry Pi HATs (Hardware Attached on Top). The Pi's bootloader queries these pins at startup to automatically configure GPIO drive strengths and power limits. Do not use these pins for standard GPIO or external I2C sensors. Doing so can cause boot loops or kernel panics if the Pi misidentifies a connected sensor as a corrupted HAT EEPROM.
The UART Boot Console Conflict
Pins 8 (TX) and 10 (RX) map to the primary hardware UART (/dev/ttyAMA0). Out of the box, Raspberry Pi OS routes the Linux serial console to these pins. If you attempt to connect a GPS module or an Arduino to these pins without disabling the console, your external device will be flooded with Linux kernel boot logs, causing data corruption and unpredictable behavior.
To free up the UART pins for your project:
- Open the terminal and run
sudo raspi-config. - Navigate to Interface Options > Serial Port.
- Select No when asked if you want a login shell over serial.
- Select Yes when asked if you want the serial port hardware enabled.
- Reboot the Pi to apply the device tree overlay changes.
By mastering these electrical nuances and respecting the physical limitations of the header, you can build robust, industrial-grade IoT prototypes using the Raspberry Pi 4 Model B.






