Промышленное производство
Промышленный Интернет вещей | Промышленные материалы | Техническое обслуживание и ремонт оборудования | Промышленное программирование |
home  MfgRobots >> Промышленное производство >  >> Manufacturing Technology >> Производственный процесс

Машина для сортировки по цвету

Компоненты и расходные материалы

Arduino Nano R3
× 1
RGB-датчик TCS 34725
× 1
Понижающий преобразователь LM2596
× 1
Сервоприводы MG-90S
× 2
Шарикоподшипник MR105ZZ (5 x 10 x 4 мм)
× 3
Шарикоподшипник 608RS или 608ZZ (8 x 22 x 7 мм)
× 1
Шарикоподшипник 6003RS (17x35x10 мм)
× 1
Винт с потайной головкой M3 * 15 мм
× 1
Саморезы M2x10
× 20
Светодиод RGB (общий анод (+))
× 1
резисторы 220 Ом
× 3
провода
× 1
штекер 2,1x5,5 мм
× 1
термоусадочная трубка
× 1
соединители dupont
× 1
Источник питания 9 В или 12 В (минимум 1 А)
× 1
Пробирки 5 x 22 мм (OD) x 100 мм (от Danmu Art)
× 1
Кегли !!!!!!!!!!
× 1

Необходимые инструменты и машины

3D-принтер
отвертка
инструмент для зачистки проводов
плоскогубцы
паяльник
мультиметр
инструмент для обжима

Об этом проекте


ВВЕДЕНИЕ.

Забавно то, что этому проекту не суждено было сбыться.

Около 3,5 лет назад я начал разрабатывать более интересную машину для сортировки по цвету, и, как и многие мои проекты, она закончилась тем, что наполовину закончила собирать пыль на подоконнике (я уверен, что никто другой не может относиться к этому, ха-ха).

Короче говоря, несколько месяцев назад я решил снова взяться за этот старый проект. Первое, что мне нужно было решить, это как собрать кегли из резервуара и достаточно надежно проверить их цвет, сохраняя при этом систему как можно более компактной (чего мне не удалось добиться с первого раза). Мне удалось уговорить себя разработать более простую машину для сортировки по цвету, чтобы правильно спроектировать систему сбора. Я по глупости подумал, что это будет работа на 2 выходных, красиво, легко и быстро ... О, мальчик !!! я был неправ ...

Я взял себе два совершенно разных дизайна и множество доработанных прототипов, чтобы получить что-то, что работало бы приемлемым образом (время от времени у меня все еще возникают некоторые проблемы).

Несмотря на то, что он не идеален, я очень доволен результатом.

КАК ЭТО РАБОТАЕТ.

Машину можно разделить на 2 основных этапа.

Наверху находится резервуар для несортированных кеглей. Внизу резервуара находится механизм подачи, отвечающий за сбор кеглей и размещение их перед датчиком цвета, где будет проверяться их цвет.

Механизм подачи включает рычаг, который встряхивает содержимое резервуара, чтобы убедиться, что кегли хорошо протекают через отверстие механизма подачи, не застревая внутри резервуара (к сожалению, это все еще происходит иногда).

Как только цвет Кегли найден, в действие вступает второй этап машины. Держатель пробирок выровняйте правую пробирку перед механизмом подачи для кегли.

Затем цикл можно повторять до тех пор, пока резервуар не опустеет.

ХОТИТЕ СДЕЛАТЬ СОБСТВЕННЫМ ???

.................. https://www.littlefrenchkev.com/colour-sorting-machine ................. ......

СБОРКА.

После того, как вы скачали и распечатали детали, у вас должно получиться что-то вроде этого:

Обратите внимание, что передняя оболочка выпускается в 2-х вариантах. Никакой реальной разницы, они просто выглядят по-другому.

Остальные запчасти нужны.

Вот видео процесса сборки. Я даже пытался стать художником, сделав вступление из снимков с медленного 3D-принтера !!!

НАЧАЛЬНАЯ НАСТРОЙКА.

Первое, что делает машина, когда вы включаете питание, - это переводит оба сервопривода в исходное положение. При первом запуске машины необходимо убедиться, что шестерня / вал, собирающий кегли, находится в верхнем положении, а держатель трубки совмещен с механизмом подачи.

УСТРАНЕНИЕ НЕПОЛАДОК.

Если вы решите сделать эту сортировочную машину самостоятельно, вы можете столкнуться с несколькими типичными проблемами. вот как их можно решить.

Светодиод мигает красным - нет последовательности запуска:

После перемещения в исходное положение машина должна пройти последовательность запуска. Если этого не происходит, и вместо этого светодиод мигает красным, это означает, что у вас есть проблемы с тем, что ваш датчик RBG не обнаружен. Либо проблема с проводкой, либо неисправен датчик.

Трубки не выравниваются должным образом:

Причина 1

Во время начальной последовательности держатель пробирок перемещается 5 раз, по одному для каждого цвета. Вы можете заметить, что трубки не слишком хорошо совпадают с механизмом подачи. Это может быть связано с тем, что сервоприводы не являются сверхточными или с некоторыми вариациями в размерах печати. ​​

Это можно исправить с помощью программного обеспечения, изменив массив переменных colour_angle. Каждое значение в этом массиве представляет положение сервопривода для каждого цвета, изменяя эти значения, вы можете точно настроить место остановки трубки для каждого цвета.

Причина 2

Из-за допусков на печать вы также можете получить люфт в шестернях держателя трубок. В зависимости от того, в каком направлении вращаются лампы, их инерция может заставить их выйти за пределы положения остановки. Это также можно исправить с помощью программного обеспечения, изменив переменные анти-люфта прямой и обратной промывки. Это значение будет добавлено или удалено из значений цветового угла в зависимости от того, в какую сторону вращается держатель, чтобы компенсировать этот люфт.

Смешивание цветов:

Если вы испытываете некоторое смешение цветов, вам придется изменить массивы colour_limit_values. Каждое значение в этом массиве представляет собой минимальное и максимальное значения для красного, зеленого и синего цветов. Чтобы лучше понять, какими должны быть значения, загрузите устройство только одним цветом, подключите устройство к компьютеру и откройте монитор последовательного порта. Каждый раз, когда Skittle проверяется, вы должны получать считанные значения RGB и цвет, который программа считает его цветом. Это должно дать вам лучшее представление о том, какие значения должны быть связаны с каждым цветом.

НЕСКОЛЬКО КЛАССНЫХ ФУНКЦИЙ.

(ну, я все равно думаю!)

Светодиод RGB:

В основании машины установлен светодиод RGB. В процессе сортировки он меняет цвет, чтобы соответствовать цвету выпавшей кегли. Когда резервуар опустеет, он непрерывно перебирает все цвета кегли.

Он также будет мигать красным при запуске, если обнаружена проблема с датчиком.

Компенсация люфта:

Держатель трубок вращается с помощью пары цилиндрических зубчатых колес. Из-за допуска к печати очень сложно полностью избавиться от люфта шестерен. Это означает, что держатель трубки имеет тенденцию выходить за пределы своего идеального положения. Код позволяет компенсировать это, останавливая держатель раньше на определенную величину в зависимости от того, в каком направлении вращается держатель.

Задержка с доплатой:

Код включает функцию "set_led (ms, color)". Он действует точно так же, как функция «delay (ms)», но позволяет светодиоду плавно переходить к новому цвету, пока происходит задержка. Приятно изменить цвет светодиода, пока держатель трубки вращается в нужное положение!

ДОПОЛНИТЕЛЬНЫЕ ПРИМЕЧАНИЯ.

Примечание 1. Я напечатал свою машину черным цветом, это повлияет на то, какие значения цвета будет считывать датчик, особенно когда механизм подачи не собирает кегли.

Примечание 2:после прохождения процесса сортировки несколько раз кажется, что цвета Skittles становятся более трудными для надежного чтения. Я предполагаю, что это связано с тем, что они теряют свой блеск после многократного втирания внутри резервуара или становятся немного более липкими при ручном обращении (звучит грубо!). При калибровке значений цвета старайтесь использовать «свежие» кегли.

Примечание 3:убедитесь, что вы принимаете все необходимые меры предосторожности при обращении с пищевыми продуктами. Это включает в себя использование пищевой нити для печати. ​​

Примечание 4:я пытаюсь опубликовать в Instagram информацию о незавершенной работе и проекте, над которым я работаю. Если это ваша вещь, вы можете посмотреть здесь:https://www.instagram.com/little_french_kev/


Код

  • LFK_sorting_machine
Машина_сортировки LFK C / C ++
Вот код Arduino для сортировочной машины.
 #include  #include "Adafruit_TCS34725.h" #include  / * На основе кода примера для прорывной библиотеки Adafruit TCS34725 * /// =======================Переменные, связанные с датчиком RGB =========================Adafruit_TCS34725 tcs =Adafruit_TCS34725 (TCS34725_INTEGRATIONTIME_24MS, TCS34725_GAIN_1X); // настройка датчика RGBint color =0; // 0-черный, 1-желтый, 2-зеленый, 3-оранжевый, 4-красный, 5-фиолетовыйint previous_colour =color; int black_count =0; // количество пустых / неизвестных цветов int start_measurment_angle =88; // положение сервопривода для выравнивания кегли перед сенсоромint measure_sweep =2; // номер принятого измерения. используется для усреднения ошибки int correment_angle_increment =4; // приращение угла между измерениями // предельные значения [] ={min_red_values, max_red_values, min_green_values, max_green_values, min_blue_values, max_blue_values} uint16_t black_limit_values ​​[] ={0, 200, 0, 200, 0, 200}; uint16_values ​​[] uint16_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-светодиодами =========================байт R_pin =5; byte G_pin =6; byte B_pin =11; int current_red_value =255; int current_green_value =255; int 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}; // {10, 46, 82, 118, 154}; // int holder_offset =0; // регулировка смещения держателя трубок. должно быть между 0 и 36const int backward_anti_backlash =2; const int forward_anti_backlash =2; Servofeder_servo; // объявляем фидер servoServo Holder_servo; // объявление сервопривода держателя трубок // =====================================НАСТРОЙКА =========================================void setup (void) {Serial.begin (9600); pinMode (R_pin, ВЫХОД); // устанавливаем вывод светодиода pinMode (G_pin, OUTPUT); pinMode (B_pin, ВЫХОД); analogWrite (R_pin, 255); // выключить светодиод analogWrite (G_pin, 255); analogWrite (B_pin, 255); фидер_ резервуар. прикрепить (3); // прикрепляем сервопривод питателя к выводу 3 Holder_servo.attach (2); // прикрепляем сервопривод держателя к выводу 2feder_servo.write (0); держатель_ резервуар.write (colour_angles [0]); int white [] ={0, 0, 0}; // переменная локальных значений белого цвета int black [] ={255, 255, 255}; // локальная переменная значений черного set_led (1000, white); // включаем светодиод (белый) if (tcs.begin ()) {// проверяем, найден ли датчик Serial.println ("Найден датчик"); start_sequence (); } else {Serial.println ("TCS34725 не найден ... проверьте соединения"); while (1) // быстрое мигание красным, если датчик не найден {set_led (300, red); set_led (300, черный); }}} // ===================================ЦИКЛ =========================================void loop (void) {if (black_count <10) {feeder_servo.write (0 ); // установить положение сервопривода вверх для задержки сбора кегли (450); // задержка, чтобы сервопривод фидера успел занять позицию previous_colour =color; get_colour (); // считываем цвет кегли if (color ==0) {black_count ++; // если цвет не найден, увеличиваем счетчик черного shake (); // немного больше встряхиваем резервуар, даже если кегли нет} else if (color ==6) {black_count ++; // если цвет неизвестен, увеличиваем счетчик черного - кегля не отпускается} else {// если цвет найден move_holder (); // перемещаем держатель трубки release_skittle (); // выпускаем кеглю black_count =0; }} еще {end_loop (1000); }} // ===================================ПОЛУЧИТЬ ЦВЕТ =========================================void get_colour () {uint16_t r, g, b, c; //, colorTemp , люкс; uint16_t total_r =0; uint16_t total_g =0; uint16_t total_b =0; feeder_servo.write (начальный_угол измерения); // переход к началу измерения угла задержки (200); Serial.println ("----------------"); for (int i =0; i <=measure_sweep; i ++) // цикл для каждой меры {tcs.getRawData (&r, &g, &b, &c); // получить данные о цветеfeder_servo.write (start_measurment_angle + i * Measurment_angle_increment); // увеличить угол сервопривода для следующего измерения total_r + =r; // добавляем значение красного к общему значению красного total_g + =g; // добавляем значение зеленого к общему значению зеленого total_b + =b; // добавляем синее значение к общему синему значению delay (15); } total_r / =развертка_измерения; // средние значения по всем измерениям total_g / =measure_sweep; total_b / =развертка_измерения; Serial.print (total_r); Serial.print (""); Serial.print (total_g); Serial.print (""); Serial.print (total_b); Serial.print (""); Serial.println (""); // сравниваем значения для определения цвета. if ((total_r  =yellow_limit_values ​​[0]) &&// проверка на желтый (total_r  =yellow_limit_values ​​[2]) &&(total_g  =yellow_limit_values ​​[4]) &&(total_b  =green_limit_values ​​[0]) &&// проверка на зеленый (total_r  =green_limit_values ​​[2]) &&(total_g  =green_limit_values ​​[4]) &&(total_b  =orange_limit_values ​​[0]) &&// проверка на оранжевый (total_r  =orange_limit_values ​​[2]) &&(total_g  =orange_limit_values ​​[4]) &&(total_b  =red_limit_values ​​[0]) &&// проверка на красный (total_r  =red_limit_values ​​[2]) &&(total_g  =red_limit_values ​​[4]) &&(total_b  =purple_limit_values ​​[0]) &&// проверка на фиолетовый (total_r  =purple_limit_values ​​[2]) &&(total_g  =purple_limit_values ​​[4]) &&(total_b  color) {// заставляет сервопривод держателя вернуться дальше, чем нормальное положение, чтобы компенсировать люфт передачи int anti_backlash_angle =new_holder_position - backward_anti_backlash; держатель_ резервуар.write (anti_backlash_angle); // задержка (holder_delay); } еще {int anti_backlash_angle =new_holder_position + forward_anti_backlash; //holder_servo.write(anti_backlash_angle); держатель_ резервуар.write (новое_холдер_положение); // перемещаем держатель в позицию // delay (holder_delay); } if (color ==1) {set_led (holder_delay, желтый); } else if (color ==2) {set_led (holder_delay, зеленый); } else if (color ==3) {set_led (holder_delay, оранжевый); } else if (color ==4) {set_led (holder_delay, красный); } else if (color ==5) {set_led (holder_delay, фиолетовый); } else {}} // =============================ВЫПУСКАТЬ SKITTLE ===========================void release_skittle () {feeder_servo.write (180); // установить положение сервопривода вниз для задержки выпуска кегля (release_delay);} // =================================SHAKE =================================void shake () {int shake_delay =80; int shake_amount =5; int shake_min_value =90; int shake_max_value =180; feeder_servo.write (180); // устанавливаем положение сервопривода вниз для задержки выпуска кегли (release_delay); feeder_servo.write (120); // устанавливаем положение сервопривода вниз для задержки выпуска кегли (80); for (int i =0; i <=shake_amount; i ++) // цикл для каждого измерения {feeder_servo.write (shake_min_value); // установить положение сервопривода вниз для задержки выпуска кегли (shake_delay); feeder_servo.write (shake_max_value); // установить положение сервопривода вниз для задержки выпуска кегли (shake_delay); }} // ============================НАЧАЛО ПОСЛЕДОВАТЕЛЬНОСТИ ============================пустота start_sequence () {цвет =1; move_holder (); set_led (300, желтый); задержка (400); цвет =2; move_holder (); set_led (300, зеленый); задержка (400); цвет =3; move_holder (); set_led (300, оранжевый); задержка (400); цвет =4; move_holder (); set_led (300, красный); задержка (400); цвет =5; move_holder (); set_led (300, фиолетовый); задержка (400); previous_colour =цвет; цвет =3; move_holder (); end_loop (200);} // ================================КОНЕЦ ПЕТЛИ =================================void end_loop (int duration) {set_led (duration, orange); set_led (продолжительность, красный); set_led (продолжительность, зеленый); set_led (продолжительность, желтый); set_led (duration, purple);} // ============================УСТАНОВКА ЦВЕТА СВЕТОДИОДА RGB =======================// Это действует как delay (), но позволяет светодиоду менять цвет во время ожидания .void set_led (int duration, int color [3]) {int start_time =миллис (); // значение времени начала int current_time =start_time; // текущее значение времени int current_duration =0; // общая продолжительность while (current_duration  

Схема

Электропроводка довольно проста. Просто убедитесь, что ваш понижающий преобразователь выдает 5 В, прежде чем подключать к нему что-либо !!!!!

Производственный процесс

  1. Машина ЭЭГ
  2. Торговый автомат
  3. Швейная машина
  4. Телевидение
  5. Подшипник шпинделя и качество подшипников
  6. Части токарного станка
  7. Понимание токарного станка
  8. Компонент фрезерного станка
  9. Понимание машины
  10. JW Машина