Open Access and Open Source Motorized Telescope Mount

by jacksonshell07 in Workshop > 3D Printing

332 Views, 7 Favorites, 0 Comments

Open Access and Open Source Motorized Telescope Mount

telescope motorized
Screenshot 2025-01-13 at 3.50.12 PM.png
IMG_2529.jpg
IMG_1205.jpg
IMG_1172.jpg
55BD6087-BD72-4F53-A484-1EC03999705B.JPG
IMG_1174.jpg

I’ve always wanted a motorized telescope mount but could never justify the steep cost. So, I decided to combine my passion for astronomy and innovation to create something more accessible, and I’m excited to share it with you. This project transforms a regular manual altazimuth mount into an automated system that can adjust both altitude and azimuth to point at stars, planets, and other celestial objects. Instead of making manual adjustments, you simply set the coordinates, and the telescope moves on its own!!


(The above photos were all taken by my telescope!!!)

If you run into issues there is a Troubleshooting section at the bottom

Supplies

Taking Off the Telescope From the Mount

Screenshot 2025-01-13 at 8.24.38 AM.png
Screenshot 2025-01-13 at 8.24.56 AM.png
Screenshot 2025-01-13 at 8.25.42 AM.png

Once you gather your materials you will need to remove the telescope from the mount. Please refer to the quick setup manual to correctly deconstruct the telescope.


image source: Celestron

Removing the Slow-motion Controls

Screenshot 2025-01-13 at 8.36.30 AM.png
Screenshot 2025-01-13 at 8.38.48 AM.png
Screenshot 2025-01-13 at 8.42.35 AM.png
Screenshot 2025-01-13 at 8.42.50 AM.png

After the telescope is removed unscrew and take off the slow-motion controls attached to the mount. Please refer to the quick setup manual to correctly deconstruct the telescope.


Image source: Celestron

3D Print Motor Mounts and Sensor Clamp

After removing the slow-motion controls and detaching the telescope from the mount, you can print the motor mounts, servo connector, and ring clamp for the sensor.


I designed these parts in Fusion 360 (see files below), testing different configurations to ensure the motors fit properly without interfering with the telescope's movement. The ring clamp is tailored for a 102mm telescope and is compatible with the BNO055 sensor.


Printing Recommendations:

Infill: 20%

Resolution: 0.15mm

Supports: Tree supports

Once the parts are printed, clean off any supports and glue (if used). The motors should fit snugly into the mounts with minimal movement, and the ring clamp should fit securely around the telescope. Use screws to fully attach the ring clamp to the telescope. If you run into issues there is a Troubleshooting section at the bottom


While your parts are printing, move on to Step 4!

Making the Servos Continuous Rotation

Screenshot 2025-01-13 at 11.12.23 AM.png
Screenshot 2025-01-13 at 12.53.32 PM.png

For this project, we have two different types of servos; however, neither of them is a continuous rotation servo.

 

Let's start with the HS-311. For this step, you should follow this tutorial by Chris Wilkinson, it is very helpful and easy to follow.


The HS-788HB servo is a bit more challenging to modify. Here’s how to do it:

1. First, unscrew the back cover (just as you did with the HS-311 servo).

2. You will not be able to remove the circuit board from the servo, so DO NOT attempt to take it out! You will only need to slightly bend it open to access the wiring inside.

3. Once you can see inside, take a small screwdriver or any item that can fit inside and carefully scoop out the three wires. They should be red, green, and yellow.

4. After you have scooped the wires, gently pull them out. If done correctly, the potentiometer should come off.

5. After completing these steps, your servo should now function as a continuous rotation servo. For easy access, I did not screw the back cover back on, but it’s okay to do so if you did.

Servo Connectors

Screenshot 2025-01-13 at 11.14.40 AM.png
Screenshot 2025-01-13 at 11.16.51 AM.png
Screenshot 2025-01-13 at 11.16.56 AM.png
Screenshot 2025-01-13 at 11.18.49 AM.png
Screenshot 2025-01-13 at 11.18.55 AM.png
Screenshot 2025-01-13 at 11.23.25 AM.png
Screenshot 2025-01-13 at 11.23.28 AM.png
Screenshot 2025-01-13 at 2.21.50 PM.png

After 3D printing, you should have two rotary knobs. These will be used to connect the servo to the metal knobs on the telescope that control the gears.


Then use a soldering iron to heat the M6 nut, then use pliers to push it down into the knob, allowing the nut to sink in completely. If done correctly, you should be able to screw in an M4 screw that is 8mm long. For the HS-788HB servo, I needed to glue a spool onto the knob to ensure a proper fit. For the HS-311HB servo, I needed to screw in a servo hat into the knob to connect the servo to the knob.


After setting up the servo knobs, screw the knob into where you removed the slow-motion controls.

Attaching the Servo Mounts

IMG_8020.jpg

Slide the servos into their respective mounts (HS- and secure them using M6 bolts that are 60mm long along with M6 nuts, as shown in the photo. However, you can use any screw size you prefer; I just opted for these.

Ring Clamp and Bno055

IMG_8007.jpg

Once your servos and their mounts are set up and attached, we can proceed to set up the ring clamp and the BNO055 sensor.


1. Place the top clamp with the sensor area facing upwards.

2. Insert and align the BNO055 sensor into the holding area on the top clamp. Adjust its placement to match the reference image, ensuring the arrows point toward the end of the telescope, indicating the direction of view.

3. Use an adhesive (I recommend Krazy Glue) to secure the sensor in place.

4. Once the adhesive has dried, attach the ring clamp with the top clamp on top of the telescope using M6 screws. These screws worked well for me, but any suitable screws should be fine.

Wiring

circuit_image (1).png
circuit_image.png
circuit_image (2).png
Screenshot 2025-01-13 at 11.53.19 AM.png
Screenshot 2025-01-13 at 11.53.23 AM.png
Screenshot 2025-01-13 at 11.53.27 AM.png
Screenshot 2025-01-13 at 11.53.31 AM.png

above are images of the wiring made on CirKit Designer you can use them to help you connect the Arduino to you servos and sensor.


Wiring the BNO055 Sensor:

  1. BNO055 to Arduino:
  2. VCC (BNO055) → Vin (Arduino)
  3. GND (BNO055) → GND (Arduino)
  4. SDA (BNO055) → A4 (Arduino Uno) or SDA (for other boards)
  5. SCL (BNO055) → A5 (Arduino Uno) or SCL (for other boards)


Wiring the Servos (Heading and Altitude):

The servo objects control two different servos: one for heading (bottom) and one for altitude/elevation (top). Connect them to specific pins on the Arduino.

  1. Servo for Heading:
  2. Signal Pin (Heading Servo) → Pin 9 (Arduino)
  3. VCC (Heading Servo) → 5V (Arduino)
  4. GND (Heading Servo) → GND (Arduino)
  5. Servo for Altitude:
  6. Signal Pin (Altitude Servo) → Pin 10 (Arduino)
  7. VCC (Altitude Servo) → 5V (Arduino)
  8. GND (Altitude Servo) → GND (Arduino)


Organizational Tip:

For a more organized setup, use zip ties to bundle the wires together. Additionally, place the Arduino on the middle support bridge of the telescope mount, attaching velcro stickers to the underside of the Arduino and the center of the support bridge. You can see images of my use of zip ties and velcro stickers in the images above.

CODE

Follow the pseudo-code steps in my code to understand why I made certain decisions but it should be plug and play:

#include <Wire.h>
#include <Adafruit_Sensor.h>
#include <Adafruit_BNO055.h>
#include <Servo.h>

double currentHeading = 0; // Variable to store the current heading
double targetHeadingMin = 25; // Minimum target heading (in degrees)
double targetHeadingMax = 26; // Maximum target heading (in degrees)
double currentAltitude = 0; // Variable for current altitude
double targetAltitude = 10; // Set your target altitude (in degrees)
Adafruit_BNO055 bno = Adafruit_BNO055(55, 0x28); // Initialize BNO055 sensor
Servo headingServo; // Servo object for heading
Servo altitudeServo; // Servo object for altitude
bool targetHeadingReached = false;
bool targetAltitudeReached = false;

void setup() {
Serial.begin(115200);

if (!bno.begin()) {
Serial.print("No BNO055 detected");
while (1);
}

// Initialize servos on pins 9 and 10
headingServo.attach(9);
altitudeServo.attach(10);

delay(1000);
}

void loop() {
// Get the current heading and altitude from the BNO055 sensor (Euler angles in degrees)
sensors_event_t orientationData;
bno.getEvent(&orientationData, Adafruit_BNO055::VECTOR_EULER);
currentHeading = orientationData.orientation.x; // Using x-axis as heading
currentAltitude = orientationData.orientation.z; // Using z-axis as altitude

// Print the current heading, altitude, and target values
Serial.print("Current Heading: ");
Serial.println(currentHeading);
Serial.print("Target Heading Range: ");
Serial.print(targetHeadingMin);
Serial.print(" - ");
Serial.println(targetHeadingMax);
Serial.print("Current Altitude: ");
Serial.println(currentAltitude);
Serial.print("Target Altitude: ");
Serial.println(targetAltitude);

// Control the heading servo
if (currentHeading < targetHeadingMin || currentHeading > targetHeadingMax) {
// Rotate the servo if the heading is outside the target range
headingServo.write(120); // Rotate the servo to 120 degrees (adjust to your needs)
} else if (!targetHeadingReached) {
// If the heading is within the target range, stop and detach the servo
headingServo.detach(); // Detach the servo to stop movement
targetHeadingReached = true; // Mark target heading as reached
Serial.println("Target Heading Reached");
}

// Only control the altitude servo once the heading target has been reached
if (targetHeadingReached && currentAltitude < targetAltitude && !targetAltitudeReached) {
altitudeServo.write(120); // Adjust altitude servo to reach target altitude
} else if (targetHeadingReached && currentAltitude >= targetAltitude && !targetAltitudeReached) {
altitudeServo.detach(); // Detach altitude servo after target altitude is reached
targetAltitudeReached = true; // Mark target altitude as reached
Serial.println("Target Altitude Reached");
}

delay(100); // Wait for 100ms before taking the next reading and updating servo position
}

How to Modify and Run the Code

Screenshot 2025-01-13 at 3.44.13 PM.png

To use the code you must first set up the telescope so that its heading is True North and set its altitude angle to 0º. You will also need to know the azimuth and altitude coordinates for an object you want to look at. These values change depending on your location and the time of day.

You can easily find this information using the website TheSkyLive or Planets Calc (I recommend Planets Calc) which provides real-time data on visible celestial objects. Above is a screenshot of the Planets Calc website. You can find the azimuth and altitude coordinates on the left-hand side.

Then once you have the two values enter them into the code


Example:

  1. If the object you want to track has an azimuth of 150° and an altitude of 45°, set the following values in the code:
double targetHeadingMin = 150; // Minimum target heading (in degrees)
double targetHeadingMax = 151; // Maximum target heading (in degrees)
######################################################################
double targetAltitude = 45; // Set your target altitude (in degrees)

Fine-tuning: If the telescope doesn't point exactly where you expect, you may need to adjust the target values or recalibrate the sensor. This can happen due to minor errors in the sensor alignment or mechanical setup.

YOUR GOOD TO GO!!!

once you're done with all of these steps go test it.


If you want to learn more about the topics in this project I have put a few links below that I found very useful and worth my time:

Long Exposure in Astrophotography

Choosing the Right Telescope for Your Needs

Astronomical Coordinates: Understanding Azimuth and Elevation

How to select a servo motor


Troubleshooting

If you run into issues while assembling or testing your motorized telescope, here are some common problems I encountered and quick solutions that helped me:


1) Telescope Movement Is Jerky or Inaccurate

Possible Causes:

  1. The servos don’t have enough torque.
  2. Incorrect code.
  3. Mechanical issues or misalignment.

Solution:

  1. Check torque: Ensure your servos can handle the weight of the telescope.
  2. Verify code: Double-check that the servo angles in the code are set correctly.
  3. Inspect alignment: Make sure everything is properly aligned and moves smoothly, with no obstructions.
  4. Loosen motor mounts: If the motor mounts are too tight, they may put pressure on the servos. Adjust the mounts to relieve this pressure.


2) BNO055 Sensor Is Not Providing Accurate Readings

Possible Causes:

  1. Sensor misalignment.
  2. I2C connection issue.

Solution:

  1. Check axis used in code: I used the z-axis for the elevation and the x-axis for the heading. I chose those because of the way my bno005 was placed. you may have to choose a different axis if you're not getting accurate readings.
  2. Check alignment: Before running the script, make sure the telescope is aligned with true north. Set the azimuth/heading to 0º in the code and adjust the altitude/elevation so the telescope is level with the ground (0º).
  3. Check connections: Ensure the SDA and SCL wires are properly connected. Sometimes I flip these pins by mistake, so double-check the wiring section and make sure they’re connected to the correct pins.


3) Telescope Does Not Reach Target Position

Possible Causes:

  1. Incorrect azimuth/altitude values.
  2. Servo limits reached.
  3. Mechanical resistance.

Solution:

  1. Verify values: Double-check the azimuth and altitude coordinates in your code. If you’re unsure about the values, try using a tool like Planets Calc to get the correct coordinates.
  2. Check servo limits: Ensure the servos can rotate fully to the target position. If the servos stop before reaching the target, there might be an issue with the servo rotation. If you followed the steps above correctly, your servos should have continuous rotation, but if it's still not rotating you could check the gears for any debris.
  3. Inspect for friction: Check for any friction or resistance in the movement. I noticed my gears were stiff, so I used a Q-tip to clean the gears and applied gear grease. This fixed the issue, allowing the servo to turn the gear smoothly.