Smart 360° Photo Turntable – ESP32 + ESPHome + Home Assistant

by espboards in Circuits > Electronics

430 Views, 6 Favorites, 0 Comments

Smart 360° Photo Turntable – ESP32 + ESPHome + Home Assistant

thumbnail.png
finished-table-product.png

I built a smart, WiFi-controlled 360° photo turntable for smooth and consistent product photography.

Powered by an ESP32, it uses ESPHome to integrate with Home Assistant, giving you speed control, start/stop buttons, and a “return to home” function — all from your phone or computer.

It also has a physical push button for quick local control, making it perfect for hands-free 360° product shots, dev board demos, and timelapse photography.


Full build log and updates are available on my project page: https://www.espboards.dev/blog/smart-360-photo-turntable-esphome-home-assistant/

Supplies

Mechanical

  1. 3D Printed Turntable Base + CasingOriginal Printables Model (remixed to mount ESP32 and push button)

Electronics

  1. ESP32 Development BoardAmazon US | Amazon DE | AliExpress
  2. Stepper Motor (28BYJ-48) + ULN2003 Driver BoardAmazon US | Amazon DE | AliExpress
  3. Momentary Push Button (12×12×7.3mm)Amazon US | Amazon DE | AliExpress
  4. 5.5×2.1 mm DC Barrel Jack SocketAmazon US | Amazon DE | AliExpress
  5. 5V Regulated Power Supply (1A or more)Amazon US | Amazon DE | AliExpress
  6. DuPont Jumper WiresAmazon US | Amazon DE | AliExpress
  7. Hot Glue GunAmazon US | Amazon DE | AliExpress

Tools

  1. 3D Printer
  2. Small screwdriver set
  3. Wire cutters/strippers
  4. Optional: soldering iron (not required for this build)

Print the Turntable Parts

printables.png

The base of this build comes from the excellent minimalist design by Derek Harper on Printables.

It uses a stepper motor, a 608 bearing, and a 3D-printed frame for smooth, precise rotation.

Instructions:

  1. Download the STL files from the link above.
  2. Print the parts in PLA or PETG. I used PLA for simplicity — PETG is a good choice if you want more durability.
  3. Use 0.2 mm layer height for a nice surface finish on the visible turntable top.
  4. Print with at least 20–30% infill to make the platform more stable during rotation.
  5. If desired, tweak the base model to add:
  6. A mounting bracket for the ESP32
  7. A hole or slot for the push button

Tip: If your printer bed is small, you can scale the turntable top down — just remember you may need to adjust your photography framing later.

Wiring the Electronics

360-turntable-fritzing.png

This project needs no soldering - all connections are made using DuPont jumper wires.

We’ll connect the ESP32 to the ULN2003 stepper driver, add a push button for manual control, and power everything from a 5V adapter.

Connections:

ESP32 -> ULN2003 Driver Board

  1. GPIO9 -> IN1
  2. GPIO7 -> IN2
  3. GPIO5 -> IN3
  4. GPIO3 -> IN4

Push Button

  1. One leg -> GPIO12
  2. Other leg -> GND

Power

  1. 5V power adapter -> barrel jack -> ULN2003 VCC
  2. GND shared between ESP32 and ULN2003

Tips for Clean Wiring:

  1. Use female-to-female DuPont jumpers for easy plugging into the driver board and ESP32 headers.
  2. Route wires around the edges of the base so they don’t rub against the rotating platform.
  3. Keep wire lengths short to avoid tangles inside the housing.


Setting Up ESPHome

With the hardware wired up, it’s time to give the turntable a brain.

We’ll use ESPHome so the ESP32 can talk to Home Assistant over WiFi, with controls for start/stop, speed, and “return to home.”

1. Install ESPHome

You can run ESPHome:

  1. Inside Home Assistant (Add-on Store)
  2. Or on your computer (ESPHome Getting Started Guide)

2. Create a New Device

  1. Open ESPHome.
  2. Click “+ New Device” and name it 360-pod.
  3. Choose ESP32 as the board type (match your actual ESP32 variant).

3. Paste the Configuration

Replace the auto-generated YAML with this configuration:

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'


4. Update the Settings

Before uploading:

  1. Enter your WiFi SSID and password
  2. Set your API encryption key and OTA password
  3. Make sure the GPIO pins match your wiring

5. Upload to ESP32

  1. First upload via USB cable
  2. After that, you can update it over the air from ESPHome

When the ESP32 boots, it will connect to WiFi and appear in Home Assistant — ready for control.

Assembly

finished-no-table.png

Now that the electronics are wired and the ESP32 is flashed, it’s time to put everything into the 3D-printed housing and turn it into a working device.

1. Mount the Stepper Motor

  1. Place the 28BYJ-48 stepper motor into its slot in the printed base.
  2. Secure it with the provided screw holes in the model.
  3. Make sure the output shaft is centered and spins freely.

2. Install the Bearing

  1. Drop the 608 bearing into its recess in the turntable top or base (depending on the model design).
  2. This helps keep rotation smooth and wobble-free.

3. Place the Electronics

  1. Fit the ULN2003 driver board next to the motor.
  2. Mount the ESP32 board inside the base — either with screws, a 3D-printed bracket, or a blob of hot glue.
  3. Route jumper wires neatly along the inside walls to avoid rubbing against moving parts.

4. Add the Push Button

  1. Insert the momentary switch into its mounting hole.
  2. Ensure it clicks cleanly and doesn’t stick.
  3. Connect it to the ESP32 as per the wiring from Step 2.

5. Power Input

  1. Install the DC barrel jack socket in the base.
  2. Connect it to the ULN2003 board’s VCC and GND, sharing GND with the ESP32.

6. Secure Everything

  1. Use hot glue to lock boards and wires in place.
  2. Avoid gluing moving parts or the motor shaft.

7. Attach the Turntable Top

  1. Align it with the motor shaft and bearing.
  2. Push down gently until it’s seated — it should rotate smoothly without binding.

Testing & Using the Turntable

hass.png

With everything assembled, it’s time to bring the turntable to life.

You can control it using the physical push button or Home Assistant via WiFi.

1. Power It Up

  1. Plug in your 5V power adapter.
  2. Wait for the ESP32 to boot and connect to your WiFi (you’ll see it show up in Home Assistant if configured correctly).

2. Physical Button Control

  1. Short Press → Starts a full rotation (or stops if already spinning).
  2. Long Press → Returns the turntable to the “home” position (great for consistent photo framing).

3. Home Assistant Control

Once added via ESPHome integration, you’ll see:

  1. Start / Stop buttons
  2. Home button
  3. Speed slider (adjust rotation speed live)

You can trigger spins from your dashboard, phone, or automations — even sync it with lights or cameras.

4. Adjusting Speed

  1. Use the Stepper Speed slider in Home Assistant.
  2. The default range is 50 to 1020 steps/s — tweak to match your motor’s smoothest performance.

5. First Spin Test

  1. Start slow to ensure the platform rotates evenly.
  2. Place a small object on top and check for smoothness.
  3. If you hear skipping or vibration, lower the speed until movement is stable.


Demo & Results

ESP-LED-02: DIY ESP32-S3 Full Featured WLED Controller

With the turntable fully assembled, here’s how it performs in real-world use.

It’s smooth, quiet, and easy to trigger — either with the physical button or directly from Home Assistant.

1. Photo & Video Examples

  1. Perfect for 360° product shots — just set an object in the center, press start, and capture.
  2. Works great for dev board demos, spinning electronics slowly while you talk about features.
  3. Can be used for timelapse photography by syncing spin speed with your camera’s shooting interval.

2. Demo Video

This clip was filmed using the turntable itself — triggered from Home Assistant and completely hands-free.

3. Performance Notes

  1. The Stepper Speed slider makes it easy to find the smoothest speed for different object sizes.
  2. The Return to Home function means your photos always start from the same angle.
  3. WiFi control + local button = flexibility whether you’re at your desk or across the room.


See more demos and behind-the-scenes details here: https://www.espboards.dev/blog/smart-360-photo-turntable-esphome-home-assistant/

Closing Thoughts

Upgrading this simple motorized turntable with an ESP32 and ESPHome turned it into a smart, automation-friendly tool that I now use all the time for product photography, demos, and timelapse clips.

What I like most is the dual control — quick manual spins from the push button when I’m setting up, or fully automated control from Home Assistant when I want perfect, repeatable shots.

It’s an easy weekend build, requires no soldering, and makes a big difference in workflow if you shoot products regularly.

If you build your own version, I’d love to see how you adapt it — maybe with an ESP32-CAM for built-in image capture or syncing it with studio lighting.

Happy making!