산업 제조
산업용 사물 인터넷 | 산업자재 | 장비 유지 보수 및 수리 | 산업 프로그래밍 |
home  MfgRobots >> 산업 제조 >  >> Manufacturing Technology >> 제조공정

색상 분류 기계

구성품 및 소모품

Arduino Nano R3
× 1
TCS 34725 RGB 센서
× 1
LM2596 벅 컨버터
× 1
MG-90S 서보
× 2
MR105ZZ 볼 베어링(5 x 10 x 4mm)
× 3
608RS 또는 608ZZ 볼 베어링(8 x 22 x 7mm)
× 1
6003RS 볼 베어링(17x35x10mm)
× 1
M3*15mm 접시머리 나사
× 1
M2x10 셀프 테이핑 나사
× 20
RGB led(공통 양극(+))
× 1
220옴 저항기
× 3
와이어
× 1
2.1x5.5mm 잭 플러그
× 1
열수축 튜브
× 1
듀퐁 커넥터
× 1
9V 또는 12v 전원 공급 장치(최소 1암페어)
× 1
5X 22mm(OD)x100mm 시험관(단무아트)
× 1
스키틀즈!!!!!!!!!!
× 1

필요한 도구 및 기계

3D 프린터
스크루드라이버
와이어 스트리퍼
플라이어
납땜 인두
멀티미터
압착 도구

이 프로젝트 정보


소개.

재미있는 이야기는 이 프로젝트가 의도된 것이 아니라는 것입니다.

약 3.5년 전에 나는 훨씬 더 펑키한 색상 분류 기계를 디자인하기 시작했고 많은 내 프로젝트와 마찬가지로 창 선반에 먼지를 모으는 것이 반쯤 끝났습니다.

간단히 말해서, 몇 달 전에 저는 이 오래된 프로젝트를 백업하기로 결정했습니다. 내가 해결해야 할 첫 번째 일은 저수지에서 Skittles를 수집하고 시스템을 가능한 한 컴팩트하게 유지하면서 색상을 매우 안정적으로 확인하는 방법이었습니다(처음에는 달성하지 못했습니다). 나는 컬렉션 시스템의 디자인을 올바르게 만들기 위해 더 간단한 색상 분류 기계를 디자인하는 데 자신을 이야기했습니다. 어리석게도 2주만에 하는 일이구나, 쉽고, 빠르고, 좋은 일이라고 생각했는데... 오, 이런!!! 내가 틀렸나...

나는 2개의 완전히 다른 디자인과 많은 수정된 프로토타입을 가져와서 만족스러운 방식으로 작동하는 것을 얻었습니다(나는 여전히 때때로 픽업 문제를 경험하고 있습니다).

비록 완벽하지는 않지만 결과에 매우 만족합니다.

작동 원리.

기계는 2개의 주요 단계로 나눌 수 있습니다.

상단에서 분류되지 않은 Skittles의 저장소를 찾을 수 있습니다. 이 저장소의 바닥에는 스키틀즈를 수집하고 색상을 확인할 컬러 센서 앞에 위치시키는 공급 장치가 있습니다.

공급 메커니즘에는 저장고 내부의 걸림 없이 스키틀즈가 공급 메커니즘의 오리피스를 통해 잘 흐르도록 저장통의 내용물을 흔드는 암이 포함됩니다(불행하게도 가끔 발생합니다).

Skittle의 색상을 찾으면 기계의 두 번째 단계가 작동합니다. 테스트 튜브 홀더는 Skittle을 떨어뜨릴 수 있도록 공급 장치 앞에 오른쪽 튜브를 정렬합니다.

그런 다음 저장통이 비워질 때까지 주기를 반복할 수 있습니다.

직접 만들고 싶으신가요???

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

조립.

부품을 다운로드하고 인쇄하면 다음과 같이 표시됩니다.

전면 쉘은 2가지 버전으로 제공됩니다. 실제 차이는 없고 그냥 다르게 보일 뿐입니다.

나머지 부품이 필요합니다.

다음은 조립 과정의 비디오입니다. 슬로우모션 3D프린터로 인트로도 만들어서 아티스트가 되려고 노력했어요!!!

초기 설정.

전원을 켰을 때 기계가 가장 먼저 하는 일은 두 서보를 초기 위치로 이동하는 것입니다. 기계를 처음 시동할 때 Skittles를 수집하는 기어/축이 상단 위치에 있고 튜브 홀더가 공급 장치와 정렬되어 있는지 확인해야 합니다.

문제 해결.

이 분류 기계를 직접 만들기로 결정했다면 몇 가지 일반적인 문제에 직면할 수 있습니다. 해결 방법은 다음과 같습니다.

빨간색 LED 깜박임 - 시작 순서 없음:

초기 위치로 이동한 후 기계는 시작 순서를 거쳐야 합니다. 그렇지 않고 대신 LED가 빨간색으로 깜박이면 RBG 센서를 찾을 수 없는 문제가 있음을 의미합니다. 배선에 문제가 있거나 센서에 결함이 있습니다.

튜브가 제대로 정렬되지 않음:

원인 1

시작 순서 동안 튜브 홀더는 각 색상에 대해 한 번씩 5번 이동합니다. 튜브가 공급 메커니즘과 너무 잘 맞지 않는 것을 알 수 있습니다. 이는 서보가 매우 정밀하지 않거나 인쇄 치수가 약간 다르기 때문일 수 있습니다.

이것은 color_angle 변수 배열을 수정하여 소프트웨어를 통해 수정할 수 있습니다. 이 배열의 각 값은 각 색상의 서보 위치를 나타내며, 이러한 값을 변경하여 각 색상에 대해 튜브가 멈출 위치를 미세 조정할 수 있습니다.

원인 2

인쇄 허용 오차로 인해 튜브 홀더 기어에서 약간의 백래시가 발생할 수도 있습니다. 튜브가 회전하는 방식에 따라 관성이 정지 위치를 초과할 수 있습니다. 이것은 또한 정방향 및 역류 방지 백래시 변수를 수정하여 소프트웨어를 통해 수정할 수 있습니다. 이러한 값은 이 백래시를 보상하기 위해 홀더가 회전하는 방식에 따라 색상 각도 값에 추가되거나 제거됩니다.

색상 혼합:

색상 혼합이 발생하면 color_limit_values ​​배열을 수정해야 합니다. 해당 배열의 각 값은 빨강, 녹색 및 파랑의 최소값과 최대값을 나타냅니다. 값이 무엇인지 더 잘 이해하려면 한 가지 색상만 있는 기기를 로드하고 기기를 컴퓨터에 연결한 다음 직렬 모니터를 엽니다. Skittle이 검사될 때마다 판독된 RGB 값과 프로그램이 생각하는 색상을 가져와야 합니다. 이렇게 하면 각 색상에 어떤 종류의 값을 연결해야 하는지 더 잘 알 수 있습니다.

몇 가지 멋진 기능.

(어쨌든 그런 것 같아요!)

RGB LED:

기계 바닥에 장착된 RGB LED가 있습니다. 분류 과정에서 떨어뜨리는 Skittle의 색상과 일치하도록 색상이 변경됩니다. 저수지가 비면 모든 Skittle 색상을 계속해서 통과합니다.

또한 센서에 문제가 감지되면 시작 시 빨간색으로 깜박입니다.

백래시 방지 보상:

튜브 홀더는 두 개의 평 기어를 사용하여 회전합니다. 인쇄 공차로 인해 기어의 유격을 완전히 없애기가 매우 어렵습니다. 이것은 튜브 홀더가 이상적인 위치를 초과하는 경향이 있음을 의미합니다. 이 코드를 사용하면 홀더가 회전하는 방향에 따라 홀더를 일정량 앞당겨 멈추게 하여 이를 보완할 수 있습니다.

추가 지연:

코드에는 "set_led(ms, color)" 함수가 포함되어 있습니다. "지연(ms)" 기능과 똑같이 작동하지만 지연이 발생하는 동안 LED가 새 색상으로 부드럽게 전환되도록 합니다. 튜브 홀더가 제자리로 돌아가는 동안 LED의 색상을 변경하는 것이 좋습니다!

추가 참고 사항.

참고 1:저는 제 기계를 검은색으로 인쇄했습니다. 이것은 특히 급지 메커니즘에 의해 스키틀즈가 수집되지 않을 때 센서가 읽는 색상 값에 영향을 미칩니다.

참고 2:여러 번 정렬 프로세스를 거친 후 Skittles 색상은 안정적으로 읽기가 더 어려워지는 것 같습니다. 나는 이것이 저수지 내부를 여러 번 문지른 후 광택을 잃거나 손으로 다룰 때 약간 끈적 거리기 때문이라고 가정합니다 (거친 소리!). 색상 값을 보정할 때 '신선한' Skittles를 사용하십시오.

참고 3:식품 취급 시 필요한 모든 예방 조치를 취하십시오. 여기에는 식품 안전 인쇄 필라멘트를 사용하는지 확인하는 것이 포함됩니다.

참고 4:진행 중인 작업과 진행 중인 프로젝트를 Instagram에 게시하려고 합니다. 그것이 당신의 일이라면 여기에서 볼 수 있습니다 :https://www.instagram.com/little_french_kev/


<섹션 클래스="섹션 컨테이너 섹션 축소 가능" id="코드">

코드

<울>
  • LFK_분류기
  • LFK_sorting_machineC/C++
    다음은 분류기의 Arduino 코드입니다.
    #include #include "Adafruit_TCS34725.h#include/* Adafruit TCS34725 브레이크아웃 라이브러리의 예제 코드 기반 */// ========================================================================================Adafruit_TCS34725 tcs =Adafruit_TCS34725(TCS34725_INTEGRATIONTIME_24MS, TCS34725_GAIN_1X); // 설정 RGB sensorint color =0;//0-검정, 1-노랑, 2-녹색, 3-주황, 4-빨강, 5-보라색 previous_colour =color;int black_count =0; // 비어 있는/알 수 없는 색상의 개수int start_measurment_angle =88; // sensorint measurment_sweep =2 앞에 스키틀을 정렬하기 위한 서보 위치; // 취한 측정 횟수 . 평균 오류에 사용int measurment_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, }; {850, 2200, 800, 2200, 400, 1100};uint16_t green_limit_values[] ={400, 800, 700, 1400, 300, 1400, 300, 700};uint16_t 오렌지_limit_values[] ={ };uint16_t red_limit_values[] ={400, 950, 150, 450, 150, 400};uint16_t purple_limit_values[] ={150, 400, 150, 450, 150, ======;/// ===============RGB led 관련 변수==========================byte R_pin =5; 바이트 G_pin =6, 바이트 B_pin =11, int current_red_value =255, int current_green_value =255, int current_blue_value =255, const int 오렌지[] ={0, 230, 255}, const int red[] ={0, 255, 255};const int 녹색[] ={255, 0, 255};const int 노란색[] ={0, 170, 255};const int 보라색[] ={0, 255, 40};//========================피더 서보 관련 변수 =========================int release_delay =220;const int color_angles[] ={10, 46, 82, 118, 154};//{10, 46, 82, 118, 154};//int holder_offset =0; // 튜브 홀더의 오프셋 조정 . 0과 36 사이에 유지될 수 있습니다. const int backward_anti_backlash =2;const int forward_anti_backlash =2;Servo feeder_servo; //피더 선언 서보서보 holder_servo; //튜브 홀더 서보 선언//============================================================================================================================================================================================================================================================================Serial.begin(9600); 핀모드(R_핀, 출력); // LED 핀 설정 pinMode(G_pin, OUTPUT); 핀모드(B_핀, 출력); analogWrite(R_pin, 255); //LED 끄기 analogWrite(G_pin, 255); analogWrite(B_pin, 255); feeder_servo.attach(3); //피더 서보를 핀 3에 연결합니다. holder_servo.attach(2); //2번 핀에 홀더 서보를 연결합니다. feeder_servo.write(0); holder_servo.write(color_angles[0]); 정수 흰색[] ={0, 0, 0}; //로컬 흰색 값 변수 int black[] ={255, 255, 255}; //로컬 블랙 값 변수 set_led(1000, white); // LED 켜기(흰색) if (tcs.begin()) { //센서가 있는지 확인 Serial.println("Found sensor"); 시작_시퀀스(); } else { Serial.println("TCS34725를 찾을 수 없습니다... 연결을 확인하세요"); while (1) //센서가 없으면 빨간색으로 빠르게 깜박임 { set_led(300, red); set_led(300, 검정); } }}//====================================루프 ============================================무효 루프(무효) { if (black_count <10) { feeder_servo.write(0 ); // 스키틀 수집을 위해 서보 위치를 맨 위로 설정합니다. delay(450); // 피더가 제 위치에 오기에 충분한 시간을 서보도록 지연시킵니다. previous_colour =color; get_color(); // 스키틀 색상 읽기 if (color ==0) { black_count ++; //색상이 발견되지 않으면 검은색 카운트를 증가시킵니다.shake();//주걱턱이 없더라도 저수지를 조금 더 흔듭니다. } else if (color ==6) { black_count ++; // 색상을 알 수 없는 경우 블랙 카운트 증가 - 스키틀 릴리스 없음 } else { //색상이 발견되면 move_holder(); // 튜브 홀더를 이동합니다. release_skittle(); // 스키틀 해제 black_count =0; } } else { end_loop(1000); }}//=====================================================================================================================무효 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(start_measurment_angle); //측정 시작으로 이동합니다. angle delay(200); Serial.println("----------------"); for (int i =0; i <=measurment_sweep; i++) // 각 측정값에 대한 루프 { tcs.getRawData(&r, &g, &b, &c); // 색상 데이터 가져오기 feeder_servo.write(start_measurment_angle + i * measurment_angle_increment); //다음 측정을 위한 서보 각도 증가 total_r +=r; //전체 red 값에 red 값 추가 total_g +=g; // 총 녹색 값에 녹색 값 추가 total_b +=b; // 총 파란색 값에 파란색 값 추가 delay(15); } total_r /=측정_스윕; //모든 측정값의 평균값 total_g /=measurment_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; holder_servo.write(anti_backlash_angle); //지연(holder_delay); } else { int anti_backlash_angle =new_holder_position + forward_anti_backlash; //holder_servo.write(anti_backlash_angle); holder_servo.write(new_holder_position); // 홀더를 위치로 이동 //delay(holder_delay); } if (색상 ==1) { set_led(holder_delay, 노란색); } else if (색상 ==2) { set_led(holder_delay, 녹색); } else if (색상 ==3) { set_led(holder_delay, 주황색); } else if (색상 ==4) { set_led(holder_delay, red); } else if (색상 ==5) { set_led(holder_delay, 보라색); } else {}}//==========================================================================================================================================release_skittle() { feeder_servo.write(180); // skittle release delay(release_delay);}//===================================================================================================================쉐이크 ===================================무효 쉐이크() { int shake_delay =80; int 흔들림 양 =5; intshake_min_value =90; int shake_max_value =180; feeder_servo.write(180); // skittle release delay(release_delay)를 위해 서보 위치를 맨 아래로 설정합니다. feeder_servo.write(120); // 스키틀 해제 지연(80)을 위해 서보 위치를 맨 아래로 설정; for (int i =0; i <=shake_amount; i++) //각 측정값에 대한 루프 { feeder_servo.write(shake_min_value); // 스키틀 릴리스를 위해 서보 위치를 맨 아래로 설정합니다. delay(shake_delay); feeder_servo.write(shake_max_value); // 스키틀 릴리스를 위해 서보 위치를 맨 아래로 설정합니다. delay(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); 이전_색상 =색상; 색상 =3; move_holder(); end_loop(200);}//================================================================================================================무효 end_loop(int duration) { set_led(duration, 주황색); set_led(지속 시간, 빨간색); set_led(지속 시간, 녹색); set_led(지속 시간, 노란색); set_led(duration, 보라색);}//==========================================================================================================================================================================================================// 이것은 delay() 역할을 하지만 대기하는 동안 LED가 색상을 변경할 수 있도록 합니다. .void set_led(int duration, int color[3]) { int start_time =밀리(); // 시작 시간 값 int current_time =start_time; // 현재 시간 값 int current_duration =0; // 총 지속시간 while (current_duration   

    회로도

    배선은 매우 간단합니다. 아무 것도 연결하기 전에 벅 컨버터 출력이 5V인지 확인하십시오 !!!!!

    제조공정

    1. EEG 기계
    2. 자판기
    3. 재봉틀
    4. 텔레비전
    5. 스핀들 베어링 및 베어링 품질
    6. 선반 기계의 부품
    7. 선반 기계의 이해
    8. 밀링 머신의 구성 요소
    9. 기계의 이해
    10. JW머신