Сборка Arduino сортировщика цветов: простой гид с TCS3200 и сервоприводами
В этой статье я покажу, как сделать сортировщик цветов на Arduino. Вы можете посмотреть видео ниже или прочитать подробное описание. Для этого проекта понадобятся только датчик цвета TCS3200 и два хоббийных сервопривода, что делает сборку простой, но очень увлекательной. Сначала в SolidWorks я спроектировал 3D-модель сортировщика. Принцип работы такой: Ниже можно скачать 3D-моделю и чертежи со всеми размерами для изготовления корпуса. Модель также доступна для просмотра в браузере на Thangs. Скачать сборку в формате STEP на Thangs. Следующие чертежи подойдут для лазерной резки всех деталей корпуса: Материал — 3-мм волокнистая плита (оргалит). Детали перенесены с чертежей и вырезаны небольшой ручной пилой. Сборка начинается с внешних стенок — их склеивают клеевым пистолетом. Затем универсальным клеем фиксируют оба сервопривода на своих платформах и устанавливают в сборку. После этого клеят направляющую рельсу на нижний сервопривод, а также опору и платформу для верхнего сервопривода. Далее устанавливают выключатель и джек питания для подключения 5-В адаптера, а на третьей платформе монтируют датчик цвета. Все компоненты соединяют согласно схеме ниже. Необходимые комплектующие: Сначала загружаем скетч в Arduino, затем завершаем сборку. Полный код: Описание кода: Подключаем библиотеку В Функция Полученные RGB-значения для каждого цвета конфет. Допуск нужен, так как датчик неидеален. Оператор После загрузки кода Arduino закрепляют клеевым пистолетом. Из прозрачного пластикового бутылки делают загрузочный бункер и вместе с верхней крышкой клеят к корпусу. Проект готов. Задавайте вопросы в комментариях!Конструкция


Сборка Arduino сортировщика цветов





Исходный код Arduino
/* Arduino Project - Color Sorting Machine
* by Dejan Nedelkovski, www.HowToMechatronics.com
*/
#include <Servo.h>
#define S0 2
#define S1 3
#define S2 4
#define S3 5
#define sensorOut 6
Servo topServo;
Servo bottomServo;
int frequency = 0;
int color = 0;
void setup() {
pinMode(S0, OUTPUT);
pinMode(S1, OUTPUT);
pinMode(S2, OUTPUT);
pinMode(S3, OUTPUT);
pinMode(sensorOut, INPUT);
// Настройка масштабирования частоты 20%
digitalWrite(S0, HIGH);
digitalWrite(S1, LOW);
topServo.attach(7);
bottomServo.attach(8);
Serial.begin(9600);
}
void loop() {
topServo.write(115);
delay(500);
for (int i = 115; i > 65; i--) {
topServo.write(i);
delay(2);
}
delay(500);
color = readColor();
delay(10);
switch (color) {
case 1: bottomServo.write(50); break;
case 2: bottomServo.write(75); break;
case 3: bottomServo.write(100); break;
case 4: bottomServo.write(125); break;
case 5: bottomServo.write(150); break;
case 6: bottomServo.write(175); break;
case 0: break;
}
delay(300);
for (int i = 65; i > 29; i--) {
topServo.write(i);
delay(2);
}
delay(200);
for (int i = 29; i < 115; i++) {
topServo.write(i);
delay(2);
}
color = 0;
}
// Функция чтения цвета
int readColor() {
// Красный фильтр
digitalWrite(S2, LOW);
digitalWrite(S3, LOW);
frequency = pulseIn(sensorOut, LOW);
int R = frequency;
Serial.print("R= ");
Serial.print(frequency);
Serial.print(" ");
delay(50);
// Зелёный фильтр
digitalWrite(S2, HIGH);
digitalWrite(S3, HIGH);
frequency = pulseIn(sensorOut, LOW);
int G = frequency;
Serial.print("G= ");
Serial.print(frequency);
Serial.print(" ");
delay(50);
// Синий фильтр
digitalWrite(S2, LOW);
digitalWrite(S3, HIGH);
frequency = pulseIn(sensorOut, LOW);
int B = frequency;
Serial.print("B= ");
Serial.print(frequency);
Serial.println(" ");
delay(50);
if (R < 45 && R > 32 && G < 65 && G > 55) { color = 1; } // Красный
if (G < 55 && G > 43 && B < 47 && B > 35) { color = 2; } // Оранжевый
if (R < 53 && R > 40 && G < 53 && G > 40) { color = 3; } // Зелёный
if (R < 38 && R > 24 && G < 44 && G > 30) { color = 4; } // Жёлтый
if (R < 56 && R > 46 && G < 65 && G > 55) { color = 5; } // Коричневый
if (G < 58 && G > 45 && B < 40 && B > 26) { color = 6; } // Синий
return color;
}Servo.h, задаём пины датчика, создаём объекты сервоприводов и переменные. В setup() настраиваем пины, масштабирование частоты датчика (20%), привязываем сервоприводы к пинам 7 и 8, запускаем последовательный порт.loop() верхний сервопривод подъезжает к загрузочному бункеру (значение 115 — подстройте под свою механику). Цикл for плавно поворачивает сервопривод, подавая конфету к датчику. После паузы вызывается readColor().readColor() последовательно включает красный, зелёный и синий фильтры датчика, измеряет частоту импульсов на выходе и получает три значения R, G, B. На основе эмпирических порогов (с допуском ±5) определяет цвет и возвращает код 1–6.
switch-case поворачивает нижний сервопривод в позицию, соответствующую цвету. В конце верхний сервопривод доворачивается, сбрасывая конфету в рельсу, и возвращается в исходное положение для следующего цикла.Завершение сборки


Производственный процесс
- Создание потрясающей системы Ambilight для монитора на Arduino
- Создание классической игры Pong на Arduino UNO с OLED-дисплеем: пошаговый урок
- Детектор аудиочастот на Arduino: измеряем пик громкости с высокочувствительным модулем
- Собираем свой Tamagotchi на Arduino: цифровой питомец своими руками
- Умный беспроводной выключатель света: Arduino-контроллер для удаленного управления
- Крестики-нолики на Arduino с матрицей MAX7219 и картонным корпусом
- Умный водяной пистолет с датчиком движения на Arduino Nano
- Сборка надежного таймера обратного отсчета на Arduino с 7-сегментным дисплеем SparkFun
- Arduino RGB-микшер цветов: Простой проект для начинающих
- Arduino Sunflower: электронный подсолнух, следящий за солнцем