Introduction: The Component Storage System

The Ultimate Component Storage System is a unique solution for organizing and storing electronic components. The custom software allows for cataloging of components with a built-in search function to gain quick access to specific components. LEDs above each drawer are used to indicate the location and status of individual, or a group, of components.



Thank you to DFRobot for providing the following parts for this project!

2 x 5V @ 3A USB Power Supply

Available here (affiliate link):

1 x Raspberry Pi 4 Model B

Available here (affiliate link):

1 x 8.9" 1920x1200 IPS Touch Display

Available here (affiliate link):

1 x WS2812b LED-Strip, 30LED/m

Available on Ebay

All files for this project can be found on my GitHub:

Step 1: The Idea!


I have always had trouble organizing and storing my components. The photo above shows the state of my current component storage solution. While having components in multiple boxes all over the workshop might work for some, it has always been an inefficiency in my own workflow. So, I came up with a project to solve this problem.

The Idea

The idea was to store all components in the same storage system. The storage system would be composed of many drawers and each drawer would have an LED mounted above it.

The user would use a custom software to interact with the storage system. When the user conducts a component search, the system displays the top search results on the screen. At the same time, the LEDs corresponding to the search turn on, thus indicating the location of the component within the storage system.

Besides displaying the location, the color of the LEDs would indicate the status (i.e quantity) of each component as well.

The requirements

The idea was broken down into the following requirements which this project aims to satisfy:

  • Create a simple storage and retrievability system for small and medium-sized components.
  • Create a software interface for cataloging and searching through the components.
  • Use RGB LEDs to indicate the location and status of each component.

Step 2: Design - Storage System

I began by 3D modeling the storage system itself.

I designed the storage system in the form of a matrix of 3D-printed drawers in varying sizes. The drawers are positioned in a 35×12 grid for a total of 310 drawers. That is enough space to store all of my current components and leave space for future expansion.

The spacing between drawers in the vertical direction is designed to accommodate a 10mm wide LED-strip above each row of drawers. The spacing in the horizontal direction is designed to equal the LED spacing on the LED-strip. I figured that using a 30LED/meter LED-strip would make for an adequate size of each drawer.

All drawers and drawer holders are designed to be printed separately and assembled into desired configuration. The drawers are available in different sizes and any configuration of drawers will work with the software after some code changes.

To minimize filament consumption and print time, the wall thickness on all 3D-printed parts has been kept to a minimum. Once assembled, the overall storage unit is sturdy enough to house most lightweight and mediumweight components.

Step 3: Design - Display Arm

Since the storage system requires an HDMI display for user interface, I decided to design an adjustable arm to mount the display and electronics to.

All parts of the display arm were designed to be 3D-printed and assembled with M8 bolts and nuts. The display arm is designed to hold the HDMI display, the Raspberry Pi and all the wiring.

Parts of the display arm were based on this design from Thingiverse.

Step 4: 3D-Printing & Painting

After 3D modeling all the parts, it was time to start printing the hundreds of drawers.

I used my Prusa MK2S for all the 3D-printed parts of this project. I used PLA filament with 0.2mm layer height and 0% infill.

Support material was only needed on the medium-sized drawer holder and the large-sized drawer holder. I determined the perfect tolerance between drawers and drawer holders to be 0.2mm. Your mileage may very depending on your 3D-printer.

After printing all of the separate parts, I used superglue to assemble together all drawer holders into the 35×12 grid.

I did not have enough filament of the same color, so I decided to add a coat of black paint to give the storage system an even look.

For reference, my whole 35×12 storage system with 310 drawers required about 5kg of filament to print.

Step 5: The Electronics

As for the electronics, the choice of hardware was fairly straightforward.

I chose a Raspberry Pi 4 Model B connected to an HDMI display as the user interface. You could also use a headless Raspberry Pi and interface with the system via SSH. Older versions of the Raspberry Pi may also work if they are able to run Python 3. The Neopixel library used in this project is not supported on Python 2.

For the LEDs, I chose the 30LED/m, WS2812b, LED-strip for no particular reason. Other LED-strips will also work if they are supported by the Neopixel library.

As for the wiring, three USB-C cables are used to provide power to the Raspberry Pi, the display and the LEDs. An HDMI cable is used to connect the display and the Raspberry Pi.

The Arduino Uno and USB cable shown in the photo are optional. You could send data to the Arduino via Serial and use it as the LED controller. For simplicity, I chose not to use the Arduino in this project.

A good design practice would be to include a level shifter on the data line for the LEDs since the Raspberry Pi GPIO is only 3V3. I have not had any problems so far but if I do, I will implement something like the "74AHCT125 Quad Level-Shifter".

A guide on using Neopixel with Python and the Raspberry Pi exists here.

Step 6: The Software Overview

While all of the parts were being 3D-printed, I worked on the software that controls the entire system.

The software is written in Python 3 and is meant to run as a console application on the Raspberry Pi. The functionality of the software can be broken down into the following parts:

  • Read user input
  • Read from file / write to file
  • Output the results to the console and the LEDs

I will give a simplified description of each step below.

Read user input

When a user input is received, a series of Regex expressions are used to determine the users request. The user has the following functions to choose from:

FunctionCall Example
List all components: all
Search a component by ID: ID22
Search a component by parameters: R, 22, SMD
Change the quantity of a component: ID35+10
Add a new component: PI89:PI90, 100pcs, C, 470u, SMD:add
Remove an existing component: ID10:rm
Syntax help: help

Read from file / write to file

The component data is stored in a .txt file. Depending on the input, the software either searches for data in the file or writes new data to the file. New data is written when removing, adding or modifying components.

Output the results

The software outputs the results from the operation to the console. If a search has been conducted, it also generates and outputs the LED data at the same time.

Step 7: The Data Structure

The component data in the .txt file follows a specific structure. Each row of the file contains information about a single component that is stored within the system. Each component is composed of several parameters that are separated by a comma.

Some parameters are mandatory and are used by the software to keep track of component location and LED colors. They must therefore follow a specific format.

The mandatory parameters and their formats are:

  • ID (in the format IDX where X is one or more digits)
    • The ID acts as a unique identifier for each component. It is used when searching and deleting components.
  • PI (in the format PIX:X where X is one or more digits)
    • The PI describes which LEDs correspond to which component.
  • Quantity (in the format Xpcs where X is one or more digits)
    • The quantity is used to determine the LED color for each component.

Other parameters are simply meant for the user. The software does not need to interract with those and their format is therefore optional.

Step 8: Assembly - Electronics

The assembly can be divided into two parts, the first part being the display arm and the electronics.

I assembled the 3D-printed parts using the required bolts and nuts. I then attached the 3D-printed arm to the HDMI-display using 4mm screws. The Raspberry Pi was attached in a convenient location and the wiring was connected according to the diagram in "Step 5: The Electronics".

An attempt was made to cable manage the wiring by coiling it around the display bracket. I used cable ties to guide the power and data cables along the display arm for connecting to the rest of the storage system.

Step 9: Assembly - Storage System

The second part of the assembly is the storage system itself.

Using the included screw holes, I attached all of the separate drawer assemblies onto a piece of painted plywood which acts as a backboard.

After that, I attached the LED-strips on each row and connected all of the rows together into one single LED-strip. The configuration of each row and direction of the LED-strip does not matter since it can be reconfigured in software.

To finish of the assembly, I attached the display arm with the electronics on the side of the plywood backboard.

I sorted all of the components into their new home and added them to the .txt file database.

Step 10: Conslusion

The project is now finished and I am really pleased with how it turned out!

I have only had time to use my new storage system for a few days and it has been working great. I am excited to see how this system changes my workflow in the future since that was the purpose of this whole project.

I hope you enjoyed this project and if you have any thoughts, comments, or questions, please leave them below.

Build a Tool Contest

Participated in the
Build a Tool Contest