Ever wondered how industrial factories sort thousands of items per minute with flawless accuracy? Whether it’s separating ripe produce on an assembly line or organizing recyclables by material type, industrial automation is the backbone of modern manufacturing.
The coolest part? You don’t need an industrial engineering degree or a massive budget to understand how it works. You can build a fully functional, miniature automated color-based sorting machine right on your desk using an Arduino Uno, a TCS3200 color sensor, and a servo motor.
This comprehensive, step-by-step guide will cover the DIY electronics, the physics of color sensing, the circuit wiring diagram, and the programming logic required to bring this awesome mechatronics project to life.
1. How It Works: The Automated Sorting System Architecture
An automated Arduino color sorter relies on a classic input-process-output loop. When an object passes through the machine, it undergoes three distinct phases:
- The Input (Detection): The object travels down a gravity-fed chute or conveyor belt and stops in front of the sensor. The sensor flashes ultra-bright white LEDs onto the object and measures the reflected light waves.
- The Process (Decision Making): The sensor outputs a high-frequency signal proportional to the intensity of the colors. The Arduino micro-controller reads this frequency, matches it against pre-calibrated thresholds, and determines whether the item is red, green, blue, or another designated color.
- The Output (Physical Sorting): Once the Arduino identifies the color, it calculates the precise angle needed for the sorting arm. It sends a Pulse Width Modulation (PWM) signal to the servo motor, which physically swings a gate to route the object into its matching collection bin.
2. Arduino Color Sorter Components: Bill of Materials
To build a robust machine, you will need a mix of electronics and structural materials. Here is a breakdown of the essential Arduino project parts:
The Electronics
- Arduino Uno R3: The microprocessor “brain” that coordinates timing, reads sensor data, and controls the motor.
- TCS3200 Color Sensor Module: The “eyes” of the machine. It contains an array of photodiodes with red, green, blue, and clear filters.
- SG90 Micro Servo Motor: The actuator or “muscle” that acts as a mechanical gate to deflect items into separate paths.
- 9V Battery or 5V 2A Power Adapter: Essential for providing clean, stable power to the system.
- Jumper Wires & Breadboard: For making solderless, reusable connections during prototyping.
The Structural Build
You can build the physical chassis out of anything, but popular choices include:
- Cardboard or Foam Board: Cheap, easy to cut with a utility knife, and perfect for a rapid prototype.
- 3D Printed Parts: If you have access to a 3D printer, you can find brilliant, open-source gravity-fed hopper designs on sites like Thingiverse.
- Lego Technic: Incredible for building modular tracks and adjusting mechanical gates on the fly.
3. Deep Dive: How the TCS3200 Color Sensor Works
To write good code for this machine, you need to understand how the TCS3200 color sensor perceives color.
The sensor features an $8 \times 8$ grid of photodiodes:
- 16 photodiodes have Red filters.
- 16 photodiodes have Green filters.
- 16 photodiodes have Blue filters.
- 16 photodiodes are Clear (no filter).
By activating one set of filters at a time, the sensor outputs a square wave whose frequency is directly proportional to the intensity of that specific color light hitting it.
To tell the sensor which color you want to read, you toggle its configuration control pins (S2 and S3). For example, setting both S2 and S3 to a LOW voltage state tells the sensor to output the raw data for Red light.
4. Arduino Color Sensor Circuit Diagram & Wiring Guide
Connecting the components requires care. Because servo motors pull sudden surges of electrical current, wiring them incorrectly can cause your Arduino to reset or freeze up mid-sort.
Follow this pin mapping table to wire your prototype safely:
| Component | Component Pin | Arduino Pin | Description |
| TCS3200 Sensor | VCC / LED | 5V | Power supply for sensor & built-in LEDs |
| GND | GND | Ground connection | |
| S0 | Pin 2 | Output frequency scaling selector | |
| S1 | Pin 3 | Output frequency scaling selector | |
| S2 | Pin 4 | Photodiode color type selector | |
| S3 | Pin 5 | Photodiode color type selector | |
| OUT | Pin 6 | Frequency output signal | |
| SG90 Servo | Orange / Yellow | Pin 9 | PWM Signal control pin |
| Red | 5V (or Ext 5V) | Power supply | |
| Brown / Black | GND | Ground connection |
⚠️ Important Circuit Power Note: The Arduino’s built-in 5V regulator can comfortably power the color sensor and one small micro-servo. If you upgrade to a larger servo (like an MG996R) or add a motorized conveyor belt, you must use an external 5V power supply for the motors. Always ensure the ground (GND) wire of your external power supply is connected back to the Arduino’s GND pin so they share a common reference point.
5. Arduino Color Sorter Code
The software follows a sequential loop. First, it scales the output frequency. Next, it reads the RGB values one by one. Finally, an if-else statement tree decides where to send the servo arm.
Here is an advanced baseline Arduino sorting machine code script to upload to your Arduino IDE:
C++
#include <Servo.h>
// Define TCS3200 color sensor pin mappings
#define S0 2
#define S1 3
#define S2 4
#define S3 5
#define sensorOut 6
// Create a servo object
Servo sortingServo;
// Variables to store color frequency readings
int redFrequency = 0;
int greenFrequency = 0;
int blueFrequency = 0;
void setup() {
// Set up sensor control pins as outputs
pinMode(S0, OUTPUT);
pinMode(S1, OUTPUT);
pinMode(S2, OUTPUT);
pinMode(S3, OUTPUT);
// Set up the sensor output pin as an input
pinMode(sensorOut, INPUT);
// Set Output Frequency Scaling to 20% (Standard for Arduino)
digitalWrite(S0, HIGH);
digitalWrite(S1, LOW);
// Attach the servo on pin 9 and set to baseline home position
sortingServo.attach(9);
sortingServo.write(90);
// Initialize serial communication for calibration debugging
Serial.begin(9600);
}
void loop() {
// --- STEP 1: Read Red Photiodiodes ---
digitalWrite(S2, LOW);
digitalWrite(S3, LOW);
redFrequency = pulseIn(sensorOut, LOW);
delay(20);
// --- STEP 2: Read Green Photiodiodes ---
digitalWrite(S2, HIGH);
digitalWrite(S3, HIGH);
greenFrequency = pulseIn(sensorOut, LOW);
delay(20);
// --- STEP 3: Read Blue Photiodiodes ---
digitalWrite(S2, LOW);
digitalWrite(S3, HIGH);
blueFrequency = pulseIn(sensorOut, LOW);
delay(20);
// Print values to Serial Monitor for manual tuning and calibration
Serial.print("R = "); Serial.print(redFrequency);
Serial.print(" | G = "); Serial.print(greenFrequency);
Serial.print(" | B = "); Serial.println(blueFrequency);
// --- STEP 4: Sorting Logic Execution ---
// Note: The lower the pulseIn frequency number, the stronger that color intensity is!
if (redFrequency < greenFrequency && redFrequency < blueFrequency && redFrequency < 100) {
Serial.println(">>> RED ITEM DETECTED <<<");
sortingServo.write(45); // Swing gate left for red items
delay(1200); // Wait for item to pass down the chute
}
else if (greenFrequency < redFrequency && greenFrequency < blueFrequency && greenFrequency < 100) {
Serial.println(">>> GREEN ITEM DETECTED <<<");
sortingServo.write(135); // Swing gate right for green items
delay(1200);
}
// Return servo back to center home position to catch the next item
sortingServo.write(90);
delay(500);
}
6. Crucial Step: TCS3200 Calibration
You cannot skip sensor calibration! If you upload the code directly, the machine might completely ignore your items or sort them into the wrong bins.
This happens because ambient room lighting drastically alters how the sensor reads colors. A bright fluorescent light overhead or sunlight pouring in from a nearby window will skew your values.
How to Calibrate Your Color Sensor
- Open the Serial Monitor in your Arduino IDE (
Ctrl + Shift + M). - Place a purely Red object right in front of the sensor (roughly 1cm away).
- Look at the numbers printing out. Write down the average values for
R,G, andB. (You’ll notice that when a red item is present, theRfrequency drops significantly lower thanGandB). - Repeat this exact process with a Green object and a Blue object.
- Update the conditional limits inside your
if-elseloops in the code using those custom, real-world benchmark numbers.
💡 Design Hack: To protect your sensor from shifting ambient light conditions, build a small “darkroom” or enclosed scanning chamber out of black cardboard around the sensor. This isolates the target object so that only the built-in white LEDs illuminate it, guaranteeing consistent data readings day or night






