{"id":19299203,"url":"https://github.com/bmatcuk/edge-lit-display","last_synced_at":"2026-05-15T11:31:04.237Z","repository":{"id":140013171,"uuid":"132211063","full_name":"bmatcuk/edge-lit-display","owner":"bmatcuk","description":"A laser-etched acrylic edge-lit display including schematics, pcb, and laser cut enclosure.","archived":false,"fork":false,"pushed_at":"2018-05-25T05:02:52.000Z","size":2630,"stargazers_count":0,"open_issues_count":0,"forks_count":0,"subscribers_count":3,"default_branch":"master","last_synced_at":"2025-01-05T22:27:51.616Z","etag":null,"topics":[],"latest_commit_sha":null,"homepage":null,"language":"C++","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"other","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/bmatcuk.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE_CC-BY-NC-SA","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":"2018-05-05T03:26:11.000Z","updated_at":"2018-05-25T05:04:08.000Z","dependencies_parsed_at":null,"dependency_job_id":"99a20415-105e-41c9-8e82-5efa8253a4a4","html_url":"https://github.com/bmatcuk/edge-lit-display","commit_stats":null,"previous_names":[],"tags_count":0,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/bmatcuk%2Fedge-lit-display","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/bmatcuk%2Fedge-lit-display/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/bmatcuk%2Fedge-lit-display/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/bmatcuk%2Fedge-lit-display/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/bmatcuk","download_url":"https://codeload.github.com/bmatcuk/edge-lit-display/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":240400335,"owners_count":19795333,"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","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":[],"created_at":"2024-11-09T23:10:31.673Z","updated_at":"2026-05-15T11:30:59.218Z","avatar_url":"https://github.com/bmatcuk.png","language":"C++","funding_links":[],"categories":[],"sub_categories":[],"readme":"# Edge-lit Display\nThis repository contains everything you need to build an edge-lit display using\nRGB LEDs and laser etched acrylic with a laser cut enclosure.\n\n![lasercat party](finished_display.jpg)\n\n## System Overview\nThe display is controlled by an [ATmega32U4], the same microcontroller used in\nseveral [Arduino] boards. It is flashed as an [Arduino Leonardo] over the ICSP\nheader to make it easier to work with, using an actual [Arduino] as the\nprogrammer. The design surrounding the [ATmega32U4] support circuitry, including\nthe USB connections, is based on the [Arduino Leonardo] schematics.\n\nThe microcontroller communicates with a [TLC5971] over SPI to drive the eight\nRGB LEDs. The [TLC5971] is a 12-channel, constant-current sink, 16-bit PWM LED\ndriver (ie, capable of driving four RGB LEDs at a time). Therefore, the eight\nRGB LEDs are divided into two groups and time-multiplexed by the\nmicrocontroller using two high-side PMOS transistors. This allows us to address\neach channel of each LED individually.\n\nThis circuit is then fitted into a laser cut enclosure with the LEDs directed\ninto the edge of a laser etched acrylic display. The code on the\nmicrocontroller cycles the colors of the LEDs by rotating through all possible\nvalues for \"hue\" in the HCY (hue-chroma-luma) colorspace, and converting to 16-\nbit RGB for transmission to the [TLC5971].\n\nThe whole thing is powered using a standard USB 2.0 cable and includes a\npotentiometer to control the brightness of the LEDs by varying the current-\nsetting resistance of the [TLC5971].\n\n## Schematics\nSchematics were designed in [KiCad] v4. This repository has a dependency on my\nown [part library] and assumes that my [part library] is located in the same\npath as this repository (ie, the `edge-lit display` and `bmatcuk-kicad-library`\ndirectories live in the same directory).\n\nThis first schematic is the [ATmega32U4], USB, and support circuitry:\n\n![Arduino-Compatible Schematic](plots/arduino-compatible-Arduino%20Compatible.svg)\n\nThe next schematic connects the microcontroller to the LEDs, driver, and high-\nside PMOS to time-multiplex the LED groups:\n\n![Edge-lit Display](plots/edge-lit%20display.svg)\n\n## PCB Layout\nThe PCB was designed in [KiCad] v4. This repository has a dependency on my\nown [part library] and assumes that my [part library] is located in the same\npath as this repository (ie, the `edge-lit display` and `bmatcuk-kicad-library`\ndirectories live in the same directory).\n\nThe circuit is laid out as a two-layer design. The front layer contains all of\nthe components and a ground plane with the back layer as a signal layer. This\nis probably the weakest part of the whole project as this is the first time\nI've laid out a circuit with so many surface mount components in a constrained\nspace.\n\n![Edge-lit Display PCB](plots/edge-lit%20display-brd.svg)\n\n## Enclosure\nThe enclosure was designed in [FreeCAD] 0.17 assuming it would be made out of\nMDF wood with a thickness of 0.251in and laser kerf of 0.011in. The screen\nwas designed for acrylic with a thickness of 3mm and a laser kerf of 0.2mm.\nThese values can be easily modified in [FreeCAD] by editing the spreadsheet\ncalled \"Datum\"; the rest of the design will update automatically.\n\nOnce the design was complete, 2D projections were made of each piece and these\nprojections were exported as \"flattened svgs\". The resulting svg was edited in\n[Inkscape] to conform to the format that the manufacturer wanted (ie, to make\nthe cuts blue, for example).\n\nThe svg below might be really difficult to see on your screen because the\nstroke width is only 0.01mm. This was a requirement from where I had the\nparts laser cut.\n\n![Enclosure](enclosure.svg)\n\n## Acrylic Screen\nThe outline of the screen was designed in [FreeCAD] with the enclosure. Once\nthe 2D projection was exported as an svg (as mentioned above), it was imported\ninto [Inkscape] to create the design. Originally, I was going to do some sort\nof cityscape, but then I thought it would be more fun to tie this back to a\nprevious passion project of mine: [lasercat.party] (github: [lasercatparty])!\n\nI edited the photo of the cat in [Photoshop] to remove the background, convert\nto greyscale, and then darken some of the light areas with the burn tool, and\nlighten some of the dark areas with the dodge tool. The image was then imported\ninto [Inkscape] and I used the \"Trace Bitmap\" function to vectorize it. This\nwas an iterative process: adjusting light and dark areas in [Photoshop], re-\nimporting in [Inkscape] to vectorize, etc, until I was happy with the result.\nThe rest of the design was done entirely in [Inkscape]. Then everything was\ngrouped together and flipped horizontally so that it could be etched on the\nback of the acrylic.\n\nThe [Photoshop] file is also included in this repository (cat.psd).\n\nLike above, it may be difficult to make out the edge cuts on your screen\nbecause the stroke width is 0.01mm.\n\n![Screen](screen.svg)\n\n## Manufacturing\nThe first step was getting the PCB, enclosure, and screen manufactured. I sent\nthe gerbers to [ALLPCB.com] for PCB manufacturing. I'm very impressed with them\nand would definitely recommend. I had the boards in my hands in less than a week\nand their prices are very reasonable! The enclosure and screen svgs were sent to\n[Ponoko] for laser cutting and etching. Therefore, the MDF and acrylic\nthicknesses and kerfs match their specs, and the files are formatted to their\nliking (blue for cuts, black for area engraving, red for line engraving; stroke\nwidth of 0.01mm). All electrical components were ordered from [DigiKey]. This\nrepository includes a Bill Of Material file called `edge-lit display.csv` which\nincludes all of the [DigiKey] part numbers. You can upload the file to their\nwebsite to add all of the parts to your cart.\n\n## Build Log\n### Soldering\nWith PCB and components in hand, the next step is soldering the PCB. We want to\nload the [Arduino] bootloader onto our [ATmega32U4], so the first thing we'll\nsolder is the microcontroller and support circuitry. Installing the [Arduino]\nbootloader is done via the ICSP header which uses the SPI pins on the\nmicrocontroller; these pins are also used to control the [TLC5971], so we're\ngoing to leave that and most of the circuitry around it off our board for now.\n\n*Technically*, I think it would be ok to solder everything before installing\nthe bootloader because it's unlikely that any of the data will make sense to\nthe [TLC5971] and the microcontroller will tri-state all of the IO pins while\nflashing so all of the LEDs will be off anyway, but why risk it? Besides,\npausing to flash the microcontroller mid-solder gives us an opportunity to\nmake sure everything is working up to that point; troubleshooting will be\neasier with fewer components on the board.\n\nThat said, I soldered all of the passives (resistors, capacitors, and the\nferrite beads), the varistors, fuse, ICSP header, diode, and [ATmega32U4]. I\ntechnically didn't need to solder all of the passive components, since some of\nthem are support circuitry for the [TLC5971], but it was easier to solder them\nall together. I then tested for any bridged pins with a multimeter, and, when I\nwas satisfied everything looked good, I moved on to installing the bootloader.\n\nSome tips for soldering: I did most of the soldering with a soldering iron\n(my trusty [Hakko FX-888D]) with a beveled tip (the [T18-CF15]). It's possible\nto solder everything this way with the liberal application of flux (I have a\n[Kester 186 Flux Pen]) - search for \"drag soldering\" tutorials. I found it\nwas easier to solder first using this method, and then touch things up a bit\nwith a hot air rework station (I'm using an [Aoyue Int866]). For example, I\nsoldered the [ATmega32U4] a little off-center; very hard to fix with an iron,\nbut short work for the hot air station.\n\n### The Bootloader\nTo install the bootloader, I flashed an [Arduino Uno] with the ArduinoISP. To\ndo this in the [Arduino] IDE, select the Uno as the device and open the\nArduinoISP example sketch. Make sure all of the `#define`s are right at the\ntop of the file and then upload the sketch to the Uno. Next, disconnect the\nUno from your computer and make the following connections:\n* 5V on the Uno to pin 2 of the ICSP\n* GND on the Uno to pin 6 on the ICSP\n* D10 on the Uno (reset signal) to pin 5 on the ICSP\n* D11 on the Uno (MOSI) to pin 4 on the ICSP\n* D12 on the Uno (MISO) to pin 1 on the ICSP\n* D13 on the Uno (SCK) to pin 3 on the ICSP\n\nOther [Arduino]s can be used in place of the [Arduino Uno] using a similar\nprocess. You just need to figure out what pins are used for SPI (MOSI, MISO,\nand SCK) and the reset pin. You can actually change the pins in the `#define`s\nat the top of the ArduinoISP sketch.\n\nAnyway, once the wired connections are made, reconnect the [Arduino Uno] to\nyour computer. Select the [Arduino Leonardo] from the device menu, set the port\nto where the Uno is connected, change \"programmer\" to \"Arduino as ISP\", and\nselect \"Burn Bootloader\". This process will take a couple minutes, but it will\ntest to make sure installation was successful, so if you don't see any errors,\nyou know your soldering, at least up to this point, is good.\n\n![Installing the Bootloader](build_log/bootloader.jpg)\n\n### Soldering Part Deux\nAfter the bootloader is installed, disconnect the [Arduino Uno] and solder\nthe rest of the components. Now the sketch can be flashed via USB! Connect the\nPCB to your computer via USB. If all your soldering went well, you should be\nable to flash the code to it by selecting the [Arduino Leonardo] device from the\n[Arduino] IDE and uploading. You should hopefully see the LEDs cycle through\nall of the colors of the rainbow!\n\n![Completed Board](build_log/completed-board.jpg)\n\n### Constructing the Enclosure\nPutting the case together is fairly straightforward, but you may find that the\nslots are fairly tight. The company I ordered my lasercut parts from ([Ponoko])\ndidn't have very accurate measurements for wood thickness or kerf. I found the\nwood they sent me was around 1.5mm thicker then I was expecting. I had to use a\nwood file to make the pieces fit together, and, even then, they were so snug I\ndidn't bother using any glue.\n\nBasically, you want to put the bottom and sides together, gluing if necessary.\nI put the lasercut side (with the burn marks) on the inside to hide it. Then\nfit the PCB in. I had planned on using some M2 nylon stand-offs to mount the\nPCB (hence the little holes in the top and bottom pieces), but the holes ended\nup being too small to thread the stand-offs through. So, instead, I just\nhammered some nails through the bottom to keep the PCB from sliding around.\n\nNext, slide the acrylic display through the top piece and put the top of the\nenclosure on. The slots on the side pieces should keep the acrylic from falling\nover, and should line it up to be right on top of the LEDs. If you are\nsucessfully using stand-offs, you can have some stand-offs go to the top of the\nenclosure, too.\n\nI adjusted some of the calculations in the [FreeCAD] model after I received my\nlasercut enclosure to hopefully make it less snug. I also regenerated the\nenclosure.svg file, but I haven't tried getting another enclosure made up.\n\n## License\nSoftware in this repository is licensed under the [MIT] license. Hardware\nschematics are released under a Creative Commons Attribution and Share Alike\nlicense ([CC-BY-SA] 4.0). PCB layout designs, enclosure designs, and acrylic\ndisplay designs are licensed under a Creative Commons Attribution, Non-\nCommercial, Share Alike license ([CC-BY-NC-SA] 4.0).\n\n[ALLPCB.com]: http://www.allpcb.com/\n[ATmega32U4]: http://www.microchip.com/wwwproducts/en/ATmega32u4\n[Aoyue Int866]: https://www.aoyue.eu/aoyue-int866-3in1-rework-station-lead-free-hot-air-soldering-station.html\n[Arduino Leonardo]: https://store.arduino.cc/usa/arduino-leonardo-with-headers\n[Arduino Uno]: https://store.arduino.cc/usa/arduino-uno-rev3\n[Arduino]: https://www.arduino.cc/\n[CC-BY-NC-SA]: https://creativecommons.org/licenses/by-nc-sa/4.0/\n[CC-BY-SA]: https://creativecommons.org/licenses/by-sa/4.0/\n[DigiKey]: https://www.digikey.com/\n[FreeCAD]: https://www.freecadweb.org/\n[Hakko FX-888D]: https://www.hakkousa.com/products/soldering/hakko-fx-888d-digital-soldering-station-10145.html\n[Inkscape]: https://inkscape.org/\n[Kester 186 Flux Pen]: https://www.kester.com/products/product/186-flux-pen\n[KiCad]: http://kicad-pcb.org/\n[MIT]: https://choosealicense.com/licenses/mit/\n[Photoshop]: https://www.adobe.com/products/photoshop.html\n[Ponoko]: https://www.ponoko.com/\n[T18-CF15]: https://www.hakkousa.com/products/soldering-iron-tips/t18-series/t18-cf15.html\n[TLC5971]: http://www.ti.com/product/TLC5971\n[lasercat.party]: http://lasercat.party\n[lasercatparty]: https://github.com/bmatcuk/lasercatparty\n[part library]: https://github.com/bmatcuk/bmatcuk-kicad-library/\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fbmatcuk%2Fedge-lit-display","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fbmatcuk%2Fedge-lit-display","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fbmatcuk%2Fedge-lit-display/lists"}