
Smart 360 Photo Turntable with ESP32, ESPHome & Home Assistant
Build a Smart 360 Photo Turntable powered by ESP32, ESPHome, and Home Assistant for automated product photography. Perfect for smooth, consistent, and hands-free image capture.
I recently built the Motorized Photo / Video Turntable for taking 360° videos of dev boards and other electronics. It looked fine with the original Arduino Nano, but since I pretty much use the ESP32 for everything these days (naturally, it’s ESPBoards after all), I decided to rebuild it around an ESP32, ESPHome, and Home Assistant for a smarter and more flexible setup (you’ll see why soon...).
To keep it practical, I added a tactile push button for quick local control. Anjd the result is a WiFi-connected turntable that integrates well with automated product spins, timelapse rigs, or just making camera work hands-free.
Original Design Reference #
The foundation for this build came from a great minimalist design using a Stepper motor, a 608 bearing, and a 3D-printed frame. Super clean and effective!
🔗 Motorized Turntable with 608 Bearing – Printables
Big thanks to the original designer - this made a perfect base for hacking in smarter control.
What I Changed #
🧠 Hardware Upgrade #
- Swapped out the Arduino Nano for an ESP32 (naturally).
- Added a momentary push button for manual triggering - useful for quick spins during setup or demos.
📲 Smart Control #
- Flashed the ESP32 with ESPHome for seamless integration.
- Hooked it into Home Assistant, exposing controls for:
- Start / Stop buttons
- Home button
- Speed Control
I went with ESPHome + Home Assistant specifically because it makes speed control super intuitive - just throw in a slider in the Home Assistant UI, no custom frontend needed.
The setup is now fully controllable over WiFi, while keeping a physical button for local fallback.
Required Parts #
Here’s what I used to keep things simple and avoid a full redesign — I wanted a ready-to-use device, not another half-finished prototype. That’s why I went with plug-and-play parts and... plenty of hot glue. 😄
🧩 Mechanical #

3D printed turntable base + casing
608 Bearings
You will need 3x 608 Bearings. A 608 bearing is one of the most common standardized ball bearings, especially known for its use in skateboards, rollerblades, 3D printer parts, and small electric motors.
Prices are subject to change. Check current prices:
⚙️ Electronics #
ESP32 Development Board
Any common development board variant works, but we are using the Wemos ESP32 S2 mini (Clone) this time. No specific reason, it was simply the first one laying around.
Prices are subject to change. Check current prices:
Stepper Motor (28BYJ-48) + ULN2003 Driver Board
A cheap and reliable choice for slow, precise movement. Comes together with the 28BYJ-48 which talks nicely to the ESP32.
Prices are subject to change. Check current prices:
Power Socket
5.5 x 2.1 mm barrel jack socket.
Prices are subject to change. Check current prices:
Push Button
Basic momentary switch wired to a digital pin for manual control. 12 x 12 x 7.3mm recommended
Prices are subject to change. Check current prices:
🔌 Wiring & Power #
Power supply
5V regulated, DC jack, ideally 1A or more.
Prices are subject to change. Check current prices:
DuPont Jumper Wires
All connections are made with Dupont wires, no soldering required.
Prices are subject to change. Check current prices:
Hot Glue Gun
For locking everything in place without a custom PCB or case.
Prices are subject to change. Check current prices:
Sometimes hot glue is the best "firmware" - especially when you're aiming for a functional build, not a polished product.
Assembly #
Wiring everything up was refreshingly simple - one of those rare builds where things just work without needing custom PCBs or adapters.
- Connected the ESP32 to the ULN2003 driver board:
- GPIOs → IN1 through IN4 on the driver
- Make sure to use the correct sequence and match the
pin_a
topin_d
in your YAML
- Wired up a momentary push button to a GPIO with internal pull-up enabled (saves a resistor)
- Added a DC barrel jack for clean power input
- Shared ground between the ESP32 and stepper motor power
- Powered the whole setup from a simple 5V wall adapter — plenty for this little stepper
Since I wasn’t aiming to redesign the whole turntable, I just tucked the electronics inside the base and secured things with hot glue. Not the most elegant, but it’s fast, solid, and it works.
ESPHome Configuration #
Here’s a streamlined version of my ESPHome
YAML config that handles everything - stepper motor control, speed tuning, Home Assistant buttons, and a local push button with dual behavior (short press to spin / stop, long press to return to "home").
You can drop this directly into your ESPHome setup and tweak the GPIOs or speed range to match your hardware. Just don’t forget to:
- Set your Wi-Fi SSID and password (or use secrets if you’ve already got those configured)
- Replace the placeholder API key and OTA password if you plan to use encrypted communication or over-the-air updates
- Double-check that the GPIO pins match your ESP32 variant and ULN2003 wiring
esphome:
name: 360-pod
friendly_name: 360_Pod
esp32:
board: esp32-s2-saola-1
framework:
type: arduino
logger:
api:
encryption:
key: "YOUR_GENERATED_API_KEY"
ota:
password: "YOUR_OTA_PASSWORD"
wifi:
ssid: "YOUR_WIFI_SSID"
password: "YOUR_WIFI_PASSWORD"
captive_portal:
globals:
- id: is_spinning
type: bool
initial_value: 'false'
stepper:
- platform: uln2003
id: my_stepper
pin_a: GPIO9
pin_b: GPIO7
pin_c: GPIO5
pin_d: GPIO3
max_speed: 250 steps/s
step_mode: HALF_STEP
binary_sensor:
- platform: gpio
pin:
number: GPIO12
mode: INPUT_PULLUP
inverted: true
id: control_button
on_click:
- min_length: 50ms
max_length: 1500ms
then:
- script.execute: toggle_spin
- min_length: 1500ms
max_length: 5000ms
then:
- script.execute: go_home
number:
- platform: template
name: "Stepper Speed"
id: stepper_speed
min_value: 50
max_value: 1020
step: 10
unit_of_measurement: "steps/s"
initial_value: 120
optimistic: true
on_value:
then:
- stepper.set_speed:
id: my_stepper
speed: !lambda 'return id(stepper_speed).state;'
button:
- platform: template
name: "Toggle Spin"
on_press:
then:
- script.execute: toggle_spin
- platform: template
name: "Reset to Home"
on_press:
then:
- script.execute: go_home
script:
- id: toggle_spin
then:
- if:
condition:
lambda: 'return id(is_spinning);'
then:
- stepper.set_target:
id: my_stepper
target: !lambda 'return id(my_stepper).current_position;'
- globals.set:
id: is_spinning
value: 'false'
else:
- globals.set:
id: is_spinning
value: 'true'
- stepper.set_target:
id: my_stepper
target: !lambda 'return id(my_stepper).current_position + 4096;'
- id: go_home
then:
- stepper.set_target:
id: my_stepper
target: 0
- globals.set:
id: is_spinning
value: 'false'
These are the main interactions defined in the ESPHome config - both from the hardware side (physical button) and Home Assistant UI. Here's how it all works together in practice:
- Short press the physical button: rotates one full step (360° or one revolution). If you short press while spinning, it will stop.
- Long press: resets position back to 0 (great for consistent photo alignment).
- The "Stepper Speed" number in HA gives you live PWM speed control right from the dashboard.
Photos & Demo #
Here’s where you can see the build in action—from the inside wiring to a smooth 360° rotation shot triggered via Home Assistant.
🎥 Demo Video
This video was filmed using the smart turntable itself—Home Assistant triggered, ESP32-controlled, and totally hands-free.
Future Improvements #
A few ideas I'm considering for the next iteration:
- 🎥 Add an ESP32-CAM to the setup - mount it directly on or near the turntable for automated video capture or photo timelapses
- 🔄 Sync motion + capture: use automations to start the turntable and camera at the same time, or trigger snapshots at specific angles
The ESP32-CAM idea is especially interesting - it could make this a completely self-contained 360° product photography rig.
Resources #
If you want to build your own or remix this setup, here are the files:
- 🧱 3D Model: Printables – Turntable
- 💾 ESPHome YAML: GitHub Repo (includes full config, wiring notes, and updates)
Final Thoughts #
This simple ESP32 upgrade turned a basic turntable into a smart, automation-friendly tool that's now fully integrated into my photography setup. It’s been great for product shots, dev board demos, and timelapse clips - all with hands-free control.
If you're already deep into ESPHome and Home Assistant, this is a super rewarding weekend project. Hope it sparks some ideas for your own builds!
👍 Got questions, suggestions, or your own remix? Drop a comment or open an issue on GitHub!