Manufactura industrial
Internet industrial de las cosas | Materiales industriales | Mantenimiento y reparación de equipos | Programación industrial |
home  MfgRobots >> Manufactura industrial >  >> Manufacturing Technology >> Proceso de manufactura

Clasificadora por color

Componentes y suministros

Arduino Nano R3
× 1
Sensor TCS 34725 RGB
× 1
Convertidor de dólar LM2596
× 1
Servos MG-90S
× 2
Rodamiento de bolas MR105ZZ (5 x 10 x 4 mm)
× 3
Rodamiento de bolas 608RS o 608ZZ (8 x 22 x 7 mm)
× 1
Rodamiento de bolas 6003RS (17x35x10mm)
× 1
Tornillo avellanado M3 * 15 mm
× 1
Tornillos autorroscantes M2x10
× 20
LED RGB (ánodo común (+))
× 1
resistencias de 220 ohmios
× 3
cables
× 1
conector jack de 2,1x5,5 mm
× 1
tubo termorretráctil
× 1
conectores dupont
× 1
Fuente de alimentación de 9V o 12v (1 amperio mínimo)
× 1
5 tubos de ensayo de 22 mm (OD) x100 mm (de Danmu Art)
× 1
Skittles !!!!!!!!!!
× 1

Herramientas y máquinas necesarias

Impresora 3D
destornillador
pelacables
pinzas
soldador
multímetro
herramienta de engarzado

Acerca de este proyecto


INTRO.

La historia divertida es que este proyecto nunca estuvo destinado a ser.

Hace unos 3,5 años comencé a diseñar una máquina clasificadora de colores mucho más original y, como muchos de mis proyectos, terminó a medio terminar acumulando polvo en el alféizar de la ventana (estoy seguro de que nadie más puede identificarse con esto jaja).

En pocas palabras, hace unos meses decidí retomar este viejo proyecto. Lo primero que necesitaba resolver era cómo recolectar bolos de un depósito y verificar su color de manera bastante confiable mientras mantenía el sistema lo más compacto posible (lo que no logré la primera vez). Me las arreglé para convencerme de que diseñara una máquina clasificadora de colores más simple solo para obtener el diseño correcto del sistema de recolección. Pensé tontamente que sería un trabajo de 2 fines de semana, agradable, fácil y rápido ... ¡¡¡Oh, cielos !!! estaba equivocado ...

Tomé 2 diseños completamente diferentes y muchos prototipos modificados para obtener algo que funcionara de manera aceptable (todavía tengo algunos problemas de respuesta de vez en cuando).

Aunque no es perfecto, estoy bastante satisfecho con el resultado.

CÓMO FUNCIONA.

La máquina se puede dividir en 2 etapas principales.

En la parte superior se encuentra el depósito de los Skittles sin clasificar. En el fondo de este reservorio se encuentra el mecanismo de alimentación encargado de recolectar los Skittles y colocarlos frente al sensor de color donde se verificará su color.

El mecanismo de alimentación incluye un brazo que sacude el contenido del depósito para asegurarse de que los Skittles fluyan bien a través del orificio del mecanismo de alimentación sin atascarse dentro del depósito (desafortunadamente, todavía sucede en algún momento).

Una vez que se ha encontrado el color del Skittle, entra en acción la segunda etapa de la máquina. El soporte de los tubos de ensayo alinea el tubo derecho frente al mecanismo de alimentación para que se deje caer el Skittle.

Luego, el ciclo se puede repetir hasta que el depósito esté vacío.

¿QUIERES HACER TU PROPIO ???

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

MONTAJE.

Una vez que haya descargado e impreso las partes, debería terminar con algo como esto:

Tenga en cuenta que la carcasa frontal viene en 2 versiones. No hay diferencia real, simplemente se ven diferentes.

El resto de las piezas necesarias.

Aquí hay un video del proceso de montaje. ¡Incluso intenté ser un artista haciendo una introducción con tomas de impresora 3D en cámara lenta!

CONFIGURACIÓN INICIAL.

Lo primero que hace la máquina cuando se enciende es mover ambos servos a su posición inicial. Cuando encienda la máquina por primera vez, debe asegurarse de que el engranaje / eje que recolecta los bolos esté en su posición superior y que el soporte del tubo esté alineado con el mecanismo de alimentación.

SOLUCIÓN DE PROBLEMAS.

Si decide hacer usted mismo esta máquina clasificadora, es posible que se encuentre con algunos problemas comunes. así es como puede resolverlos.

LED rojo intermitente, sin secuencia de inicio:

Después de moverse a su posición inicial, la máquina debe seguir su secuencia de arranque. Si no es así y, en cambio, el LED parpadea en rojo, significa que tiene algunos problemas con el sensor RBG que no se encuentra. Hay un problema con el cableado o el sensor está defectuoso.

Los tubos no se alinean correctamente:

Causa 1

Durante la secuencia de inicio, el soporte de tubos se moverá 5 veces, una para cada color. Puede notar que los tubos no se alinean demasiado bien con el mecanismo de alimentación. Esto podría deberse a que los servos no son muy precisos o a algunas variaciones en las dimensiones de impresión.

Esto se puede corregir mediante software modificando la matriz de variables colour_angle. Cada valor de esta matriz representa la posición del servo para cada color; al cambiar esos valores, puede ajustar con precisión dónde se detendrá el tubo para cada color.

Causa 2

Debido a las tolerancias de impresión, es posible que también se produzca cierta reacción en los engranajes del soporte de los tubos. Dependiendo de la forma en que giran los tubos, su inercia puede hacer que sobrepasen su posición de parada. Esto también se puede corregir a través del software modificando la variable anti retroceso de retrolavado. Estos valores se agregarán o eliminarán de los valores del ángulo de color según la dirección en la que el soporte esté girando para compensar este retroceso.

Mezcla de colores:

Si experimenta alguna mezcla de colores, tendrá que modificar las matrices colour_limit_values. Cada valor de esa matriz representa los valores mínimo y máximo para rojo, verde y azul. Para tener una mejor idea de cuáles deberían ser los valores, cargue la máquina con un solo color, conecte la máquina a su computadora y abra el monitor serial. Cada vez que se comprueba un Skittle, debe obtener sus valores RGB leídos y el color que el programa cree que es. Esto debería darle una mejor idea de qué tipo de valores deben asociarse con cada color.

ALGUNAS CARACTERÍSTICAS GENIALES.

(bueno, creo que lo son de todos modos)

El LED RGB:

Hay un LED RGB instalado en la base de la máquina. Durante el proceso de clasificación, cambia de color para que coincida con el color del Skittle que se deja caer. Pasa por todos los colores de Skittle continuamente una vez que el depósito está vacío.

También brillará en rojo al iniciarse si se detecta un problema con el sensor.

Compensación anti-juego:

El soporte de los tubos se hace girar con un par de engranajes rectos. Debido a la tolerancia de impresión, es muy difícil deshacerse por completo de cualquier juego en los engranajes. Esto significa que el soporte del tubo tiende a sobrepasar su posición ideal. El código permite compensar esto deteniendo el soporte antes en una cierta cantidad dependiendo de la dirección en la que esté girando.

Retraso con extra:

El código incluye una función "set_led (ms, color)". Actúa exactamente como la función de "retardo (ms)" pero permite que el LED cambie suavemente a su nuevo color mientras ocurre el retardo. ¡Es un placer cambiar los colores del LED mientras el soporte del tubo gira a su posición!

NOTAS ADICIONALES.

Nota 1:Imprimí mi máquina en negro, esto tendrá un impacto en los valores de color que leerá el sensor, especialmente cuando el mecanismo de alimentación no recoja ningún Skittles.

Nota 2:Después de pasar por el proceso de clasificación varias veces, los colores de Skittles parecen volverse más difíciles de leer de manera confiable. Supongo que esto se debe a que pierden su brillo después de frotar el interior del depósito muchas veces o que se vuelven un poco más pegajosos cuando se manipulan con la mano (¡suena asqueroso!). Al calibrar los valores de color, intente utilizar Skittles "nuevos".

Nota 3:asegúrese de tomar todas las precauciones necesarias al manipular alimentos. Esto incluye asegurarse de utilizar filamento de impresión apto para alimentos.

Nota 4:Intento publicar algún trabajo en progreso y qué proyecto estoy haciendo en Instagram. Si es lo tuyo puedes echarle un vistazo aquí:https://www.instagram.com/little_french_kev/


Código

  • LFK_sorting_machine
LFK_sorting_machine C / C ++
Aquí está el código Arduino para la máquina clasificadora.
 #include  #include "Adafruit_TCS34725.h" #include  / * Basado en código de ejemplo para la biblioteca de ruptura Adafruit TCS34725 * /// =======================Variables relacionadas con el sensor RGB =========================Adafruit_TCS34725 tcs =Adafruit_TCS34725 (TCS34725_INTEGRATIONTIME_24MS, TCS34725_GAIN_1X); // configuración RGB sensorint color =0; // 0-negro, 1-amarillo, 2-verde, 3-naranja, 4-rojo, 5-violetaint color_anterior =color; int black_count =0; // recuento de color vacío / desconocido start_measurment_angle =88; // posición del servo para alinear el bolo frente al sensorint Measurment_sweep =2; // número de medida tomada. se utiliza para promediar errorint midiendo_angle_increment =4; // incremento de ángulo entre medidas // valores límite [] ={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}; uint =16_values ​​yellow {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}; // =======================Variables relacionadas con el led RGB =========================byte 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 verde [] ={255, 0, 255}; const int amarillo [] ={0, 170, 255}; const int violeta [] ={0, 255, 40}; // =======================Variables relacionadas con los servos del alimentador =========================int release_delay =220; const int colour_angles [] ={10, 46, 82, 118, 154}; // {10, 46, 82, 118, 154}; // int holder_offset =0; // ajuste de compensación para soporte de tubos. debe mantenerse entre 0 y 36const int backward_anti_backlash =2; const int forward_anti_backlash =2; Servo feeder_servo; // declarar alimentador servoServo holder_servo; // declarar servo de soporte de tubos // =================================SETUP =========================================Void setup (void) {Serial.begin (9600); pinMode (R_pin, SALIDA); // establece el pin de LED pinMode (G_pin, OUTPUT); pinMode (B_pin, SALIDA); analogWrite (R_pin, 255); // apaga el LED analogWrite (G_pin, 255); analogWrite (B_pin, 255); feeder_servo.attach (3); // adjuntar el servo del alimentador al pin 3 holder_servo.attach (2); // adjuntar el servo del soporte al pin 2 feeder_servo.write (0); holder_servo.write (colour_angles [0]); int blanco [] ={0, 0, 0}; // valores locales de blanco variable int black [] ={255, 255, 255}; // variable local de valores negros set_led (1000, blanco); // enciende el LED (blanco) if (tcs.begin ()) {// comprueba si el sensor encontró Serial.println ("Sensor encontrado"); secuencia_inicial (); } else {Serial.println ("No se encontró TCS34725 ... verifique sus conexiones"); while (1) // parpadeo rápido en rojo si no se encuentra el sensor {set_led (300, red); set_led (300, negro); }}} // ===================================LOOP =========================================bucle void (void) {if (black_count <10) {feeder_servo.write (0 ); // establece la posición del servo en la parte superior para el retraso de recogida de bolos (450); // demora para dejar que el servo del alimentador tenga suficiente tiempo para ponerse en posición previous_colour =color; get_colour (); // lee el color del bolo if (color ==0) {black_count ++; // si no se encuentra color, incrementa el conteo de negros shake (); // agita un poco más el depósito incluso si no hay bolos} else if (color ==6) {black_count ++; // si se desconoce el color, incrementar el recuento de negros - no se suelta el bolo} else {// si se encuentra el color move_holder (); // mover el soporte del tubo release_skittle (); // suelta el bolo black_count =0; }} más {end_loop (1000); }} // ===================================OBTENER COLOR =========================================void get_colour () {uint16_t r, g, b, c; //, colorTemp , lux; uint16_t total_r =0; uint16_t total_g =0; uint16_t total_b =0; feeder_servo.write (start_measurment_angle); // mover para iniciar el retardo del ángulo de medición (200); Serial.println ("----------------"); for (int i =0; i <=barrido_medición; i ++) // bucle para cada medida {tcs.getRawData (&r, &g, &b, &c); // obtener datos de color feeder_servo.write (start_measurment_angle + i * Measurment_angle_increment); // incrementa el ángulo del servo para la siguiente medida total_r + =r; // agregar valor rojo al valor rojo total total_g + =g; // agregar valor verde al valor verde total total_b + =b; // añadir valor azul al valor total de azul delay (15); } total_r / =barrido_medición; // valores promedio de todas las mediciones total_g / =Measurment_sweep; total_b / =barrido_medición; Serial.print (total_r); Serial.print (""); Serial.print (total_g); Serial.print (""); Serial.print (total_b); Serial.print (""); Serial.println (""); // compara valores para determinar el color. if ((total_r  =yellow_limit_values ​​[0]) &&// verifica el amarillo (total_r  =yellow_limit_values ​​[2]) &&(total_g  =yellow_limit_values ​​[4]) &&(total_b  =green_limit_values ​​[0]) &&// comprobar si hay verde (total_r  =green_limit_values ​​[2]) &&(total_g  =green_limit_values ​​[4]) &&(total_b  =orange_limit_values ​​[0]) &&// comprobar si hay naranja (total_r  =orange_limit_values ​​[2]) &&(total_g  =valores_limit_naranja [4]) &&(total_b  =red_limit_values ​​[0]) &&// comprobar si hay rojo (total_r  =red_limit_values ​​[2]) &&(total_g  =red_limit_values ​​[4]) &&(total_b  =purple_limit_values ​​[0]) &&// comprobar si hay púrpura (total_r  =purple_limit_values ​​[2]) &&(total_g  =valores_límite_púrpura [4]) &&(total_b  color) {// obliga al servo del soporte a retroceder más allá de la posición normal para compensar el juego de engranajes int anti_backlash_angle =new_holder_position - backward_anti_backlash; holder_servo.write (anti_backlash_angle); // retraso (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); // mover el titular a la posición // retardo (titular_delay); } if (color ==1) {set_led (holder_delay, amarillo); } else if (color ==2) {set_led (holder_delay, green); } else if (color ==3) {set_led (holder_delay, orange); } else if (color ==4) {set_led (holder_delay, red); } else if (color ==5) {set_led (holder_delay, violeta); } más {}} // =============================LANZAR BOLO ===========================void release_skittle () {feeder_servo.write (180); // establecer la posición del servo en la parte inferior para el retraso de liberación del bolo (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); // establece la posición del servo en la parte inferior para el retardo de liberación del bolo (release_delay); feeder_servo.write (120); // establece la posición del servo en la parte inferior para el retardo de liberación del bolo (80); for (int i =0; i <=shake_amount; i ++) // bucle para cada medida {feeder_servo.write (shake_min_value); // establece la posición del servo en la parte inferior para el retardo de liberación del bolo (shake_delay); feeder_servo.write (shake_max_value); // establece la posición del servo en la parte inferior para el retardo de liberación del bolo (shake_delay); }} // ============================SECUENCIA DE INICIO ============================void initial_sequence () {color =1; move_holder (); set_led (300, amarillo); retraso (400); color =2; move_holder (); set_led (300, verde); retraso (400); color =3; move_holder (); set_led (300, naranja); retraso (400); color =4; move_holder (); set_led (300, rojo); retraso (400); color =5; move_holder (); set_led (300, violeta); retraso (400); color_anterior =color; color =3; move_holder (); end_loop (200);} // ==============================END LOOP =================================void end_loop (int duración) {set_led (duración, naranja); set_led (duración, rojo); set_led (duración, verde); set_led (duración, amarillo); set_led (duración, violeta);} // ============================ESTABLECER COLOR LED RGB =======================// Esto actúa como un delay () pero permite que el LED cambie de color mientras espera .void set_led (int duration, int color [3]) {int start_time =millis (); // valor de la hora de inicio int current_time =start_time; // valor de tiempo actual int current_duration =0; // duración total while (current_duration   

Esquemas

El cableado es bastante sencillo. ¡Solo asegúrate de que tu convertidor buck emite 5 V antes de enchufarlo!

Proceso de manufactura

  1. Máquina de EEG
  2. Máquina expendedora
  3. Máquina de votación
  4. Máquina de coser
  5. Televisión
  6. Cojinetes de husillo y calidad de los cojinetes
  7. Partes de la máquina de torno
  8. Comprender la máquina de torno
  9. Componente de la fresadora
  10. Comprensión de la máquina
  11. Máquina JW