Press "Enter" to skip to content

DIY Camera Slider

Camera slider is a great tool that in the hands of a great video maker allows them to create amazing time-lapse videos, move the camera to follow the subject or move the camera around to highlight a fixed subject. Unfortunately, I am not a great video maker. However I am a maker and making my own camera slider sounds like a ton of fun! That is why I decided to make my own WiFi enabled camera slider. Using the 2020 Aluminium extrusion and few off-the-shelf components allows the camera slider to be as long or as short as we need it, while being very sturdy and also lightweight for carrying around or mounting on a tripod. We can then use built in WiFi connectivity to control and program the camera slider to have a very precise and repeatable camera movements.

Camera slider should allow you to move or slide the camera in one or more axis. The one we built in this video allows you to slide the camera along the sliding rail and also rotate the camera around it’s center or Z axis.

I have tried to use as many of the off-the-shelf components as possible to allow everyone to recreate this project at home. There are few 3D printed parts that you can print yourself, have someone print them for you or make them from another material (ie. on a CNC or a laser cutter).

As always, the entire project is open-source and open-hardware, which means you can either recreate the project or use it as a starting point for your custom-awesome camera slider.

As always, all the source files, build steps and build instructions are available here in the GitHub repository and also there is a video explaining how it works.

Let me know your thoughts and feel free to post pictures of what you have built.


  1. Giuseppe
    Giuseppe 10. July 2022.

    Beautiful project and thanks for sharing it all.
    Not being very experienced, can I use the A4988 drivers instead of the TMC2209?
    From what I understand they are pin to pin compatible, the only difference is that the TMC2209 has StallGuard which allows for sensorless homing capability,
    but I know if you use it in your project.
    Looking at the wiring diagram I saw that you indicated the DRV8825 motor driver, not the TMC2209 motor driver as indicated in the video, did you perhaps modify the circuit?
    One question, what size is the printed circuit board?
    Thanks again

    • Sasa Karanovic
      Sasa Karanovic 11. July 2022.

      Thank you! I’m glad you liked it!
      Good catch! 🙂
      I ended up building multiple versions, initially wanted to use TMC2209 because they are silent compared to A4988, but later on used DRV8825. They (modules) are all pin-to-pin compatible so you should be able to switch between them. Just modify the source code to reflect correct number of steps per mm/rotation and you should be fine.
      The PCB size is 100x40mm. But it’s an open-source open-hardware design so you should be able to modify it any way you like.
      Let me know how it turns out if you end up building one!

  2. karl
    karl 22. July 2022.

    hi the 280mm closed loop belt is the wrong size its too big.. was that a typo? if so what is correct size? otherwise great project thanks

    • Sasa Karanovic
      Sasa Karanovic 23. July 2022.

      Hi Karl! So sorry about that, 280mm was the correct value for the old camera slider that uses 2040 aluminium extrusion.
      Correct length should be 200mm. Thanks for catching this, I’ll update the BoM!

  3. Giuseppe
    Giuseppe 4. August 2022.

    I uploaded your gerber file on JLCPCB for the realization of the printouts, but they reported me that there are the output pads in short with the ground plane.
    Did I do something wrong in uploading the file?
    Unfortunately, I have no way of verifying, also because I don’t know what software you used to make the circuit.
    Can you please check?
    If you want, I will send you what was reported by JLCPCB


    • Sasa Karanovic
      Sasa Karanovic 9. August 2022.

      Hi Giuseppe,

      You are right! Thanks for bringing this up. Please download the latest gerber release from the GitHub repository.
      Let me know if this helps.


      • Giuseppe
        Giuseppe 10. August 2022.

        caricata la nuova versione, sono in attesa che arrivino i circuiti stampati.

        • Giuseppe
          Giuseppe 10. August 2022.

          Sorry, I answered you in Italian,
          loaded the new version, I am waiting for the printed circuits to arrive.
          Thank you.

          • Sasa Karanovic
            Sasa Karanovic 11. August 2022.

            Great! Let me know how it turns out! 🙂

      • Malcolm
        Malcolm 1. December 2022.

        Hi Sasa

        Thanks for all your work! I look forward to building this.

        I have just found the Gerbers have a short between the 2 motor outputs (of 4 pins each) and the copper plane in the GBL file. I’m not sure whether this is still the same problem identified above.

        • Sasa Karanovic
          Sasa Karanovic 1. December 2022.

          Hi Malcom,

          Thank you! I’m glad you liked it.
          The gerbers in the repository are updated to fix the short issue. If you have short on your board maybe double check soldering and motor wiring?

          Let me know how it goes or if you need any help.

          Best regards,

          • Malcolm
            Malcolm 2. December 2022.

            Hi Sasa

            No, this was picked up by the PCB house, and I confirmed by viewing the Gerbers.

            But… I now rechecked everything and found out that when I downloaded the GitHub repository zip (via the “Code” button) two days ago, Github had given me everything from your earlier commit on Jul 24. The filename was Very bizarre.

            But now looks good and I will use the correct files!

  4. qidaxia
    qidaxia 17. August 2022.

    how about add a button to control the equipment?

    • Sasa Karanovic
      Sasa Karanovic 18. August 2022.

      Great suggestion!
      I wanted to control the slider entirely over WiFi, so no physical buttons.

  5. Albert
    Albert 30. September 2022.

    Is the esp32 also powered from a dc-dc out? If I’m not mistaken then out should be 12v and esp32 should be 5v. am I missing something here? Thanks!

    • Sasa Karanovic
      Sasa Karanovic 30. September 2022.

      Great question! In the first version I had two DC-DC converters to create +12V and +5V rails. But then I realized that mine ESP32 dev module has a LDO that can safely take 12V VIN and convert it down to 3.3V. It will generate a little bit more heat but otherwise, it works great.
      Also later on I tuned the DC-DC converter to output ~8V instead of 12V. At this point motors still have plenty of torque for my application but compared to 12V, they are silent. Obviously, your mileage may vary.

  6. Trevor
    Trevor 12. November 2022.

    Great work! super clean and easy to use. what about adding a time-lapse feature where it can pause and take a picture every few seconds through out its move? that would make this the ultimate slider.

    • Sasa Karanovic
      Sasa Karanovic 16. November 2022.

      Thank you! I’m glad you like it!
      I thought about it, and even the first revision had infra-red LEDs on the PCB so that it can trigger a camera shutter. But most cameras/phones are fairly rich with features like this, so you can program them to do this on their own.
      Also the camera slider has an API so that it can easily be extended/used via a phone app or some other piece of automation.

      But most importantly, this is open-source open-hardware project, so everyone can see how it works and make changes to fit their use case (and hopefully make a PR so that everyone can benefit from it). 🙂

  7. Scott Lapin
    Scott Lapin 16. November 2022.

    On your BOM, you do not list a part number or rating for R3 and R5. Could you please update so I can order the correct item?


    • Sasa Karanovic
      Sasa Karanovic 16. November 2022.

      Hi Scott. If you look at the schematic they are listed as “DNP” meaning do-not-populate (or do not procure, do not purchase etc).
      Those are placeholders if for whatever reason you ever want to have a pull-down instead of pull-up.

      • Scott Lapin
        Scott Lapin 23. November 2022.

        Got…. thanks so much for the follow up.

  8. Mason
    Mason 28. December 2022.

    Hey there, I have a semi-newb question about the power supply. I have an 18v Ryobi battery. I built everything on the provided PCB design, but I missed the R2 notation. Do you have a suggested resistor to install there? Seeing as I already soldered everything in place, is there another way to get power to the ESP32? I was tempted to just connect the 12v-46V input to the VIN pin on the board with a jumper wire, but thought 18V would likely be too much for this little board. Since the VIN isn’t getting power currently, will I damage anything if I power the board with a USB plug while everything else connected to the 18V battery?

    Again, I realize this might be a dumb question. But any help you can provide would be appreciated.

    • Sasa Karanovic
      Sasa Karanovic 28. December 2022.

      Hey Mason! Hope you enjoyed building the camera slider.
      If you are using the exactly the same design, your VIN can be anything between 12-40V, so your 18V drill battery should work for this. Keep in mind that the design does not include any battery management, so it will drain your battery completely empty if you let it. Also it will not cut off if your battery get’s too hot or actually provide any other form of protection. Just something to keep in mind.
      Most EPS32 modules have a diode from VUSB to +5V, so if you have the battery already connected and you plug in the USB cable, you should be fine. Purpose of that diode is to allow currently only from your USB (PC) to the ESP32 board and not the other way around.
      Please share your finished project, I would love to see how it turns out!

  9. Levon Dombayan
    Levon Dombayan 19. February 2023.

    Hi Sasa,
    Amazed by your coding skills, the whole project is very professionally made, thank you for sharing it.
    Hey, I only have a problem with the firmware that restarts in 80% of my attempts to connect to ESP32 and then suddenly the web page loads and works fine until I change the page to Settings or back. I had a similar problem with some old ESP8266 in my previous projects, suspected on the power supply it looks like I have a pretty reliable power source, it’s a powerful step-down converter from 12 to 5 volts, which should take enough current and keep the voltage stable.
    The board I’m using is the most common ESP-WROOM-32 Dev board, maybe an updated one with a USB-C connector.

    This is the stack trace when I have a reboot:

    23:17:46.808 -> Ready to go.
    23:17:57.778 -> E (23613) task_wdt: Task watchdog got triggered. The following tasks did not reset the watchdog in time:
    23:17:57.778 -> E (23613) task_wdt: – async_tcp (CPU 0/1)
    23:17:57.778 -> E (23613) task_wdt: Tasks currently running:
    23:17:57.778 -> E (23613) task_wdt: CPU 0: IDLE0
    23:17:57.778 -> E (23613) task_wdt: CPU 1: loopTask
    23:17:57.778 -> E (23613) task_wdt: Aborting.
    23:17:57.827 -> abort() was called at PC 0x40150ccc on core 0
    23:17:57.827 ->
    23:17:57.827 -> ELF file SHA256: 0000000000000000
    23:17:57.827 ->
    23:17:57.827 -> Backtrace: 0x400887ac:0x3ffbfa60 0x40088a29:0x3ffbfa80 0x40150ccc:0x3ffbfaa0 0x40086f3d:0x3ffbfac0 0x40184a87:0x3ffbc220 0x4015262b:0x3ffbc240 0x4008b1e9:0x3ffbc260 0x40089a3a:0x3ffbc280
    23:17:57.827 ->
    23:17:57.827 -> Rebooting…
    23:17:57.827 -> ets Jul 29 2019 12:21:46
    23:17:57.827 ->
    23:17:57.827 -> rst:0xc (SW_CPU_RESET),boot:0x17 (SPI_FAST_FLASH_BOOT)
    23:17:57.827 -> configsip: 0, SPIWP:0xee
    23:17:57.827 -> clk_drv:0x00,q_drv:0x00,d_drv:0x00,cs0_drv:0x00,hd_drv:0x00,wp_drv:0x00
    23:17:57.827 -> mode:DIO, clock div:2
    23:17:57.827 -> load:0x3fff0018,len:4
    23:17:57.827 -> load:0x3fff001c,len:1044
    23:17:57.827 -> load:0x40078000,len:10124
    23:17:57.872 -> load:0x40080400,len:5828
    23:17:57.872 -> entry 0x400806a8
    23:17:58.294 -> DIY Camera Slider
    23:17:58.294 -> Reloading camera slider settings.
    23:17:59.279 -> Connecting to SSID: LEON_Bridge
    23:18:04.427 -> Connecting to SSID: LEON_Bridge
    23:18:09.659 -> WiFi IP:
    23:18:09.659 -> mDNS http://slider.local
    23:18:09.659 -> Slider motor
    23:18:09.659 -> — Steps per mm: 250
    23:18:09.659 -> Ready to go.

    Did you have any resembling problems?
    Thanks for your assistance in advance.

    • Sasa Karanovic
      Sasa Karanovic 21. February 2023.

      Hi Levon! Thank you, I’m glad you like the project and decided to try it out yourself.
      From the stack trace it looks like watchdog is getting triggered from async_tcp, which is a library we use for servicing client requests.
      If you are compiling and flashing the board with Arduino, make sure you have the right libraries and version of libraries installed. Also make sure that you don’t have any modifications that would cause the MCU to take a very long time to respond.
      You could also extend the watchdog or completely disable it and see if that changes anything.

      • Levon Dombayan
        Levon Dombayan 22. February 2023.

        Hi Sasa,

        Thanks for your reply.
        I followed the “Super easy” way using PlatformIO, it was really easy. Though I had some warnings, can’t remember now what exactly was the warning, but it looked like it was a minor one.
        I’ll try to re-compile and be more careful with the warnings to see if it solves my problem.

        Thanks again,

      • Levon Dombayan
        Levon Dombayan 22. February 2023.

        Sasa, just for a test, how do I disable the watchdog, could you give me some brief instructions?


  10. Russell Calbert
    Russell Calbert 19. March 2023.

    Hello Sasa
    First of all thank you for sharing this amazing project.
    I’m having problems with the firmware
    Ive tried both methods the platformIO and the arduino IDE both with differing error messages.
    I’m more used to the arduino IDE and it seems to be a problem with the ESPmDNS library. What version did you use ?
    Many thanks

    • Sasa Karanovic
      Sasa Karanovic 19. March 2023.

      Hi Russell, I’m glad you liked the project.
      I’m pretty sure I used the latest version of the library (at the time of writing the project) but don’t know the exact revision.
      ESPmDNS is used mainly to allow you to access the camera slider as http://cameraslider.local instead of typing it’s IP address.
      If you don’t need this feature or don’t mind typing the IP address, you can remove the ESPmDNS library and everything else should work as expected.
      Alternatively, you can try different versions of ESPmDNS library and see if that resolves your issue.

      • Russell Calbert
        Russell Calbert 19. March 2023.

        Thanks for the prompt reply.
        I’d like to keep this feature
        I still get the following error with different libraries

        C:\Users\ruzzz\OneDrive\Documents\Arduino\libraries\ESPmDNS\src\ESPmDNS.cpp: In member function ‘IPAddress MDNSResponder::queryHost(char*, uint32_t)’:
        C:\Users\ruzzz\OneDrive\Documents\Arduino\libraries\ESPmDNS\src\ESPmDNS.cpp:176:5: error: ‘esp_ip4_addr_t’ was not declared in this scope
        esp_ip4_addr_t addr;
        C:\Users\ruzzz\OneDrive\Documents\Arduino\libraries\ESPmDNS\src\ESPmDNS.cpp:177:5: error: ‘addr’ was not declared in this scope
        addr.addr = 0;
        Any suggestions
        ( and once again thanks for keeping up the good work )

        • Sasa Karanovic
          Sasa Karanovic 19. March 2023.

          Hi Russell,

          It looks like an issue with the library or potentially conflict (ie you could have multiple libraries installed and Arduino is selecting the wrong one).
          According to this GitHub comment, you could try and remove the Arduino one and leave only the ESP32 ESPmDNS library.
          Also trying a different version of the library would be a low hanging fruit in debugging this issue.

  11. steven
    steven 19. March 2023.

    Hi thank for your work Saša 🙂

    I use 700mm rail and TMC2208 for build your slider.

    But i have a problem, when select Home Slider or a moving to length of more than 140mm with web application, sliding platform come knock against end of rail.
    Sliding platform never goes back to its starting position at the start of the rail,
    where is the electronic box.
    I try to change homing and sliding direction but nothing change.
    Could you help me, please ?

    • Sasa Karanovic
      Sasa Karanovic 19. March 2023.

      Hi Steven! That’s awesome! TMC2208 are a bit more expensive but also silent and very smooth. 🙂

      This sounds like misconfiguration between firmware and hardware. Did you double check your motor step-size (the jumpers for selecting step size M0, M1, M2). Also, I think TMC2208 does not support 1/32 step size, so M2 jumper will be ignored.
      Does homing of the slider platform works? It’s always a good idea to calibrate your slider, so when you ask it to move ie 20mm, you can verify that it has moved 20mm and not 15 or 7 or so. These errors accumulate fast, maybe a bit less for 700mm rail but still…
      If the motors are not moving in the right direction, you can change the direction in the config/firmware, but you could also change the wiring.
      Let me know how it goes.

      • steven
        steven 19. March 2023.

        i think i found good connections now, slidding plateform go to rail begin when i press Home Slider button.

        connexions are now:
        B- black > M1B
        B+ green > M1A
        A- blue > M2A
        A+ red > M2B

        but platform is not stopped by limit switch it forces against…

        • Sasa Karanovic
          Sasa Karanovic 19. March 2023.

          Hi Steven,

          Check if your limit switch is connected properly. You should also have a pull-up/pull-down resistor on the board to set the IDLE level.
          Your limit switch (center pin) should short to GND or VCC when actuated. If you are not sure how you wired it, try one, if it doesn’t work.
          I doubt it but you could also reverse the Z and X end switch in code, in which case you can move the limit switch to a connector next to it to see if it works then.

          Tip: You can manually press the switch at any time and the platform should stop moving (slows down, then you release the switch, it starts moving slowly again and when you press it for the second time it stops completely).

          The board and the firmware support multiple different configuration to offer more flexibility and therefore be more useful, but at the same time if you are not sure how you configured it, it can take some trial and error. 🙂

  12. steven
    steven 19. March 2023.

    Thank you so much for your reply.

    – TMC2208 don’t have M0, M1 and M2 port but only MS1 and MS2. I don’t understand if i do must wiring MS1 and MS2.

    – what is procedure for calibrate slider ?

    – Connexion to tmc2208 are :

    M1B: red
    M1A: blue
    M2A: green
    M2B: black

    – Connexion to motor (face motor left to right) are :

    green B+
    red A+
    black B-
    blue A-

    motor steeper i use :

    I don’t sure about connection, maybe that cause trouble.

    Thank you

  13. Russell Calbert
    Russell Calbert 19. March 2023.

    Woot Sorted
    You need to go back to 1.0.6 then it compiles fine

      • steven
        steven 20. March 2023.

        – I connected MS1 and MS2 to VIO for get 1/16 steep.
        – Connexions from motor to TMC2208 :
        A + > M2B
        A – > M2A
        B + > M1A
        B – > M1B

        Slider direction is now from the end to start where end switch is but my end switch has no effect.
        Sliding platform continue to touch it and force.
        Also distances traveled by platform are much greater than those requested. I did not notice any difference with 1/6 steep.
        How to calibrate it ?

        Here is a schematic of my pull up resistance with end switch :
        When I press the switch the current flows
        I don’t see what’s wrong.

        1.0.6 ? arduino ide ?

        Thank you for your help.

        • Sasa Karanovic
          Sasa Karanovic 20. March 2023.

          If you have R1 and R4 populated on the PCB, then you don’t need a pull up on the end switch. Just connect end switch middle pin to the middle pin of end switch terminal and the

          Here is an image showing how you should wire your end switch.

          P.S. When you press the end switch, the slider should stop immediately. When debugging, if this does not happen, you can power off the board before it hit’s the end switch to prevent any possible damage.
          Also, I don’t know if you modified the firmware or maybe have a slightly different ESP32 board. With that said, you can always try swapping the Z and X end switch and see if that makes any difference.

          • steven
            steven 21. March 2023.

            Thank for your help.
            I dont use your board but my wiring imself with prototype board.

            I’m a bit lost in the connections.
            Now i connected GPIO 21 and GND directly to end switch X, but it still does nothing.
            I do not make wiring for end switch Y, I thought it was unused.
            Sliding platform only moves in one direction and does not move backwards.
            I will draw a diagram of my wiring maybe you can help me.

  14. Russell Calbert
    Russell Calbert 23. March 2023.

    Me again.
    Next question ( Serves you right for providing such excellent support )
    While the firmware compiles and uploads.
    I cannot get the webpage up.
    I can ping the web address that comes up in the serial monitor, but I cannot get a web page up. I’m using Chrome for a browser.
    Many thanks

    • Sasa Karanovic
      Sasa Karanovic 23. March 2023.

      Hi Russell, I’m glad to hear things are moving along.
      You should find out what is the IP address of the Camera Slider on your router and confirm it’s the same one as the one you see in the serial monitor.
      Then you can explicitly tell Chrome to use `http://` instead of `https://` that could be one issue (ie if Camera Slider IP is, type explicitly `` in your browser)
      Also you have to make sure that the machine that you are using Chrome on is on the same network as the Camera Slider and that there is not firewall or any other restriction that would prevent you from accessing the Camera Slider.

Leave a Reply

Your email address will not be published. Required fields are marked *

This site uses Akismet to reduce spam. Learn how your comment data is processed.