{"id":26779116,"url":"https://github.com/paviro/rpi-led-sign-controller","last_synced_at":"2026-04-13T08:31:38.080Z","repository":{"id":283403635,"uuid":"951398171","full_name":"paviro/RPi-LED-Sign-Controller","owner":"paviro","description":"An LED matrix display controller for Raspberry Pi that drives RGB panels using either a native Rust or C++ binding driver, featuring a web interface for configuring animated text displays with effects like scrolling, borders, and color transitions.","archived":false,"fork":false,"pushed_at":"2025-03-27T19:40:14.000Z","size":443,"stargazers_count":0,"open_issues_count":0,"forks_count":0,"subscribers_count":1,"default_branch":"main","last_synced_at":"2025-08-23T12:14:29.530Z","etag":null,"topics":["hub75","led","led-controller","led-matrix","led-matrix-panel","raspberry-pi"],"latest_commit_sha":null,"homepage":"","language":"Rust","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/paviro.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":null,"code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2025-03-19T16:03:06.000Z","updated_at":"2025-03-27T19:40:18.000Z","dependencies_parsed_at":"2025-03-27T19:29:33.153Z","dependency_job_id":null,"html_url":"https://github.com/paviro/RPi-LED-Sign-Controller","commit_stats":null,"previous_names":["paviro/rpi-led-sign-controller"],"tags_count":0,"template":false,"template_full_name":null,"purl":"pkg:github/paviro/RPi-LED-Sign-Controller","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/paviro%2FRPi-LED-Sign-Controller","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/paviro%2FRPi-LED-Sign-Controller/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/paviro%2FRPi-LED-Sign-Controller/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/paviro%2FRPi-LED-Sign-Controller/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/paviro","download_url":"https://codeload.github.com/paviro/RPi-LED-Sign-Controller/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/paviro%2FRPi-LED-Sign-Controller/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":272063421,"owners_count":24866722,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","status":"online","status_checked_at":"2025-08-25T02:00:12.092Z","response_time":1107,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["hub75","led","led-controller","led-matrix","led-matrix-panel","raspberry-pi"],"created_at":"2025-03-29T06:14:50.123Z","updated_at":"2026-04-13T08:31:38.073Z","avatar_url":"https://github.com/paviro.png","language":"Rust","funding_links":[],"categories":[],"sub_categories":[],"readme":"\u003cdiv align=\"center\"\u003e\n\u003cimg src=\"https://github.com/user-attachments/assets/a1dffcaf-3105-459d-9a94-baef4ccfc8fd\" width=200\u003e\n\t\n# RPi LED Sign Controller\n######  LED matrix display controller for Raspberry Pi with web-based configuration.\n\n\n\u003c/div\u003e\n\n## Features\n\n- Control RGB LED matrix panels connected to Raspberry Pi GPIO\n- Web-based configuration interface\n- Text scrolling with customizable speed and colors\n- Image support including keyframe animations\n- Two driver options: native Rust (recommended) or C++ binding\n- Support for various LED matrix panel configurations\n\n## Quick Install\n\nTo quickly install or update the LED Sign Controller on your Raspberry Pi, you can use this installer:\n\n```bash\n# Download the installation script\ncurl -sSL https://raw.githubusercontent.com/paviro/rpi-led-sign-controller/main/scripts/install.sh -o install.sh\n# Run it with sudo\nsudo bash install.sh\n```\n\nThis will download and run the installation script, which will check for an existing installation, install/update dependencies, build the application, and help you configure your LED panel.\n\n\n## Screenshots\n\n### Playlist Manager\n\n\u003cdiv align=\"left\"\u003e\n  \u003cimg src=\"https://github.com/user-attachments/assets/954eea72-f67a-4603-b0e8-8d999f58529e\" width=50%\u003e\n\u003c/div\u003e\n\n### Editor\n\n\u003cdiv align=\"left\"\u003e\n  \u003cimg src=\"https://github.com/user-attachments/assets/9995bb02-5345-4470-8f41-761f37b05a06\" width=50%\u003e\n\u003c/div\u003e\n\n## Installation\n\n### Prerequisites\n\n- Raspberry Pi (tested on Pi 4)\n- LED matrix panels compatible with the HUB75 interface\n- Rust toolchain (rustc, cargo) (if not using quick install)\n\n### Building from Source\n\nFirst compile the frontend and copy output files into the `/static` dir. You can find the frontend [here](https://github.com/paviro/RPi-LED-Sign-Controller-Frontend).\n\nAfter that you can move on to the backend, the frontend files will be embedded in the final binary.\n\n```bash\n# Clone the repository\ngit clone https://github.com/paviro/rpi-led-sign-controller.git\ncd rpi-led-sign-controller\n\n# Build the project\ncargo build --release\n\n```\n\n## Usage\n\nThe application provides a web interface accessible at `http://\u003craspberry-pi-ip\u003e:3000` for configuring the display content. \n\nRun the application:\n\n```bash\n# Basic usage with native Rust driver\nsudo ./target/release/rpi_led_sign_controller --driver native --rows 32 --cols 64 --chain-length 1\n\n# Using the C++ binding driver\nsudo ./target/release/rpi_led_sign_controller --driver binding --rows 32 --cols 64 --chain-length 1\n```\n\n## Driver Selection\n\nThe application supports two different LED matrix drivers:\n\n1. **Native** (`--driver native`): Pure Rust implementation from [rpi_led_panel](https://github.com/EmbersArc/rpi_led_panel)\n2. **Binding** (`--driver binding`): C++ binding to Henner Zeller's [rpi-rgb-led-matrix](https://github.com/hzeller/rpi-rgb-led-matrix) library\n\n## CLI Arguments\n\n| Argument | Type | Description | Default | Supported By |\n|----------|------|-------------|---------|-------------|\n| `--driver`, `-d` | Option | Driver type: \"native\" or \"binding\" (REQUIRED) | - | Both |\n| `--rows`, `-r` | Option | Number of rows per panel | 32 | Both |\n| `--cols`, `-c` | Option | Number of columns per panel | 64 | Both |\n| `--parallel`, `-p` | Option | Number of chains to run in parallel | 1 | Both |\n| `--chain-length`, `-n` | Option | Number of daisy-chained panels | 1 | Both |\n| `--limit-max-brightness` | Option | Maximum brightness limit (0-100). The UI's 100% setting will equal this value | 100 | Both |\n| `--hardware-mapping` | Option | Display wiring configuration | \"regular\" | Both |\n| `--limit-refresh-rate` | Option | Limit refresh rate in Hz (0 = unlimited) | 0 | Both |\n| `--pi-chip` | Option | Raspberry Pi chip model (e.g., \"BCM2711\") | auto | Native |\n| `--pwm-bits` | Option | PWM bits for color depth (1-11) | 11 | Both |\n| `--pwm-lsb-nanoseconds` | Option | Base time-unit for the on-time in LSB | 130 | Both |\n| `--gpio-slowdown` | Option | GPIO slowdown factor (0-4) | auto | Both |\n| `--dither-bits` | Option | Bits for time dithering | 0 | Both |\n| `--panel-type` | Option | Panel initialization type (e.g., \"FM6126A\") | - | Both |\n| `--multiplexing` | Option | Multiplexing type | - | Both |\n| `--pixel-mapper` | Option | List of pixel mappers (\"U-mapper;Rotate:90\") | - | Both |\n| `--row-setter` | Option | Row address setter type | \"direct\" | Both |\n| `--led-sequence` | Option | LED color sequence | \"RGB\" | Both |\n| `--interlaced` | Switch | Enable interlaced scan mode | Disabled | Both |\n| `--no-hardware-pulse` | Switch | Disable hardware pin-pulse generation | Disabled | Binding |\n| `--show-refresh` | Switch | Show refresh rate on terminal | Disabled | Binding |\n| `--inverse-colors` | Switch | Invert display colors | Disabled | Binding |\n\n\n## Environment Variables\n\nAll CLI options can be set via environment variables with the `LED_` prefix.\n\n| Environment Variable | Equivalent CLI Argument |\n|----------------------|-------------------------|\n| `LED_DRIVER` | `--driver` |\n| `LED_ROWS` | `--rows` |\n| `LED_COLS` | `--cols` |\n| `LED_CHAIN_LENGTH` | `--chain-length` |\n| `LED_PARALLEL` | `--parallel` |\n| `LED_LIMIT_MAX_BRIGHTNESS` | `--limit-max-brightness` |\n| `LED_HARDWARE_MAPPING` | `--hardware-mapping` |\n| `LED_LIMIT_REFRESH_RATE` | `--limit-refresh-rate` |\n| `LED_PI_CHIP` | `--pi-chip` |\n| `LED_PWM_BITS` | `--pwm-bits` |\n| `LED_PWM_LSB_NANOSECONDS` | `--pwm-lsb-nanoseconds` |\n| `LED_GPIO_SLOWDOWN` | `--gpio-slowdown` |\n| `LED_DITHER_BITS` | `--dither-bits` |\n| `LED_PANEL_TYPE` | `--panel-type` |\n| `LED_MULTIPLEXING` | `--multiplexing` |\n| `LED_PIXEL_MAPPER` | `--pixel-mapper` |\n| `LED_ROW_SETTER` | `--row-setter` |\n| `LED_SEQUENCE` | `--led-sequence` |\n| `LED_HARDWARE_PULSING` | `--no-hardware-pulse` (inverted) |\n| `LED_SHOW_REFRESH` | `--show-refresh` |\n| `LED_INVERSE_COLORS` | `--inverse-colors` |\n\n## Hardware Mapping Options\n\nThe `--hardware-mapping` parameter depends on how your LED matrix is connected to the Raspberry Pi.\n\n| Mapping Value | Alternate Names | Description | Driver Support |\n|---------------|----------------|-------------|----------------|\n| `regular` | | Standard GPIO mapping (default) | Both |\n| `adafruit-hat` | `AdafruitHat` | Adafruit RGB Matrix Bonnet/HAT | Both |\n| `adafruit-hat-pwm` | `AdafruitHatPwm` | Adafruit RGB Matrix Bonnet/HAT with hardware PWM | Both |\n| `regular-pi1` | `RegularPi1` | Standard GPIO mapping for Raspberry Pi 1 | Both |\n| `classic` | | Early version of matrix wiring (not recommended for new setups) | Both |\n| `classic-pi1` | `ClassicPi1` | Early version for Pi 1 Rev A | Both |\n\nBoth kebab-case (`adafruit-hat`) and PascalCase (`AdafruitHat`) naming styles are supported for backward compatibility with both drivers.\n\n## Row Setter Options\n\nThe `--row-setter` parameter controls how the row address is set on the LED matrix. The following options are supported:\n\n| Option Value | Alternate Name | Description |\n|--------------|----------------|-------------|\n| `direct` | `default` | Direct row selection (default) |\n| `shiftregister` | `ab-addressed` | Shift register selection (AB addressed panels) |\n| `directabcdline` | `direct-row-select` | Direct ABCD line selection |\n| `abcshiftregister` | `abc-addressed` | ABC shift register selection |\n| `sm5266` | `abc-shift-de` | SM5266 with ABC shifter + DE direct |\n\nThe row setter determines how the GPIO pins are configured to address different rows on the LED panel. The correct value depends on your specific LED panel type and wiring configuration.\n\n## Multiplexing Options\n\nThe `--multiplexing` parameter determines how the display is electrically multiplexed.\n\n| Multiplexing Value | Description |\n|--------------------|-------------|\n| `Stripe` | Traditional line-by-line multiplexing (default for binding driver) |\n| `Checkered`, `Checker` | Alternate pixels are on different scan lines |\n| `Spiral` | Panel using spiral of matrix segments |\n| `ZStripe`, `ZStripe08` | Z-stripe with 8 pixel intervals |\n| `ZStripe44` | Z-stripe with 4x4 pixel intervals |\n| `ZStripe80` | Z-stripe with 8x0 pixel intervals |\n| `Coreman` | Multiplexing used in some Colorlight controllers |\n| `Kaler2Scan` | Scan pattern used in some Kaler panels |\n| `P10Z` | P10 outdoor panels with Z layout |\n| `QiangLiQ8` | QiangLi Q8 panels |\n| `InversedZStripe` | Inverted Z-stripe pattern |\n| `P10Outdoor1R1G1B1` | P10 outdoor panel variant 1 |\n| `P10Outdoor1R1G1B2` | P10 outdoor panel variant 2 |\n| `P10Outdoor1R1G1B3` | P10 outdoor panel variant 3 |\n| `P10Coreman` | P10 panels with Coreman multiplexing |\n| `P8Outdoor1R1G1B` | P8 outdoor panels |\n| `FlippedStripe` | Stripe pattern with flipped orientation |\n| `P10Outdoor32x16HalfScan` | P10 32x16 outdoor panels with half-scan |\n\nThe correct multiplexing option depends on your specific panel type. Most common panels use either `Stripe` or `Checkered`.\n\n## Web Server Configuration\n\nThe application includes a web server for configuration and control of the LED matrix. You can customize where this web server binds using the following options:\n\n### Web Server Options\n\n| Option | Description | Default |\n|--------|-------------|---------|\n| `--port` | Web server port | 3000 |\n| `--interface` | Network interface to bind to | `0.0.0.0` (all interfaces) |\n\n### Environment Variables\n\nThese settings can also be configured using environment variables:\n\n- `LED_PORT` - Set the web server port\n- `LED_INTERFACE` - Set the binding interface\n\n## CLI Usage Notes\n\n### Options vs. Switches\n\nThis application uses two types of command-line parameters with different behaviors:\n\n#### 1. CLI Arguments\n\n- **Options** require a value: `--rows 32`, `--cols 64`\n- **Switches** are flags with no values:\n  - To enable: include the switch (e.g., `--interlaced`)\n  - To disable: omit the switch entirely\n\n#### 2. Environment Variables\n\nAll parameters (including switches) accept values when set as environment variables:\n\n- For normal options: `LED_ROWS=32`, `LED_COLS=64`\n- For switches: \n  - To enable: `LED_INTERLACED=true` or `LED_INTERLACED=1`\n  - To disable: `LED_INTERLACED=false` or `LED_INTERLACED=0`\n\nThis difference in behavior between CLI switches and environment variables is due to how environment variables fundamentally work - they must always have a value, whereas CLI flags can be present or absent.\n\n### Special Case: Hardware Pulsing\n\nNote that the environment variable `LED_HARDWARE_PULSING` is inverted from its CLI counterpart `--no-hardware-pulse`:\n\n- CLI: `--no-hardware-pulse` (disables hardware pulsing)\n- ENV: `LED_HARDWARE_PULSING=false` (also disables hardware pulsing)\n\nThis reversal exists because the CLI flag is a \"negative\" switch.\n\n## Disclaimer\n\nThis project was developed with significant assistance from AI (specifically Claude). While efforts have been made to ensure code quality, the implementation may contain inefficiencies or non-idiomatic patterns. Contributions and improvements are welcome! I am not a Rust developer 🙈\n\n## Credits\n\n- [rpi_led_panel](https://github.com/EmbersArc/rpi_led_panel) - Native Rust driver\n- [rpi-rgb-led-matrix](https://github.com/hzeller/rpi-rgb-led-matrix) - C++ library\n- [rust-rpi-rgb-led-matrix](https://github.com/rust-rpi-led-matrix/rust-rpi-rgb-led-matrix) - Rust binding\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fpaviro%2Frpi-led-sign-controller","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fpaviro%2Frpi-led-sign-controller","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fpaviro%2Frpi-led-sign-controller/lists"}