Overview
A motorized two-axis mount for a 114 mm Newtonian reflector. It's essentially a 2DOF robot arm, made for aiming at the stars. Pointing a telescope turns out to be a genuinely fun engineering problem: backlash, tracking rates, coordinate transforms. It's the closest thing to robotics I've built solo.
Electronics: the custom control board
The mount runs on a PCB I designed myself: Telescope Control Board V1. It's built around an ESP32, with two stepper motor outputs (one per axis) each fed through its own A4988 driver module. The board takes a 15 V DC supply and breaks out an I2C interface for peripherals, plus an FTDI header for programming and the all-important status LED.
Control is an analog joystick. The ESP32 reads it and translates stick movement into stepper motion on the two axes. Point the stick, point the telescope.
The build
The mount is altazimuth, so one motor spins the base and the other tilts the tube, with the 3D-printed base built off the wonderful open-source Hadley telescope design from Printables. Each axis is a stepper driven by an A4988 at 1/16 microstepping, which buys both resolution and the quiet, low-vibration motion a telescope at high magnification demands.
There are no encoders, no limit switches, no home sensor. It's fully open loop. The mount knows where it's pointing because the firmware has counted every single step pulse it has ever sent, and trusts that count absolutely. That one decision shaped the whole firmware. I couldn't use the ESP32's hardware PWM to generate step pulses (the CPU never sees them, so it can't count them), so each pulse comes from a timer interrupt that fires the pin and increments a position counter. Motion is ramped above ~300 steps/s so the motors never stall and silently corrupt the count.
The mount mocks hardware that phone apps already know. It raises its own Wi-Fi access point and speaks the Skywatcher SynScan protocol over UDP, so off-the-shelf GoTo astronomy apps discover it and drive it like a commercial mount. The one number bridging steps and sky (microsteps per axis revolution) can't be derived in software, so it's measured physically: a calibration mode where you drive the base one careful full turn with the joystick, guided by a piece of tape, and the firmware saves the count to flash.
What it still gets wrong: no soft limits (nothing stops the tube from meeting the tripod), it only tracks while an app actively commands a rate, and alt-az geometry rotates the field of view over long exposures no matter how well you track.