Interactive Color LED grid with IR touch sensing

My wife wanted some hardware to program with processing. I wanted to design some PCBs

Similar projects worth following
This project is an attempt to make a piece of interactive electronic art using custom PCBs and processing to do the interactive control.

The final product is a assembly of 9 PCBs for the display and a Teensy 3.2 to drive everything. Future work will include a RaspPi or similar to run the processing code.

I've actually been working on this for nearly a year, so I'm slowly catching up on project logs below.

  • 1 × Teensy 3.2
  • 225 × WS2812B
  • 63 × LM339 Amplifier and Linear ICs / Comparator ICs
  • 36 × 74LV165A Logic ICs / Flip-Flops, Latches, Registers

  • Resurrection

    engunneer01/21/2018 at 18:40 2 comments

    After a ling delay, this project is being resumed. As of yet, I have not been able to get a working diffuser for the front that is transparent to IR for the touch sensing and semi-opaque or translucent white for the colors. Since the LEDs work well enough and I already have a frame for the assembly, I'm moving on to just making it a programmable art display.

    I installed a 5mm thick light diffusion panel in the front, and finally drilled holes to mount the board in the frame with small screws. The resulting gap is about 40mm between the front of the LEDs and the back of the diffuser.

    I also picked up a Raspberry Pi Zero W to use as the main CPU. The Pi will run Processing on Rasbian, and will

    Read more »

  • 1.21 gigawatts

    engunneer09/30/2016 at 02:52 0 comments

    The new brackets are printed and work fine for keeping the board centered in the frame.

    I failed to mention in the last post that one of the reasons I made the brackets was that the assembly got damaged, and all the connections between the boards saw heavy stresses. Quite a few pads got ripped off of the edges of the boards.

    I hit each joint with the soldering iron to figure out what pads were gone, and then scraped the solder mask off each bad ground joint to make a new connection.

    Read more »

  • Brackets

    engunneer09/18/2016 at 01:19 0 comments

    I have a 3d printer that hadn't been used in over a year. After a brief round of troubleshooting a bad motor driver, I was actually able to design and print some brackets for the LED board without much trouble. My design tool of choice is Designspark Mechanical (it's a stripped down but free version of Spaceclaim, which is amazing.)

    I started with a basic bracket to join the four sets of inner corners. The cutout is to get around an LED that is a tad close to the corner mounting holes.

    I then made

    Read more »

  • Sometimes things just work

    engunneer07/25/2016 at 03:12 0 comments

    I finished routing the DAC voltage to all 9 boards, and decreased the resistance of the pull-up on the LM339 used as a voltage follower to 1K. I've increased the sensing sweep to 16 steps (but the first step is always 0V). I also updated the serial interface on both ends to ship out the touch level data, which involved removing all the unpacking code. I've captured the analog sweep on the scope with and without the serial connection active.

    Without serial data: 53Hz internal refresh rate:

    Read more »

  • Dynamic sensing

    engunneer07/21/2016 at 03:11 0 comments

    What I'd really like to do is the full dynamic depth sensing. The idea is simple enough - vary the DAC voltage that is used as the threshold sent to all boards, and then capture what the voltage level was when the touch was first seen. I think this means sweeping from near to far. Since the IR sensors read closer to 0V when near, this should be an increasing voltage sweep. For this to be effective, I would want to get as many measurements as possible between frames of display.

    The starting point is to measure what the current refresh time is, and then see how fast I can make it. The WS2812 output is fairly fixed, as I need to send out 225*24 bits at the ~800kHz data rate. A quick measure on the scope shows that the LED output takes about 7ms, and that I start sending a new frame every 9.5ms. This implies that the IR only takes 2.5ms to read, but was also measured with no serial data going.

    Read more »

  • Adaptive sensing

    engunneer07/20/2016 at 02:07 0 comments

    (Unlike earlier project logs, this is happening in real-time, and not a post about a previously occurring event)

    In earlier discussions with my wife, when the project was in a "moving along quickly" phase, we had the idea that maybe the board would need to be smart enough to auto tune the IR sensitivity. The current scheme has a single 10K pot on each of the 9 boards, run in parallel to all 25 comparators on that board. Each 10K pot is a single turn, and is hooked to the 5V rail, so they can be pretty touchy...

    Read more »

  • The home stretch

    engunneer07/13/2016 at 02:36 0 comments

    (June 2016)

    I finally decided that the sparkfun level convertor was to blame for the bad clock bits. Yes, I know the clock wasn't even going through the level convertor, but the data was. I removed the PCB with prejudice. As I mentioned before, the shift registers are fine with 3.3V control signals, so I just needed to change the remaining two signals to the right voltage. The serial feedback from the shift registers was taken care of by a simple 5V->3.3V voltage divider. The speeds I'm talking about are not going to mind this at all.

    The WS2812 remained as the last signal that needed a boost. As you can find many places online, there are standard ways as well as tricks for boosting the voltage up, ranging from a transistor to using a WS2812 powered off of a slightly lower supply rail to act as a buffer. I considered using a LM339 that was spare on my PCB anyway, but knew there must be something simpler.

    Read more »

  • Where bits go to die

    engunneer07/11/2016 at 03:34 0 comments

    (March 2016)

    When the Grid was running on the Arduino, the very first pixel of the last board in the chain seemed to always want to trigger differently than the rest. Otherwise, it seemed to work just fine (low bitrate not withstanding).

    When I upgraded to the Teensy, I had to do somthing about the 3.3V to 5V logic level conversion. The LED board and all it's chips are 5V, and the Teensy 3.0 is 3.3V. I had one of these sparkfun level translator boards on hand, so I started there. I didn't actually need the bidirectional feature on any pin, but the 4 channels and ease of use looked great. Neither of the libraries I used on the Arduino were exactly the right fit for the Teensy, so i had to also write a bunch of new code.

    Read more »

  • And I'll form the Head!

    engunneer07/10/2016 at 01:05 0 comments

    (January 2016)

    Progress! Each board was tested, debugged, repaired, and marked. I put together a new piece of test code that can handle multiple panels at a time, and started connecting the boards together.

    I designed them to be joined together with solid wire along 3 bridges on each edge. These are also connected to the power planes, so acts as power distribution. Early in the design process, I thought I'd be clever and come up with a series or solder jumpers and traces going to all four edges to make all the signals be passed along.

    Read more »

  • ​In which I can finally get to the code

    engunneer06/30/2016 at 01:04 0 comments

    (November 2015)

    Or not.

    I wanted to get each panel tested individually before ganging them together. For this, I used an Arduino Leonardo because I had one handy. I wrote the basic functionality without any of the serial interface, and a simple test mode that just lights up any LED with touch data. This leaves the serial port free for debugging, and I can focus on the hardware debugging.

    Since it's just for a single panel, I used Adafruit's NeoPixel library for the WS2812Bs and the Arduino's native ShiftIn for the shift registers. The hardware setup is not dissimilar to this sparkfun tutorial, though that was not the code I followed.

    After some testing, I discovered that the shift registers appeared to be working (I could short high some of the spare bits at the end of the chain), but all the touch sensors always returned 0, even though the comparators should all have been putting out a 1... To the datasheet!

    Read more »

View all 15 project logs

Enjoy this project?



Similar Projects

Does this project spark your interest?

Become a member to follow this project and never miss any updates