Building a Servo-Powered Automated Sorting Machine with Raspberry Pi

Micro Servo Motor with Raspberry Pi / Visits:3

The maker’s journey often begins with a simple question: “What if I could build something that sorts things… automatically?” Whether it’s organizing LEGO bricks, sorting recyclables by color, or separating different types of candy, an automated sorter is a classic and immensely satisfying project. At the heart of such a machine lies a humble yet powerful component: the micro servo motor. In this guide, we’ll dive deep into constructing a responsive, intelligent sorting machine powered by a Raspberry Pi, with a special focus on why micro servos are the perfect muscle for this task.

Why Micro Servos Are the Unsung Heroes of Small-Scale Automation

Before we pick up a screwdriver, it’s crucial to understand our star component. Unlike continuous rotation motors, micro servos are designed for precise angular control. They are compact, lightweight, and contain built-in control circuitry and gearing.

The Anatomy of a Micro Servo

A standard hobbyist micro servo (like the ubiquitous SG90) has three wires: power (typically red), ground (brown or black), and signal (yellow or orange). Internally, it consists of a small DC motor, a gear train to reduce speed and increase torque, a potentiometer to sense the current arm position, and a control board. This board is key—it compares the desired position (sent via the signal wire) with the actual position (from the potentiometer) and drives the motor to correct any error. This closed-loop system allows for remarkable precision without external sensors.

Key Advantages for a Sorting Machine

  • Precision Positioning: We can command the servo arm to move to exact angles—e.g., 0 degrees to hold a chute closed, 45 degrees to direct items to bin A, and 90 degrees for bin B.
  • Holding Torque: When powered, a servo actively holds its position, providing a positive stop for items sliding down a chute.
  • Low Power Consumption: Micro servos are efficient, making them ideal for a Raspberry Pi project where power is supplied via USB.
  • Simplicity in Control: With libraries like GPIO Zero or RPi.GPIO, commanding a servo from Python is a matter of a few lines of code. No complex motor drivers are needed.

The Blueprint: System Design and Components

Our sorting machine will be a proof-of-concept that can differentiate between two colors (e.g., red and blue) and physically direct objects into corresponding bins using a servo-actuated diverter arm.

Hardware Shopping List

  1. Raspberry Pi 4 Model B (or 3B+): The brain. Its processing power and GPIO pins are essential.
  2. Micro Servo Motor (SG90/TowerPro): The muscle. We’ll use one for the diverter.
  3. Raspberry Pi Camera Module v2 (or compatible USB webcam): The eye for color detection.
  4. Color Sensor (TCS34725 as an alternative): While we’ll use the camera for this guide, a dedicated I2C color sensor is a more precise option.
  5. Jumper Wires (Female-to-Female): For connecting the servo to the Pi.
  6. Breadboard: For easy wiring.
  7. Structural Materials: Cardboard, foam board, or acrylic sheets for building the ramp, chassis, and bins.
  8. 5V Power Supply for the Servo: While the Pi can power one micro servo for testing, for reliability, a dedicated 5V supply (like a UBEC) connected to the servo is recommended to avoid brownouts on the Pi.

Software Stack

  • Raspberry Pi OS (Bullseye): The operating system.
  • Python 3: Our programming language of choice.
  • OpenCV Library: For robust color detection from the camera feed.
  • GPIO Zero Library: For beautifully simple servo control.

Constructing the Physical Sorter

Building the Frame and Ramp

Start by constructing a sloped ramp down which items will roll or slide. At the end of the ramp, create a Y-shaped splitter leading to two collection bins. The critical point is the junction of the “Y.” This is where our servo will act.

Mounting the Servo and Diverter Arm

Attach the micro servo securely to the frame so its rotational axis is directly above the decision point at the Y-split. Many servos come with small plastic horns (arms). Attach a longer arm—you can 3D print one, use a craft stick, or cut one from plastic. This extended arm will act as the diverter gate. When the servo rotates, this arm will physically block one path and guide the object to the other.

Pro Tip: Ensure the arm’s movement is clean and doesn’t bind. The servo has limited torque, so the mechanism must be low-friction.

Wiring the Circuit

The wiring is straightforward: 1. Servo Signal WireGPIO Pin 12 (PWM0) on the Pi. (Almost any GPIO can be used for software PWM, but Pin 12 is a hardware PWM pin for smoother operation). 2. Servo Power (Red)Positive rail on your breadboard, connected to your 5V power supply. 3. Servo Ground (Brown)Ground rail on your breadboard, connected to both your 5V supply ground and a Pi GND pin.

Crucial Warning: Do not power a servo directly from the Pi’s 5V pin for prolonged use. The current spikes when the servo moves or stalls can cause the Pi to reboot. Use an external supply with a common ground.

Programming the Brain: From Vision to Motion

With the hardware built, the magic happens in code. We’ll break the program into logical modules.

Setting Up the Servo with GPIO Zero

GPIO Zero abstracts the complexity. First, we define our servo:

python from gpiozero import Servo from time import sleep

Adjust minpulsewidth and maxpulsewidth if your servo range is off

servo = Servo(12, minpulsewidth=0.5/1000, maxpulsewidth=2.5/1000)

Define positions

LEFTPOSITION = -0.5 # Value between -1 and 1 NEUTRALPOSITION = 0 RIGHT_POSITION = 0.5

servo.value = NEUTRAL_POSITION

Implementing Color Detection with OpenCV

We’ll use the camera to capture an image of the object as it pauses on the ramp (a simple infrared break-beam sensor could trigger this, but for simplicity, we’ll assume manual triggering).

python import cv2 import numpy as np

def getdominantcolor(imageregion): # Convert from BGR (OpenCV default) to HSV for easier color segmentation hsv = cv2.cvtColor(imageregion, cv2.COLOR_BGR2HSV)

# Define ranges for red and blue (red is tricky due to hue wrap-around) lower_red1 = np.array([0, 100, 100]) upper_red1 = np.array([10, 255, 255]) lower_red2 = np.array([160, 100, 100]) upper_red2 = np.array([180, 255, 255])  lower_blue = np.array([100, 100, 100]) upper_blue = np.array([130, 255, 255])  # Create masks mask_red1 = cv2.inRange(hsv, lower_red1, upper_red1) mask_red2 = cv2.inRange(hsv, lower_red2, upper_red2) mask_red = cv2.bitwise_or(mask_red1, mask_red2) mask_blue = cv2.inRange(hsv, lower_blue, upper_blue)  # Determine which color has more pixels in the mask red_pixels = cv2.countNonZero(mask_red) blue_pixels = cv2.countNonZero(mask_blue)  if red_pixels > blue_pixels and red_pixels > 50: # Threshold to avoid noise     return "RED" elif blue_pixels > red_pixels and blue_pixels > 50:     return "BLUE" else:     return "UNKNOWN" 

The Main Control Loop

This loop ties vision and action together.

python

Pseudocode for the main logic

def mainloop(): while True: print("Waiting for item...") # Wait for a trigger (e.g., sensor break, keyboard input) userinput = input("Press 'c' to capture and sort, or 'q' to quit: ") if userinput == 'q': break if userinput == 'c': # Capture image from camera # Crop to region of interest (the object on the ramp) # color = getdominantcolor(croppedimage) color = getdominantcolor(capturedimage) # Assume this function works

        # Command the servo based on color         if color == "RED":             servo.value = LEFT_POSITION             print("Sorted RED to left bin.")         elif color == "BLUE":             servo.value = RIGHT_POSITION             print("Sorted BLUE to right bin.")         else:             print("Unknown color, moving to neutral.")             servo.value = NEUTRAL_POSITION          sleep(1) # Allow time for the object to fall         servo.value = NEUTRAL_POSITION # Reset diverter  servo.close() 

Tuning, Troubleshooting, and Taking It Further

No project works perfectly on the first try. Here’s where the real engineering begins.

Calibrating Your Servo’s Range

You may find your diverter arm doesn’t align perfectly with the chutes. This is where calibration comes in. Adjust the LEFT_POSITION and RIGHT_POSITION values in small increments (e.g., 0.05) until the motion is perfect. You can write a small calibration script to find the ideal values.

Dealing with Jitter and Power Issues

  • Servo Jitter: If the servo buzzes or jitters at rest, it’s often due to electrical noise or software PWM imprecision. Using a hardware PWM pin (like GPIO 12 or 13) can help. Ensuring a solid, clean power supply is the best fix.
  • Pi Rebooting: A sure sign you’re drawing too much current from the Pi. Immediately switch to an external 5V supply for the servo.

Advanced Enhancements

  1. Multi-Tier Sorting: Add a second servo to create a two-stage sorter for four categories.
  2. Object Detection with Machine Learning: Use TensorFlow Lite on the Pi to move beyond color and sort objects by type (screw vs. washer, different coin denominations).
  3. Conveyor Belt Integration: Use a continuous rotation servo or DC motor to build a belt feeder, creating a fully continuous sorting line.
  4. Web Interface: Use Flask to create a dashboard that shows sorting statistics and allows manual control of the servo.

The journey from a pile of components to a whirring, sorting machine is a profound lesson in applied physics, programming, and problem-solving. The micro servo motor, in its elegant simplicity, provides the crucial link between the digital intelligence of the Raspberry Pi and the physical world of moving objects. By mastering its control, you unlock the potential for countless other automated projects. So, gather your parts, fire up your Pi, and start building—your perfectly sorted future awaits.

Copyright Statement:

Author: Micro Servo Motor

Link: https://microservomotor.com/micro-servo-motor-with-raspberry-pi/automated-sorting-machine-servo-raspberry-pi.htm

Source: Micro Servo Motor

The copyright of this article belongs to the author. Reproduction is not allowed without permission.

About Us

Lucas Bennett avatar
Lucas Bennett
Welcome to my blog!

Archive

Tags