Skip to main content

Programmatically generate Raspberry Pi GPIO connection diagrams

Project description

PinViz

CI Documentation License: MIT Python 3.12+ PyPI version

Programmatically generate beautiful Raspberry Pi GPIO connection diagrams in SVG format.

PinViz makes it easy to create clear, professional wiring diagrams for your Raspberry Pi projects. Define your connections using simple YAML/JSON files or Python code, and automatically generate publication-ready SVG diagrams.

Features

  • Declarative Configuration: Define diagrams using YAML or JSON
  • Programmatic API: Create diagrams with Python code
  • Automatic Wire Routing: Smart wire routing with configurable styles (orthogonal, curved, mixed)
  • Inline Components: Add resistors, capacitors, and diodes directly on wires
  • Color-Coded Wires: Automatic color assignment based on pin function (I2C, SPI, power, ground, etc.)
  • Built-in Templates: Pre-configured boards (Raspberry Pi 5) and common devices (BH1750, IR LED rings, etc.)
  • GPIO Pin Reference: Optional GPIO pinout diagram for easy reference
  • SVG Output: Scalable, high-quality vector graphics

Installation

Using uv (recommended):

uv add pinviz

Using pip:

pip install pinviz

Quick Start

Using YAML Configuration

Create a configuration file my-diagram.yaml:

title: "BH1750 Light Sensor Wiring"
board: "raspberry_pi_5"

devices:
  - type: "bh1750"
    name: "BH1750"

connections:
  - board_pin: 1     # 3V3
    device: "BH1750"
    device_pin: "VCC"

  - board_pin: 6     # GND
    device: "BH1750"
    device_pin: "GND"

  - board_pin: 5     # GPIO3 (I2C SCL)
    device: "BH1750"
    device_pin: "SCL"

  - board_pin: 3     # GPIO2 (I2C SDA)
    device: "BH1750"
    device_pin: "SDA"

show_gpio_diagram: true  # Optional: include GPIO pin reference

Generate the diagram:

pinviz my-diagram.yaml -o output.svg

Using Python API

from pinviz import boards, devices, Connection, Diagram, SVGRenderer

# Create board and device
board = boards.raspberry_pi_5()
sensor = devices.bh1750_light_sensor()

# Define connections
connections = [
    Connection(1, "BH1750", "VCC"),  # 3V3 to VCC
    Connection(6, "BH1750", "GND"),  # GND to GND
    Connection(5, "BH1750", "SCL"),  # GPIO3/SCL to SCL
    Connection(3, "BH1750", "SDA"),  # GPIO2/SDA to SDA
]

# Create and render diagram
diagram = Diagram(
    title="BH1750 Light Sensor Wiring",
    board=board,
    devices=[sensor],
    connections=connections,
    show_gpio_diagram=True  # Optional: include GPIO pin reference
)

renderer = SVGRenderer()
renderer.render(diagram, "output.svg")

Custom Wire Colors

Use the WireColor enum for standard electronics wire colors:

from pinviz import (
    boards, devices, Connection, Diagram, SVGRenderer, WireColor
)

# Define connections with custom colors
connections = [
    Connection(1, "BH1750", "VCC", color=WireColor.RED),
    Connection(6, "BH1750", "GND", color=WireColor.BLACK),
    Connection(5, "BH1750", "SCL", color=WireColor.BLUE),
    Connection(3, "BH1750", "SDA", color=WireColor.GREEN),
]

# Or use hex colors directly
connections = [
    Connection(1, "BH1750", "VCC", color="#FF0000"),  # Red
]

Available colors: RED, BLACK, WHITE, GREEN, BLUE, YELLOW, ORANGE, PURPLE, GRAY, BROWN, PINK, CYAN, MAGENTA, LIME, TURQUOISE

CLI Commands

Render a Diagram

# From YAML/JSON file
pinviz my-diagram.yaml -o output.svg

# Short form (output defaults to <config>.svg)
pinviz my-diagram.yaml

Example Diagrams

LED with Resistor

Simple LED circuit with inline current-limiting resistor:

LED with Resistor

Multi-Device Setup

BH1750 light sensor + IR LED ring with custom wire colors:

BH1750 + IR LED Ring

Traffic Light

Three LEDs with individual resistors:

Traffic Light

Generate Built-in Examples

# BH1750 light sensor
pinviz example bh1750 -o bh1750.svg

# IR LED ring
pinviz example ir_led -o ir_led.svg

# Multiple I2C and SPI devices
pinviz example i2c_spi -o i2c_spi.svg

List Available Templates

pinviz list

Configuration Reference

Diagram Options

show_gpio_diagram: true  # Include GPIO pin reference (default: false)

The GPIO pin reference diagram displays all 40 GPIO pins with their functions, providing a helpful reference when wiring your project.

Board Selection

Currently supported boards:

  • raspberry_pi_5 (aliases: rpi5, rpi)

Built-in Device Types

  • bh1750 - BH1750 I2C light sensor
  • ir_led_ring - IR LED ring module
  • i2c_device - Generic I2C device
  • spi_device - Generic SPI device
  • led - Simple LED
  • button - Push button/switch

Connection Configuration

Connections use physical pin numbers (1-40), not BCM GPIO numbers:

connections:
  - board_pin: 1           # Physical pin number (required)
    device: "Device Name"  # Device name (required)
    device_pin: "VCC"      # Device pin name (required)
    color: "#FF0000"       # Custom wire color (optional)
    style: "mixed"         # Wire style: orthogonal, curved, mixed (optional)
    components:            # Inline components (optional)
      - type: "resistor"
        value: "220Ω"
        position: 0.55     # Position along wire (0.0-1.0, default: 0.55)

Inline Components

Add resistors, capacitors, or diodes directly on wire connections:

connections:
  - board_pin: 11
    device: "Red LED"
    device_pin: "+"
    color: "#FF0000"
    components:
      - type: "resistor"   # Component type: resistor, capacitor, diode
        value: "220Ω"      # Display value (required)
        position: 0.55     # Position along wire path (0.0 = board, 1.0 = device)

Python API:

from pinviz import Component, ComponentType, Connection

connection = Connection(
    board_pin=11,
    device_name="Red LED",
    device_pin_name="+",
    color="#FF0000",
    components=[
        Component(
            type=ComponentType.RESISTOR,
            value="220Ω",
            position=0.55
        )
    ]
)

Custom Devices

Define custom devices inline:

devices:
  - name: "My Custom Sensor"
    width: 80.0
    height: 50.0
    color: "#4A90E2"
    pins:
      - name: "VCC"
        role: "3V3"
        position: {x: 5.0, y: 10.0}
      - name: "GND"
        role: "GND"
        position: {x: 5.0, y: 20.0}
      - name: "SDA"
        role: "I2C_SDA"
        position: {x: 5.0, y: 30.0}
      - name: "SCL"
        role: "I2C_SCL"
        position: {x: 5.0, y: 40.0}

Pin Roles

Supported pin roles (for automatic color assignment):

  • 3V3, 5V - Power rails
  • GND - Ground
  • GPIO - General purpose I/O
  • I2C_SDA, I2C_SCL - I2C bus
  • SPI_MOSI, SPI_MISO, SPI_SCLK, SPI_CE0, SPI_CE1 - SPI bus
  • UART_TX, UART_RX - UART serial
  • PWM - PWM output

Development

Setup

# Clone repository
git clone https://gitlab.com/borkempire/pinviz.git
cd pinviz

# Install dependencies
uv sync --dev

Code Quality

# Lint and format
uv run ruff check .
uv run ruff format .

# Run tests
uv run pytest

Examples

The examples/ directory contains:

  • bh1750.yaml / bh1750_python.py - I2C light sensor
  • bh1750_ir_led.yaml / bh1750_ir_led_python.py - Light sensor + IR LED ring
  • led_with_resistor.yaml / led_with_resistor_python.py - LED with inline resistor
  • traffic_light.yaml - Traffic light with 3 LEDs and resistors

All generated diagrams are in the images/ directory.

License

MIT License - See LICENSE file for details

Contributing

Contributions are welcome! Please feel free to submit a Pull Request.

Credits

Board and GPIO pin SVG assets courtesy of FreeSVG.org

Author

Even Nordstad

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

pinviz-0.1.2.tar.gz (30.0 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

pinviz-0.1.2-py3-none-any.whl (36.4 kB view details)

Uploaded Python 3

File details

Details for the file pinviz-0.1.2.tar.gz.

File metadata

  • Download URL: pinviz-0.1.2.tar.gz
  • Upload date:
  • Size: 30.0 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: uv/0.9.10 {"installer":{"name":"uv","version":"0.9.10"},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"24.04","id":"noble","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":true}

File hashes

Hashes for pinviz-0.1.2.tar.gz
Algorithm Hash digest
SHA256 cb68aabfb3b3ccc692c74dbd65a030790c5218740d3754e054d9402185d20f0f
MD5 44109f9a5d3f7eaf16204e61141b09a1
BLAKE2b-256 df041a0cef8591ccfc1144eaa28bf001ce8c66ded1330679df93355f10227c5e

See more details on using hashes here.

File details

Details for the file pinviz-0.1.2-py3-none-any.whl.

File metadata

  • Download URL: pinviz-0.1.2-py3-none-any.whl
  • Upload date:
  • Size: 36.4 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: uv/0.9.10 {"installer":{"name":"uv","version":"0.9.10"},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"24.04","id":"noble","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":true}

File hashes

Hashes for pinviz-0.1.2-py3-none-any.whl
Algorithm Hash digest
SHA256 8ba5ca6f15c46fb25e2a7d86a0e6c951b0f960fa3cf89d2eb6458a89f548a6a3
MD5 61bbc71ee3fe22e33eae5159f1905ccd
BLAKE2b-256 69b2d5330f85d0eae346c534240bc2c152a190e9690cd3021353f34572134e7c

See more details on using hashes here.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page