DIY "TV" cabinet project housing a hidden motorized screen and UST (ultra-short-throw) projector in motorized drawer.
From my childhood I have dreamed of my own home cinema. About two years ago I have decided to embark on an adventure to slowly built it. Since we lived at that moment in small flat and planned to move some time soon, creating dedicated "room based" setup was not an option. It was around that time that I discovered Ultra Short Throw (UST) projectors that would match all my requirements and slowly an idea started to grow in my head:
What if I could place it into a cabinet and have very clean setup with all the components hidden when not using?
And that is what I have started to work on over weekends and evenings for past 9 months.
Here I plan to share my final design and firmware code for anybody who would like to replicate (and possibly improve on) my work. I won't be detailing it to the "step-by-step" guide, but leave resources here for people who know what to do and how to do it.
I have to warn you though. The project is very tailored to the specific components that I used and describe later. Any deviation from those components require proper modification of other parameters!
Every centimeter makes big difference in the UST projector's screen size and position!
I am still novice when comes to wood working, so I have decided to leave the build of the cabinet to my friend cabinetmaker. Therefore, I have design it and modeled it in Fusion 360 as it was crucial to get the dimensions right because UST projector's viewports are very sensitive to any even small deviation and I wanted to obviously maximize the screen's utilization.
This is a render of the model:
You can find the Fusion model as file here or as online model here. But be aware it is not complete model that could be used as blueprint for recreating the cabinet! It served more like a mock to understand the dimension requirements.
The brain of the cabinet is custom build circuit around ESP32. I have decided to program its firmware with MicroPython as Python is close to my heart. The circuit serves as integration point of several things:
Originally my design goal was to have self-contained circuit. Later on, I have deviated from this goal as I have decided to scratch my original approach for triggering openning/closing the cabinet using monitoring of the AC power line to the projector and doing decision based on the current passing through that line.
I have instead opted to expose the above functionalities as Home Assistant entities and use the Home Assistant integration to Samsung's Tizen that runs on the projector for triggering the proper actions. Unfortunately it is not so reliable as sometimes the events from Tizen are not triggered or are triggered multiple times. I had version of the firmware that was ready for the current-sensing approach, so if you would be interested in that have a look on this commit. But be aware even though it was functional, it was not properly tested and finished.
The final schema which includes also the component for measuring the projector's line current mentioned above is here:
You can download its export from EasyEDA here.
Some pictures of prototyping and final assembly:
This project heavily relies on Home Assistant for orchestration and integration. Bellow you can see the overview and capabilities that are exposed over Home Assistant:
As I said I won't provide "step-by-step" guideline here, but here are some pointers for reproducing this, mainly related to firmware.
Fork this repo. The important configuration needs to be placed in /app/secrets.py
file. This
file should not be commited (and is currently in .gitignore
) as it contains sensitive configuration. This configuration
will be persisted over OTA updates. Content of this file shoudl be:
# WiFi settings
WIFI_SSID = "" # YOUR WIFI NAME
WIFI_PASS = "" # YOUR WIFI PASSWORD
# MQTT settings
MQTT_BROKER = "" # NODE WHERE YOU RUN HOME-ASSISTANT'S MQTT
MQTT_USER = ""
MQTT_PASS = ""
# Syslog logging
SYSLOG_HOST = "" # NODE WHERE YOU RUN SYSLOG COLLECTOR
SYSLOG_PORT = ""
OTA updates are sourced from GitHub Releases. For creating those there is Release-Please action which creates
Release PR that when you merge it create new release. With the new release a new firmware resource is build
with CI, which compiles the Python files .py
into .mpy
files.
For updating the firmware you need to press in Home Assistant "Install" button on the Firmware entity.
You need to point for the OTA updates to your forked repo in the /main.py
file you need to tweak the OTA_REPO
variable.