aboutsummaryrefslogtreecommitdiff
path: root/circuitpython/lib/protomatter/examples/tiled/tiled.ino
diff options
context:
space:
mode:
Diffstat (limited to 'circuitpython/lib/protomatter/examples/tiled/tiled.ino')
-rw-r--r--circuitpython/lib/protomatter/examples/tiled/tiled.ino136
1 files changed, 136 insertions, 0 deletions
diff --git a/circuitpython/lib/protomatter/examples/tiled/tiled.ino b/circuitpython/lib/protomatter/examples/tiled/tiled.ino
new file mode 100644
index 0000000..eb2cdb0
--- /dev/null
+++ b/circuitpython/lib/protomatter/examples/tiled/tiled.ino
@@ -0,0 +1,136 @@
+/* ----------------------------------------------------------------------
+"Tiled" Protomatter library example sketch. Demonstrates use of multiple
+RGB LED matrices as a single larger drawing surface. This example is
+written for two 64x32 matrices (tiled into a 64x64 display) but can be
+adapted to others. If using MatrixPortal, larger multi-panel tilings like
+this should be powered from a separate 5V DC supply, not the USB port
+(this example works OK because the graphics are very minimal).
+
+PLEASE SEE THE "simple" EXAMPLE FOR AN INTRODUCTORY SKETCH.
+------------------------------------------------------------------------- */
+
+#include <Adafruit_Protomatter.h>
+
+/* ----------------------------------------------------------------------
+The RGB matrix must be wired to VERY SPECIFIC pins, different for each
+microcontroller board. This first section sets that up for a number of
+supported boards.
+------------------------------------------------------------------------- */
+
+#if defined(_VARIANT_MATRIXPORTAL_M4_) // MatrixPortal M4
+ uint8_t rgbPins[] = {7, 8, 9, 10, 11, 12};
+ uint8_t addrPins[] = {17, 18, 19, 20};
+ uint8_t clockPin = 14;
+ uint8_t latchPin = 15;
+ uint8_t oePin = 16;
+#elif defined(_VARIANT_FEATHER_M4_) // Feather M4 + RGB Matrix FeatherWing
+ uint8_t rgbPins[] = {6, 5, 9, 11, 10, 12};
+ uint8_t addrPins[] = {A5, A4, A3, A2};
+ uint8_t clockPin = 13;
+ uint8_t latchPin = 0;
+ uint8_t oePin = 1;
+#elif defined(__SAMD51__) // M4 Metro Variants (Express, AirLift)
+ uint8_t rgbPins[] = {6, 5, 9, 11, 10, 12};
+ uint8_t addrPins[] = {A5, A4, A3, A2};
+ uint8_t clockPin = 13;
+ uint8_t latchPin = 0;
+ uint8_t oePin = 1;
+#elif defined(_SAMD21_) // Feather M0 variants
+ uint8_t rgbPins[] = {6, 7, 10, 11, 12, 13};
+ uint8_t addrPins[] = {0, 1, 2, 3};
+ uint8_t clockPin = SDA;
+ uint8_t latchPin = 4;
+ uint8_t oePin = 5;
+#elif defined(NRF52_SERIES) // Special nRF52840 FeatherWing pinout
+ uint8_t rgbPins[] = {6, A5, A1, A0, A4, 11};
+ uint8_t addrPins[] = {10, 5, 13, 9};
+ uint8_t clockPin = 12;
+ uint8_t latchPin = PIN_SERIAL1_RX;
+ uint8_t oePin = PIN_SERIAL1_TX;
+#elif defined(ESP32)
+ // 'Safe' pins, not overlapping any peripherals:
+ // GPIO.out: 4, 12, 13, 14, 15, 21, 27, GPIO.out1: 32, 33
+ // Peripheral-overlapping pins, sorted from 'most expendible':
+ // 16, 17 (RX, TX)
+ // 25, 26 (A0, A1)
+ // 18, 5, 9 (MOSI, SCK, MISO)
+ // 22, 23 (SCL, SDA)
+ uint8_t rgbPins[] = {4, 12, 13, 14, 15, 21};
+ uint8_t addrPins[] = {16, 17, 25, 26};
+ uint8_t clockPin = 27; // Must be on same port as rgbPins
+ uint8_t latchPin = 32;
+ uint8_t oePin = 33;
+#elif defined(ARDUINO_TEENSY40)
+ uint8_t rgbPins[] = {15, 16, 17, 20, 21, 22}; // A1-A3, A6-A8, skip SDA,SCL
+ uint8_t addrPins[] = {2, 3, 4, 5};
+ uint8_t clockPin = 23; // A9
+ uint8_t latchPin = 6;
+ uint8_t oePin = 9;
+#elif defined(ARDUINO_TEENSY41)
+ uint8_t rgbPins[] = {26, 27, 38, 20, 21, 22}; // A12-14, A6-A8
+ uint8_t addrPins[] = {2, 3, 4, 5};
+ uint8_t clockPin = 23; // A9
+ uint8_t latchPin = 6;
+ uint8_t oePin = 9;
+#endif
+
+/* ----------------------------------------------------------------------
+Matrix initialization is explained EXTENSIVELY in "simple" example sketch!
+It's very similar here, but we're passing an extra argument to define the
+matrix tiling along the vertical axis: -2 means there are two matrices
+(or rows of matrices) arranged in a "serpentine" path (the second matrix
+is rotated 180 degrees relative to the first, and positioned below).
+A positive 2 would indicate a "progressive" path (both matrices are
+oriented the same way), but usually requires longer cables.
+------------------------------------------------------------------------- */
+
+Adafruit_Protomatter matrix(
+ 64, // Width of matrix (or matrices, if tiled horizontally)
+ 6, // Bit depth, 1-6
+ 1, rgbPins, // # of matrix chains, array of 6 RGB pins for each
+ 4, addrPins, // # of address pins (height is inferred), array of pins
+ clockPin, latchPin, oePin, // Other matrix control pins
+ false, // No double-buffering here (see "doublebuffer" example)
+ -2); // Row tiling: two rows in "serpentine" path
+
+// SETUP - RUNS ONCE AT PROGRAM START --------------------------------------
+
+void setup(void) {
+ Serial.begin(9600);
+
+ // Initialize matrix...
+ ProtomatterStatus status = matrix.begin();
+ Serial.print("Protomatter begin() status: ");
+ Serial.println((int)status);
+ if(status != PROTOMATTER_OK) {
+ // DO NOT CONTINUE if matrix setup encountered an error.
+ for(;;);
+ }
+
+ // Since this program has no animation, all the drawing can be done
+ // here in setup() rather than loop(). It's just a few basic shapes
+ // that span across the matrices...nothing showy, the goal of this
+ // sketch is just to demonstrate tiling basics.
+
+ matrix.drawLine(0, 0, matrix.width() - 1, matrix.height() - 1,
+ matrix.color565(255, 0, 0)); // Red line
+ matrix.drawLine(matrix.width() - 1, 0, 0, matrix.height() - 1,
+ matrix.color565(0, 0, 255)); // Blue line
+ int radius = min(matrix.width(), matrix.height()) / 2;
+ matrix.drawCircle(matrix.width() / 2, matrix.height() / 2, radius,
+ matrix.color565(0, 255, 0)); // Green circle
+
+ // AFTER DRAWING, A show() CALL IS REQUIRED TO UPDATE THE MATRIX!
+
+ matrix.show(); // Copy data to matrix buffers
+}
+
+// LOOP - RUNS REPEATEDLY AFTER SETUP --------------------------------------
+
+void loop(void) {
+ // Since there's nothing more to be drawn, this loop() function just
+ // prints the approximate refresh rate of the matrix at current settings.
+ Serial.print("Refresh FPS = ~");
+ Serial.println(matrix.getFrameCount());
+ delay(1000);
+}