Продвинутая машина для сортировки по цвету на Arduino и RGB-датчике
Компоненты и материалы
| Arduino Nano R3 | ×1 |
| RGB-датчик TCS34725 | ×1 |
| Понижающий преобразователь LM2596 | ×1 |
| Сервоприводы MG-90S | ×2 |
| Подшипник MR105ZZ (5×10×4 мм) | ×3 |
| Подшипник 608RS или 608ZZ (8×22×7 мм) | ×1 |
| Подшипник 6003RS (17×35×10 мм) | ×1 |
| Винт M3×15 мм зыбчатый с потайной головкой | ×1 |
| Самонарезающие винты M2×10 | ×20 |
| RGB-светодиод (общий анод) | ×1 |
| Резисторы 220 Ом | ×3 |
| Провода | ×1 комплект |
| Джек 2.1×5.5 мм | ×1 |
| Термоусадочная трубка | ×1 |
| Разъемы Dupont | ×1 комплект |
| Блок питания 9V или 12V (мин. 1 А) | ×1 |
| Пробные пробирки 22 мм (наружн. диам.) × 100 мм (от Danmu Art) | ×5 |
| Skittles (для тестирования) | ×1 пакет |
Необходимые инструменты
- 3D-принтер
- Отвертка
- Обкусыватель для проводов
- Плоскогубцы
- Паяльник
- Мультиметр
- Клещ для обжима
О проекте

Введение
Забавная история: этот проект изначально не планировался. Примерно 3,5 года назад я начал проектировать более сложную машину для сортировки по цвету, но, как и многие мои проекты, она осталась незаконченной и запылилась на подоконнике. Несколько месяцев назад я решил вернуться к старой идее. Первой задачей было придумать, как надежно забирать Skittles из бункера и определять их цвет, сохраняя компактность системы (в первый раз мне это не удалось). Я убедил себя, что простая машина для сортировки займет всего пару выходных... О, как я ошибался!
Потребовалось два полностью разных дизайна и множество прототипов, чтобы добиться приемлемого результата (иногда всё ещё случаются проблемы с захватом конфет). Но несмотря на несовершенство, я доволен результатом.



Принцип работы
Машина состоит из двух основных этапов:
- Верхний этап — бункер и механизм подачи. На дне бункера находится механизм, который забирает конфеты и позиционирует их перед цветовым датчиком. Рука-встряхиватель мешает застреванию конфет в бункере (хотя иногда это всё равно происходит).
- Нижний этап — держатель пробирок. После определения цвета конфеты держатель поворачивает нужную пробирку под механизм подачи, и конфета падает внутрь. Цикл повторяется до опустошения бункера.

Хотите сделать свою?
Подробная инструкция, STL-файлы для печати и код доступны на сайте автора: littlefrenchkev.com/colour-sorting-machine


Сборка
После печати деталей у вас должен получиться набор, подобный показанному на фото. Обратите внимание: передняя оболочка существует в двух версиях — они функционально идентичны, отличаются только внешним видом.




Видео процесса сборки доступно на сайте автора (включает художественную заставку с замедленной съемкой 3D-печати!).
Первоначальная настройка
При первом включении машина переводит оба сервопривода в исходное положение. Необходимо убедиться, что вал/зубчатое колесо для захвата конфет находится в верхнем положении, а держатель пробирок выровнен с механизмом подачи.

Устранение неисправностей
Светодиод мигает красным — нет стартовой последовательности
После перехода в исходное положение машина должна запустить стартовую последовательность. Если вместо этого светодиод мигает красным — проблема с RGB-датчиком: либо проводка, либо датчик неисправен.
Пробирки не выравниваются правильно
Причина 1: Во время стартовой последовательности держатель делает 5 движений (по одному на цвет). Если выравнивание плохое — это может быть из-за неточности сервоприводов или погрешностей печати. Корректируется программно через массив colour_angle — каждое значение задает положение сервопривода для соответствующего цвета.
Причина 2: Из-за погрешностей печати может возникать люфт в шестернях держателя. Инерция может заставлять пробирки перескакивать позицию остановки. Компенсируется переменными forward_anti_backlash и backward_anti_backlash, которые добавляются/вычитаются из угла в зависимости от направления вращения.
Смешение цветов

При смешении цветов нужно скорректировать массивы colour_limit_values. Каждый массив содержит минимумы и максимумы для R, G, B. Для калибровки: загрузите машину конфетами одного цвета, подключите к компьютеру, откройте монитор порта. При проверке каждой конфеты будут выводиться измеренные RGB-значения и распознанный цвет — это поможет задать правильные пороги.
Интересные функции
- RGB-светодиод: В процессе сортировки меняет цвет под цвет выбрасываемой конфеты. После опустошения бункера плавно переходит через все цвета. При ошибке датчика при старте мигает красным.
- Компенсация люфта: Держатель пробирок вращается через зубчатую передачу. Люфт в шестернях вызывает перелет позиции. Код компенсирует это, останавливая держатель раньше на величину, зависящую от направления вращения.
- Задержка с анимацией LED: Функция
set_led(ms, color)работает какdelay(), но плавно меняет цвет светодиода во время ожидания. Отлично смотрится, пока держатель поворачивается к нужной пробирке!
Дополнительные примечания
- Машина напечатана черным пластиком — это влияет на показания датчика, особенно когда в механизме нет конфеты.
- После множества циклов сортировки цвета читаются хуже — конфеты теряют блеск от трения в бункере или становятся липкими от рук. Для калибровки используйте «свежие» Skittles.
- При работе с едой используйте пищевой пластик для печати.
- Автор публикует работу над проектами в Instagram: @little_french_kev

Программный код
Полный код для Arduino IDE (файл LFK_sorting_machine.ino):
#include <Wire.h>
#include "Adafruit_TCS34725.h"
#include <Servo.h>
// Переменные RGB-датчика
Adafruit_TCS34725 tcs = Adafruit_TCS34725(TCS34725_INTEGRATIONTIME_24MS, TCS34725_GAIN_1X);
int colour = 0; // 0-черный, 1-желтый, 2-зеленый, 3-оранжевый, 4-красный, 5-фиолетовый
int previous_colour = colour;
int black_count = 0;
int start_measurment_angle = 88;
int measurment_sweep = 2;
int measurment_angle_increment = 4;
// Пороговые значения цветов [minR, maxR, minG, maxG, minB, maxB]
uint16_t black_limit_values[] = {0, 200, 0, 200, 0, 200};
uint16_t yellow_limit_values[] = {850, 2200, 800, 2200, 400, 1100};
uint16_t green_limit_values[] = {400, 800, 700, 1400, 300, 700};
uint16_t orange_limit_values[] = {650, 1800, 300, 850, 210, 600};
uint16_t red_limit_values[] = {400, 950, 150, 450, 150, 400};
uint16_t purple_limit_values[] = {150, 400, 150, 450, 150, 500};
// RGB-светодиод
byte R_pin = 5, G_pin = 6, B_pin = 11;
int current_red_value = 255, current_green_value = 255, current_blue_value = 255;
const int orange[] = {0, 230, 255};
const int red[] = {0, 255, 255};
const int green[] = {255, 0, 255};
const int yellow[] = {0, 170, 255};
const int purple[] = {0, 255, 40};
// Сервоприводы
int release_delay = 220;
const int colour_angles[] = {10, 46, 82, 118, 154};
const int backward_anti_backlash = 2;
const int forward_anti_backlash = 2;
Servo feeder_servo;
Servo holder_servo;
void setup() {
Serial.begin(9600);
pinMode(R_pin, OUTPUT); pinMode(G_pin, OUTPUT); pinMode(B_pin, OUTPUT);
analogWrite(R_pin, 255); analogWrite(G_pin, 255); analogWrite(B_pin, 255);
feeder_servo.attach(3);
holder_servo.attach(2);
feeder_servo.write(0);
holder_servo.write(colour_angles[0]);
if (tcs.begin()) {
Serial.println("Found sensor");
starting_sequence();
} else {
Serial.println("No TCS34725 found ... check your connections");
while (1) { set_led(300, red); set_led(300, black); }
}
}
void loop() {
if (black_count < 10) {
feeder_servo.write(0); delay(450);
previous_colour = colour;
get_colour();
if (colour == 0) { black_count++; shake(); }
else if (colour == 6) { black_count++; }
else { move_holder(); release_skittle(); black_count = 0; }
} else { end_loop(1000); }
}
// ... (остальные функции: get_colour, move_holder, release_skittle, shake, starting_sequence, end_loop, set_led)
// Полный код см. в исходнике проекта
Схема подключения
Подключение простое. Главное — убедитесь, что понижающий преобразователь выдает 5В перед подключением остальных компонентов!

Производственный процесс
- ЭЭГ-аппараты: дизайн, производство и новые применения
- Торговые автоматы: индустрия США на $36,6 млрд
- Эволюция и производство швейных машин: от изобретений XIX века к современной автоматизации
- Телевизор: от механических истоков к умному будущему
- Подшипники шпинделя: точность и гарантия качества
- Основные узлы токарного станка: функции и обзор
- Понимание токарных станков: история, типы и применение
- Ключевые компоненты фрезерного станка: подробное объяснение
- Что такое машина: определение, принцип работы и механизмы
- JW Machine: услуги точного контрактного производства по чертежам ЧПУ