This project is an open source drop-in replacement for the motherboard of the popular Sky-Watcher HEQ5 (Orion Sirius EQ-G) mount based on the ESP32 and using the SynScan protocol.
- Drop-in replacement from the original HEQ5 motherboard
- Compatible with the SynScan hand controller
- Compatible with EQMOD
- ESP32-based project with plenty of onboard memory to spare
- If you wanted a WiFi or Bluetooth version of the HEQ5, this or Open-Synscan is a good place to start.
- Implement PEC training / PEC period in firmware
- Implement the autoguider port interface in firmware (does anybody use this nowadays?)
My original motherboard failed and the (really expensive) replacement I got from Sky-Watcher had a problem and wouldn't drive one motor. Sky-Watcher couldn't replicate the problem, and wouldn't replace it since the mount I have is from Orion, not Sky-Watcher.
...So I designed my own instead to never have this problem again (it's also much cheaper!).
The project is based on the HiLetGo NodeMCU ESP-32S. Here is an Amazon link to the one I have. I will include a chart of this microcontroller's pinout in case a clone of this board matching the same pinout might work.
Other key hardware components are:
- 2x DRV8825 stepper motor driver board (Amazon link, set the current limiter to about 1.5A)
- 1x ADUM1201 magnetic isolator board (Amazon link)
- Some sort of 5v regular board with a 4-pin header (Amazon link)
I have included all of the PCB development files and images of the components I used under the ./docs folder in this repository.
| Name | Designator | Comments |
|---|---|---|
| 1x HiLetGo NodeMCU ESP-32S | U1 | Microcontroller |
| 1x ADUM1201 | U5 | Converts 5V hand controller logic to 3.3V MCU logic |
| 2x DRV8825 | U2,U3 | Stepper motor drivers |
| 1x 1μF 0805 Capacitor | C1 | MCU RST/EN Capacitor (improves reliability of automatic reset circuit) |
| 2x 470Ω 0805 Resistor | R1 | For Power LED |
| 1x 1kΩ 0805 Resistor | R2 | Polar Scope LED resistor |
| 2x 10kΩ 0805 Resistor | R7,R8 | Improves hand controller serial reliability |
| 1x Header Jumper | 5V ENABLE | Enable regulator's 5V output (disconnect to power the MCU via USB in isolation) |
| 2x JST-PH 4-Pin Connector | DEC,RA | For DEC/RA cables |
| 1x JST-PH 5-Pin Connector | HC | For SynScan hand controller / serial port |
| 1x JST-PH 2-Pin Connector | PSLED | For Polar Scope LED |
| 4x 10kΩ 0805 Resistor (Optional) | R3,R4,R5,R6 | Autoguider Port Pullup Resistors |
| 1x JST-PH 6-Pin Connector (Optional) | AG | For autoguider cable (not implemented in software) |
This project was built in VS Code using the PlatformIO extension for embedded devices. See platformio.ini for the specific PlatformIO configuration for this project, including build flags.
The basic steps for building this project are as follows:
- Get VS Code and install the PlatformIO IDE extension. Restart VS Code.
- Load the project. PlatformIO should automatically install the necessary dependencies (e.g. espressif32 / arduinoespressif32) and configure the project.
- Configure desired build flags and upload method in platformio.ini.
- Use PlatformIO's build and upload buttons to build the project!
When enabled, the motors will automatically stop when no serial port traffic is detected after SERIAL_TIMEOUT_MS (as set in Constants.hpp). This prevents the motors from moving indefinitely in the event serial communication is lost while slewing. While this sounds good in practice, this doesn't work well with the SynScan hand controller since it isn't constantly querying status, and so I keep it disabled by default.
When enabled, print debugging information to the device's serial port. Disable when not in use to prevent the MCU from wasting time printing out to the serial port.
Allows over-the-air (OTA) updates via WiFi. Must configure WiFi SSID and password in Constants.hpp and, after upload, configure the OTA settings in platformio.ini appropriately, e.g.:
upload_protocol = espota
upload_port = 192.168.0.123 ; IP address, logged via serial by the firmware on WiFi connectAllows debug logging via multicast UDP. Must configure WiFi SSID, password, and UDP port in Constants.hpp. After upload, see udp_receiver.py to view the debug log output. This script requires a basic Python 3.x environment with no additional dependencies.
- Open-Synscan inspired me to do this project, and a lot of the reverse engineering of the SynScan protocol provided by this project is helpful. A lot of the serial bus logic for this project is similar to Open-Synscan. Licensed under GPLv3.
- AccelStepper was really useful to help me understand how you can implement stepper motor acceleration in software. I couldn't use it as-is, but I did directly borrow code from it. Licensed under GPLv3.
GPLv3 © 2024 Jon Dalrymple

