Implementing Servo Motors in Raspberry Pi-Based Automated Sorting and Packaging Systems

Micro Servo Motor with Raspberry Pi / Visits:25

When I first started tinkering with Raspberry Pi and servo motors, I thought I was just building another robot arm that would wave at me from my desk. Little did I know that the same micro servo motor that cost me eight dollars on Amazon would become the backbone of a fully functional automated sorting and packaging system. And if you are reading this, you are probably in the same boat—looking to bridge the gap between hobbyist electronics and real-world industrial automation without breaking the bank.

The truth is, micro servo motors are having a moment. Not because they are new—they have been around for decades—but because the combination of Raspberry Pi’s computational power, affordable servo hardware, and open-source software has unlocked a level of precision and control that was once reserved for thousand-dollar industrial actuators. In this article, I am going to walk you through everything I have learned about implementing micro servo motors in a Raspberry Pi-based sorting and packaging system. We will cover hardware selection, wiring, software control, real-time feedback, mechanical design, and even some dirty tricks I discovered while debugging at 2 AM.

Why Micro Servo Motors Are the Unsung Heroes of Desktop Automation

Let’s get one thing straight: micro servo motors are not toys. Yes, they are small. Yes, they are cheap. But in the context of a Raspberry Pi-based sorting and packaging system, they offer a unique combination of features that larger motors simply cannot match.

The Sweet Spot of Torque, Speed, and Precision

A typical micro servo motor like the SG90 or MG90S delivers around 1.5 to 2.5 kg·cm of torque. That might not sound like much, but consider this: a standard soda can weighs about 15 grams. A micro servo can easily lift and rotate a dozen of them without breaking a sweat. For sorting lightweight items—candy, small electronic components, pills, seeds, or even custom-shaped 3D-printed parts—that torque range is perfect.

More importantly, micro servos offer positional feedback through a potentiometer. This means you do not just tell the motor to spin; you tell it to go to a specific angle, and it holds that position against external forces. In a sorting system, where a gate needs to open exactly 45 degrees to divert an item into a specific bin, this closed-loop control is non-negotiable.

PWM Control: The Language Your Raspberry Pi Already Speaks

Every Raspberry Pi has multiple GPIO pins capable of generating hardware or software PWM (Pulse Width Modulation). Micro servo motors speak PWM natively. You send a 50 Hz signal with a pulse width between 1 ms (0 degrees) and 2 ms (180 degrees), and the servo moves to the corresponding angle. That is it. No complex communication protocols, no I2C addressing, no SPI timing headaches. Just three wires: power, ground, and signal.

This simplicity is what makes micro servo motors the perfect match for Raspberry Pi. You do not need a motor driver shield (though you should still use one for power management, which I will cover later). You do not need an external microcontroller. You can control a dozen servos directly from the Pi’s GPIO pins, provided you manage your power budget correctly.

The Hidden Advantage: Low Inertia Means Faster Response

In an automated sorting system, timing is everything. A conveyor belt moves at a certain speed. A sensor detects an object. The servo must actuate a gate or a pusher within milliseconds to divert that object into the correct bin. Micro servo motors have very low rotor inertia compared to larger DC motors or stepper motors. This means they can accelerate and decelerate almost instantly. When I tested an MG90S with a lightweight plastic gate, it went from 0 to 90 degrees in about 0.12 seconds. That is fast enough to keep up with a conveyor belt moving at 0.5 meters per second.

Hardware Architecture: Building the Sorting and Packaging Backbone

Before we write a single line of code, we need to talk about hardware. A Raspberry Pi-based sorting and packaging system is not just a Pi plugged into a servo. It is a carefully orchestrated network of sensors, actuators, power management, and mechanical linkages. Here is the architecture I settled on after three failed prototypes.

The Raspberry Pi: Which Model and Why

I have used both the Raspberry Pi 4 Model B and the Raspberry Pi Zero 2 W for this application. Here is the honest breakdown:

  • Raspberry Pi 4 (2GB or 4GB): Use this if you are running a camera-based vision system, a web interface, or any kind of machine learning inference (e.g., TensorFlow Lite for object classification). The extra RAM and CPU cores handle image processing without stuttering.
  • Raspberry Pi Zero 2 W: Use this if your sorting logic is simple—like reading a color sensor or a barcode scanner—and you want to keep costs down. The Zero 2 W can still drive up to 8 servos using software PWM, but do not expect to run OpenCV at 30 FPS.

For the rest of this article, I will assume you are using a Raspberry Pi 4, because that is what I used for my most reliable build.

Power Management: The Most Overlooked Part

Here is a mistake I made twice: I plugged a micro servo directly into the Raspberry Pi’s 5V pin and wondered why the Pi kept crashing. Micro servo motors can draw 500 mA to 1 A under stall conditions. The Raspberry Pi’s 5V rail, especially if powered through USB-C, can only supply about 1.2 A to 1.5 A total. If you have three servos moving simultaneously, you will brown out the Pi.

The fix: Use a separate 5V power supply for the servos. I recommend a 5V 5A power adapter (like the ones used for LED strips) connected to a servo driver board such as the PCA9685. The PCA9685 communicates with the Pi over I2C and provides 16 independent PWM channels with their own power input. This isolates the servo power from the Pi’s power completely.

Here is the wiring schema I use:

  • Raspberry Pi 5V and GND → PCA9685 VCC and GND (logic power)
  • External 5V 5A supply → PCA9685 V+ and GND (motor power)
  • PCA9685 PWM channels → Servo signal wires
  • PCA9685 GND → Shared ground with Pi and external supply

Never forget the shared ground. Without it, the PWM signal will float and your servos will jitter like they are having a seizure.

Sensors: The Eyes of the System

A sorting system needs to know what it is sorting. I have experimented with three sensor types:

  1. Color sensors (TCS34725): Great for sorting items by color. I used this to sort M&Ms by color (yes, I did that). The sensor communicates over I2C and returns RGB values. Calibration is straightforward.
  2. IR break-beam sensors: Perfect for detecting when an object has passed a certain point on the conveyor. These are cheap, fast, and immune to ambient light interference.
  3. Camera modules (Pi Camera v2 or USB webcam): For advanced sorting based on shape, size, or barcodes. This requires more processing power but offers the most flexibility.

In my final design, I used a combination of an IR break-beam sensor for object detection and a TCS34725 color sensor for classification. The camera was overkill for the items I was sorting.

Mechanical Design: From Servo to Sorting Gate

The servo needs to move something. In a packaging system, that something is usually a gate, a flap, or a pusher arm. I designed a simple 3D-printed linkage that converts the servo’s rotational motion into linear motion for a sliding gate.

Key mechanical considerations:

  • Lever arm length: A longer lever arm gives more linear travel but reduces the effective force. For lightweight items, a 20 mm lever arm works well.
  • Mounting: Use M2 or M3 screws to mount the servo. Do not rely on double-sided tape for anything that moves faster than 10 RPM.
  • Backlash: 3D-printed parts have inherent play. Use a spring-loaded mechanism or soft rubber bumpers to absorb the impact when the gate closes.

I also added a mechanical stop at 0 and 180 degrees to prevent the servo from over-rotating if the software crashes. This saved my hardware more than once.

Software Control: Making the Servo Dance to Your Tune

Now we get to the fun part. Controlling a micro servo motor from a Raspberry Pi is trivial in theory, but getting it to work reliably in a real-time sorting system requires careful software design.

Python and the pigpio Library

The standard RPi.GPIO library can generate software PWM, but it is not very stable at high servo update rates. I switched to pigpio, which uses the Pi’s hardware PWM via the DMA (Direct Memory Access) controller. The result is jitter-free servo movement with microsecond precision.

Here is a minimal example of controlling a servo with pigpio:

python import pigpio import time

SERVO_PIN = 18 pi = pigpio.pi() if not pi.connected: exit()

Set servo to 90 degrees (1500 us pulse width)

pi.setservopulsewidth(SERVO_PIN, 1500) time.sleep(1)

Move to 0 degrees (1000 us)

pi.setservopulsewidth(SERVO_PIN, 1000) time.sleep(1)

Move to 180 degrees (2000 us)

pi.setservopulsewidth(SERVO_PIN, 2000) time.sleep(1)

Stop servo (send 0 pulse width to release)

pi.setservopulsewidth(SERVO_PIN, 0) pi.stop()

Notice the set_servo_pulsewidth function. This is the heart of servo control. The pulse width in microseconds directly maps to angle. Most micro servos use 1000 µs for 0°, 1500 µs for 90°, and 2000 µs for 180°. However, you should calibrate each servo individually because manufacturing tolerances can shift these values by ±50 µs.

Calibration: The Dirty Secret of Cheap Servos

I learned this the hard way: two SG90 servos from the same batch can have different neutral positions. If you send 1500 µs to both, one might sit at 88 degrees and the other at 93 degrees. In a sorting system where a 5-degree error can cause an item to miss the bin entirely, this is unacceptable.

My calibration routine:

  1. Attach a physical pointer (a piece of wire or a 3D-printed indicator) to the servo horn.
  2. Write a script that sweeps the servo from 1000 µs to 2000 µs in 10 µs steps.
  3. Measure the actual angle with a protractor or a digital angle gauge.
  4. Record the pulse width that produces exactly 0°, 90°, and 180°.
  5. Store these calibration values in a JSON file for each servo.

Here is a calibration script snippet:

python def calibrate_servo(pi, pin): print("Sweeping servo. Measure angles at each step.") for pw in range(1000, 2001, 10): pi.set_servo_pulsewidth(pin, pw) print(f"Pulse width: {pw} µs") input("Press Enter to continue...") pi.set_servo_pulsewidth(pin, 0)

Then, in your main code, you map the desired angle to the calibrated pulse width using linear interpolation:

python def angle_to_pulse(angle, cal_zero, cal_ninety, cal_oneeighty): if angle <= 90: return cal_zero + (angle / 90.0) * (cal_ninety - cal_zero) else: return cal_ninety + ((angle - 90) / 90.0) * (cal_oneeighty - cal_ninety)

Real-Time Control Loop for Sorting

A sorting system is a real-time system. You have a sensor that triggers, and you have a servo that must respond within a deadline. In Python, this means avoiding blocking calls like time.sleep() inside your control loop.

I use a state machine approach with a main loop that runs at 100 Hz:

python import pigpio import time from collections import deque

class SortingSystem: def init(self, servopin, sensorpin): self.pi = pigpio.pi() self.servopin = servopin self.sensorpin = sensorpin self.pi.setmode(sensorpin, pigpio.INPUT) self.pi.setpullupdown(sensorpin, pigpio.PUDUP) self.state = "IDLE" self.gateopen = False self.lastsensorstate = 1 # Assuming active low

def update(self):     sensor_state = self.pi.read(self.sensor_pin)     if sensor_state == 0 and self.last_sensor_state == 1:         # Object detected         self.on_object_detected()     self.last_sensor_state = sensor_state      if self.state == "OPENING":         self.pi.set_servo_pulsewidth(self.servo_pin, 1500)  # 90 degrees         self.state = "OPEN"         self.gate_open = True     elif self.state == "CLOSING":         self.pi.set_servo_pulsewidth(self.servo_pin, 1000)  # 0 degrees         self.state = "CLOSED"         self.gate_open = False  def on_object_detected(self):     # Simplified: always sort to bin 1     self.state = "OPENING"     # In a real system, you would schedule a timer to close the gate     # after a fixed delay (e.g., 200 ms)     # For now, we close immediately after opening (not realistic)     self.close_timer = time.time() + 0.2  def run(self):     try:         while True:             self.update()             if self.state == "OPEN" and time.time() > self.close_timer:                 self.state = "CLOSING"             time.sleep(0.01)  # 100 Hz loop     except KeyboardInterrupt:         self.pi.set_servo_pulsewidth(self.servo_pin, 0)         self.pi.stop() 

if name == "main": system = SortingSystem(servopin=18, sensorpin=17) system.run()

This is a simplified version. In production, I added a queue of objects with timestamps and used a priority-based scheduling approach to handle multiple servos simultaneously.

Advanced Techniques: Beyond Basic Positioning

Once you have basic servo control working, you can push the micro servo motor to do things that are not in its datasheet.

Continuous Rotation Servo Modification

Standard micro servos have a 180-degree range. But what if you need a conveyor belt drive or a rotating turntable? You can modify a micro servo for continuous rotation by removing the mechanical stop on the output gear and disconnecting the potentiometer from the output shaft. Then, you replace the potentiometer with two fixed resistors that simulate the neutral position.

After modification, the servo behaves like a DC motor with direction and speed control. A pulse width of 1500 µs stops the motor. 1000 µs spins it full speed in one direction, and 2000 µs spins it full speed in the opposite direction. Intermediate values give proportional speed.

I used a modified SG90 to drive a small conveyor belt made from a strip of rubber and two 3D-printed rollers. The speed control was surprisingly smooth, though the torque was limited to about 0.5 kg·cm at the roller.

Microstepping with Multiple Servos for Smooth Motion

If you need smooth acceleration and deceleration—for example, to avoid throwing items off the conveyor—you can implement a trapezoidal motion profile. Instead of jumping from 0 to 90 degrees instantly, you break the movement into 100 micro-steps and update the servo position every 10 ms.

python def smooth_move(pi, pin, start_angle, end_angle, duration_ms): steps = 100 step_time = duration_ms / steps / 1000.0 # Convert to seconds for i in range(steps + 1): angle = start_angle + (end_angle - start_angle) * (i / steps) pw = angle_to_pulse(angle, cal_zero, cal_ninety, cal_oneeighty) pi.set_servo_pulsewidth(pin, pw) time.sleep(step_time)

This is not true microstepping (that is a stepper motor thing), but it achieves a similar effect: the servo moves with smooth, controlled motion instead of jerky jumps.

Feedback Beyond the Potentiometer

The built-in potentiometer in a micro servo gives you position feedback, but it is only used internally by the servo controller. The Raspberry Pi does not have direct access to it. If you want closed-loop control from the Pi side, you need an external encoder.

I experimented with attaching a magnetic encoder (AS5600) to the servo shaft. The AS5600 communicates over I2C and gives 12-bit absolute position. With this, I could detect if the servo was blocked (position not changing despite command), or if it overshot the target. This allowed me to implement a simple PID controller on the Pi that corrected for load variations.

The code for reading the AS5600 is straightforward:

python import smbus import time

bus = smbus.SMBus(1) AS5600ADDRESS = 0x36 ANGLEREGISTER = 0x0E

def readangle(): data = bus.readi2cblockdata(AS5600ADDRESS, ANGLEREGISTER, 2) rawangle = (data[0] << 8) | data[1] degrees = (rawangle / 4096.0) * 360.0 return degrees

Combining this with the servo control gave me a system that could detect jams and retry movements automatically. This was a game-changer for reliability.

Real-World Testing: Sorting Candy at 60 Pieces Per Minute

I built a complete prototype to test the system. The setup included:

  • A Raspberry Pi 4
  • A PCA9685 servo driver
  • Three MG90S micro servo motors
  • A TCS34725 color sensor
  • An IR break-beam sensor
  • A 3D-printed sorting gate mechanism
  • A small DC motor-driven conveyor belt (controlled by a separate L298N driver)

The goal was to sort red, green, and blue candy-coated chocolates into three bins. The conveyor belt moved at 0.3 m/s. The IR sensor detected when a candy passed. The color sensor classified it. The appropriate servo opened the gate for 150 ms, just long enough for the candy to fall into the bin.

Results:

  • Throughput: 60 pieces per minute (limited by the color sensor integration time, not the servos)
  • Accuracy: 94% correct sorting (errors were mostly due to lighting variations affecting color readings)
  • Servo reliability: Zero failures after 10,000 cycles. The MG90S servos showed no signs of wear, though I did lubricate the gears with silicone grease after every 5,000 cycles.
  • Power consumption: 12W total for the entire system (including the conveyor motor)

The micro servo motors performed flawlessly. The only issue I encountered was that the servo horns (the plastic arms that come with the servos) would occasionally slip on the output shaft under high acceleration. I fixed this by applying a drop of cyanoacrylate glue (super glue) to the shaft before pressing on the horn. This is a permanent solution, so make sure your angles are calibrated first.

Troubleshooting Common Problems

No implementation guide is complete without a section on things that will go wrong. Here are the issues I faced and how I solved them.

Servo Jittering or Oscillating

Symptom: The servo moves back and forth rapidly when commanded to hold a position.

Causes: 1. Power supply noise: The servo is drawing current spikes that cause voltage drops on the PWM signal line. Solution: Add a 470 µF electrolytic capacitor across the servo power terminals. 2. Insufficient PWM frequency: Some servos (especially digital ones) expect a 50 Hz update rate. If you update the PWM faster or slower, the internal controller gets confused. Stick to 50 Hz. 3. Ground loops: If the Pi ground and servo ground are connected through a long wire, you might pick up interference. Keep all ground connections short and thick.

Servo Not Moving at All

Symptom: The servo is silent and does not respond to commands.

Causes: 1. Power not connected: Check that the servo power supply is on and that the voltage is between 4.8V and 6.0V (most micro servos operate in this range). 2. PWM pin not initialized: In pigpio, you must call pi.set_servo_pulsewidth(pin, 0) to stop the servo, but if you never send a non-zero pulse, the servo will not move. Make sure your code sends a valid pulse width. 3. Broken wire: The signal wire is thin and can break at the connector. Use a multimeter to check continuity.

Servo Moves to Wrong Angles

Symptom: 90 degrees on the software corresponds to 120 degrees in reality.

Cause: The servo is not calibrated. As I mentioned earlier, cheap servos have wide manufacturing tolerances. Run the calibration routine and use the mapped pulse widths.

Servo Overheating

Symptom: The servo gets hot to the touch after a few minutes of operation.

Cause: The servo is being commanded to hold a position against a mechanical stop or a heavy load. This causes the motor to draw maximum current continuously. Reduce the load, or use a servo with metal gears (like the MG90S instead of the SG90) that can handle higher stall currents without overheating.

Scaling Up: From Prototype to Production

If you are thinking about taking this from a hobby project to a small-scale production system, there are a few things to consider.

Servo Lifespan

Micro servo motors are not designed for continuous industrial use. The plastic gears in the SG90 will wear out after about 50,000 cycles under moderate load. The metal gears in the MG90S can last 200,000 cycles or more. For a production system that runs 8 hours a day, 5 days a week, you should budget for servo replacement every 6 to 12 months.

Redundancy

In a production environment, a single servo failure can stop the entire line. Consider using two servos in parallel for critical gates, or implement a watchdog timer that alerts an operator if a servo does not reach its target position within a timeout.

Communication Protocol

For a system with more than 16 servos, the PCA9685’s I2C bus can become a bottleneck. Consider using a CAN bus or RS-485 interface with a dedicated servo controller. The Raspberry Pi can act as the master, sending high-level commands (e.g., “open gate 3”) while the servo controller handles the real-time PWM generation.

Safety

If a servo fails in an unsafe position (e.g., a gate stuck open when it should be closed), items could fall into the wrong bin or cause a jam. Add limit switches that the Pi can read to verify the servo’s physical position independently of the PWM command.

Final Thoughts on Micro Servo Motors and Raspberry Pi

Implementing micro servo motors in a Raspberry Pi-based sorting and packaging system is one of the most satisfying projects you can build. It bridges the gap between software and hardware, between the digital world of GPIO pins and the physical world of moving gates and conveyor belts. The micro servo motor, despite its small size and low cost, is capable of performing precise, repeatable movements that are the foundation of any automation system.

What I love most about this setup is the accessibility. You can build a functional sorting system for under $150. You do not need a CNC machine or a soldering station (though both help). You just need a Raspberry Pi, a few micro servos, some sensors, and a willingness to debug at 2 AM when the servo decides to do the opposite of what you commanded.

If you are just starting out, buy a pack of five MG90S servos, a PCA9685 board, and a Raspberry Pi 4. Write the calibration script first. Then build a single gate. Then add a sensor. Then add a second gate. Before you know it, you will have a fully automated packaging line on your desk, sorting candies or resistors or whatever small objects you can feed it.

And the best part? When someone asks you how it works, you can say, “It’s just a tiny motor that knows where it is.”

Copyright Statement:

Author: Micro Servo Motor

Link: https://microservomotor.com/micro-servo-motor-with-raspberry-pi/servo-motors-raspberry-pi-sorting-packaging-systems.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!

Tags