I will use Figma to make these mock-ups, as I can easily create a component for the LED and the the auto-layout tool to create the desired grid for the matrix
Assuming I select the
I learn that, although I can double up for an even maze, I would need many more pixels (and similarly matrix size) to have enough paths
I do notice however that the odd maze is quite hard to read, perhaps a smaller pitch will make this better
I will plan on moving forward with a single-pixel line width, and design for an odd-dimensioned matrix such that gaps work out as desired
With a pitch of
This definitely looks better, but I think the maze could/should still be more readable than what it is
I chose to keep the row count to
As these are not addressable LEDs (ie incorporate a controller within the LED device), they do not require local decoupling—so I do not need to account for this in designing the pitch
Reducing the pitch to
I am happy with this, I think this pitch is a good balance between being realistic (assembly, pixel count—price), and being readable with a decent resolution
The row/column counts of 21 and 35 have also been deliberately chosen as I can use three 36-channel (ie 12 RGB LED) drivers to drive the full row, or two 36-channel drivers to drive a full column
In terms of the driving mechanism, my first idea would be to use the below topology, with three 36-channel drivers to drive all the columns at once, and scan through the 21 rows with a set of three 8-bit shift registers chained together
My next step will be to part out the LED Drivers and Shift Registers that I want to use
A potential improvement (scan-wise) would be to add three more drivers such that I can split the rows in half, and display two whole rows at once (ie scanning through two lines at once), which would improve the refresh/scan rate of the display, at a cost of component count/cost/driver frequency
As I am just wanting to scan through the rows one after another and do not need to load some arbitrary data into the shift register before enabling the output all at once, I will not need an output storage register
1
at any given instantI also do not need a tri-state output, as the shift register output will be the only thing connected to the common anode pins (probably through a buffer transistor)
From the LED driver perspective—I may want to use more drivers simply such that each driver is controlling less than 32 channels, so that I can represent it using a uint32_t
rather than needing to use a whole uint64_t
and wasting 28 bits (for a total of 87 wasted bits)
#define DISPLAY_TOTAL_ROWS 35
#define DISPLAY_TOTAL_COLUMNS 21
#define DISPLAY_PIXEL_TOTAL_CHANNELS 3
typedef uint128_t row_t;
typedef uint32_t column_t;
#define DISPLAY_DRIVER_TOTAL_ONE 12 * DISPLAY_PIXEL_TOTAL_CHANNELS
#define DISPLAY_DRIVER_TOTAL_TWO 11 * DISPLAY_PIXEL_TOTAL_CHANNELS
#define DISPLAY_DRIVER_TOTAL_THREE 12 * DISPLAY_PIXEL_TOTAL_CHANNELS
typedef uint64_t driver_t; // !
row_t currentRow = 0b010/* ... */001;
driver_t driverOne = (currentRow <<= DISPLAY_DRIVER_TOTAL_ONE);
driver_t driverTwo = (currentRow <<= DISPLAY_DRIVER_TOTAL_TWO);
driver_t driverThree = (currentRow <<= DISPLAY_DRIVER_TOTAL_THREE);
Having selected my Shift Registers and LED Drivers to produce the final layout shown below, I will now work through the below design tasks to determine my matrix Design Parameters.
TLC5955
and TLC5947
datasheets for guidance on design procedure/power supply recommendations etc.