ModusCreateOrg / network-rgb-matrix-display

A library for helping drive large arrays of RGB Matrices with Raspberry Pis
MIT License
12 stars 2 forks source link
boost-asio cmake cplusplus cpp example-project iot iot-application maker multi-threading raspberry-pi rgb-led rgb-matrix

Network Matrix Display

Network Matrix Display is a set of libraries that allows you create a scalable network of matrix displays using Raspberry Pi Single Board Computers. It does this by using TCIP/IP as a transport method for the display data and is broken into two discrete sections; Client and Server.

Please refer to our how it works document for a detailed description of this projects functionality.

This project is choc-full of dependencies and is not just for the faint of heart. It requires you to put in effort to set things up.

It's worth noting that the scale of our project was not the cheapest solution for the desired result. The purpose of this project was to demonstrate what can be done with a hand full of available parts and open source libraries.
For the cheapest solution, we recommend display controllers like these.

Related documents:

General requirements

Client Requirements:

Server Requirements

Additional hardware

Installation

Install DietPi on a Raspberry Pi 2 or greater. Make sure it has Internet connectivity. Then run this script to provision the system and install the Network Matrix Display project:

curl https://raw.githubusercontent.com/ModusCreateOrg/network-rgb-matrix-display/master/bin/install.sh | bash

If you want to perform these steps by hand, be sure to clone the network-rgb-matrix-display with the --recursive --submodules option.

If you forget to clone it this way, you can fix up your checked out copy by issuing this command:

git submodule update --init --recursive

Client example.

The following example will generate the proper network display client configuration and kick off

  NetworkDisplayConfig displayConfig;

  displayConfig.frameRate = 60; // -1 to disable

  // This is your source display dimensions
  displayConfig.inputScreenWidth = 320;
  displayConfig.inputScreenHeight = 240;

  // Dimensions for your panels
  displayConfig.singlePanelWidth = 64;
  displayConfig.singlePanelHeight = 64;

  // How you will lay out your segments
  displayConfig.segmentPanelsTall = 3;
  displayConfig.segmentPanelsWide = 1;

  // How you will lay out your panels per segment
  displayConfig.totalPanelsWide = 5;
  displayConfig.totalPanelsTall = 3;

  displayConfig.totalSegments = 5;

  displayConfig.destinationPort = "9890";

  // In this scheme, the last IP address octet rolls up for multiple segments. 
  // Segment 1 is 201, segment 2 is 202, etc..
  displayConfig.destinationIP = "10.0.1.20%i";
  displayConfig.destinationIpStartDigit = 1;

  displayConfig.outputScreenWidth = displayConfig.singlePanelWidth * displayConfig.totalPanelsWide;
  displayConfig.outputScreenHeight = displayConfig.singlePanelHeight * displayConfig.totalPanelsTall;

  NetworkDisplay *networkDisplay = new NetworkDisplay(displayConfig);

  std::thread(interrupterThread).detach();

  uint16_t color = 0;
  while (! interrupt_received) {
    // Your code could easily populate the input buffer (array of uint16_t) with the pixel data
    memset(networkDisplay->GetInputBuffer(), color += 1, networkDisplay->GetInputBufferSize());

    // Flush the display buffer to the network
    networkDisplay->Update();
  }

License

This library is licensed under MIT.

Contributing

Interested in contributing? Please see our contribution and code of conduct guidelines.

Modus Create