Desarrollé un sistema automatizado de dispensado controlado por Arduino Nano modificado, capaz de entregar cantidades exactas de producto (desde 100g hasta 1000g) con precisión milimétrica. El proyecto integra:
- Electrónica avanzada: Fuente regulada a 5V, sensor HX711 para pesaje de alta precisión, entradas protegidas con optoacopladores y salidas configurables para motores.
- Diseño mecánico profesional: Estructura 3D en SolidWorks con piezas combinadas (corte láser + impresión 3D) y sistema de vibración controlada.
- PCB personalizada: Versión optimizada del ATMega328P (como Arduino pero más eficiente) con opción para motor paso a paso (driver A4988).
DATOS TÉCNICOS

- Tensión de alimentación……………………….…………12VDC
- Corriente de alimentación………………….……………120mA
- Entadas digitales 12VDC…………………………….……4
- Entrada para sensor de Peso………………………………1
- Salidas TRANSISTORES…………………………4
-
- Tensión DC………………………………………………12V
- Corriente DC……………………………………………1A
-
- Salida para motor paso a paso……………………………….1
- Entorno de programación………………………..………..Arduino IDE
- Condiciones ambientales min……………………….….-40°
- Condiciones ambientales max…………………..……….80°
- Dimensiones……………………………………………………….125x75mm
- Empotrable………………………………….……………………Sí
- Programación directa (PC-Tarjeta electrónica)…………Sí
LISTA DE MATERIALES

Quantity | Comment | Designator | Footprint | Value | Manufacturer Part | Manufacturer | Supplier Part |
18 | 100nF | C1,C2,C3,C4,C5,C6,C7,C8,C10, C11,C12,C15,C18,C19,C20,C22, C23,C26 |
C0603 | 100nF | CC0603KRX7R9BB104 | YAGEO(国巨) | C14663 |
1 | 10uF | C9 | CAP-SMD_L3.2-W1.6-RD-C7171 | 10uF | TAJA106K016RNJ | Kyocera AVX | C7171 |
3 | 10uF | C13,C14,C16 | C0805 | 10uF | CL21A106KAYNNNE | SAMSUNG(三星) | C15850 |
3 | 470uF | C17,C21,C28 | CAP-SMD_BD10.0-L10.3-W10.3-LS11.3-FD | 470uF | VT1V471M1010 | ROQANG(容强) | C310845 |
1 | 4.7uF | C24 | C1206 | 4.7uF | 1206B475K500NT | FH(风华) | C29823 |
3 | 220nF | C25,C27,C31 | C0603 | 220nF | CL10B224KA8NNNC | SAMSUNG(三星) | C21120 |
1 | 1uF | C29 | C1206 | 1uF | CL31B105KBHNNNE | SAMSUNG(三星) | C1848 |
1 | 220uF | C30 | CAP-SMD_BD6.3-L6.6-W6.6-LS7.2-R-RD | 220uF | RVE1C221M0607 | ROQANG(容强) | C99836 |
1 | WAFER-XH2.54-6PZZ | CN1 | CONN-TH_XH2.54-6P | WAFER-XH2.54-6PZZ | XUNPU(讯普) | C5359634 | |
2 | XH-4AW | CN2,CN3 | CONN-TH_XH2.54-4AW | XH-4AW | BOOMELE(博穆精密) | C21273 | |
7 | SS210 | D1,D2,D3,D4,D6,D7,D8 | SMA_L4.3-W2.6-LS5.2-RD | SS210 | MDD | C14996 | |
1 | SK86C | D5 | SMC_L7.1-W6.2-LS8.1-R-RD | SK86C | MDD | C64338 | |
1 | BSMD1206-100-24V | F1 | F1206 | BSMD1206-100-24V | BHFUSE(佰宏) | C910830 | |
1 | 68uH | L1 | IND-SMD_L7.1-W6.6-1 | 68uH | PSPMAA0605H-680M-IGF | PROD(谱罗德) | C2983094 |
1 | LCD-16X2 | LCD1 | LCD-16X2 | ||||
8 | KT-0805G | LED1,LED2,LED3,LED4, LED5,LED6,LED7,LED8 |
LED0805-R-RD | KT-0805G | KENTO | C2297 | |
5 | WJ128V-5.0-2P | P1,P3,P4,P5,P6 | CONN-TH_2P-P5.00_WJ128V-5.0-2P | WJ128V-5.0-2P | KANGNEX(康奈克斯电气) | C8269 | |
1 | WJ128V-5.0-3P | P2 | CONN-TH_3P-P5.00_WJ128V-5.0-3P | WJ128V-5.0-3P | KANGNEX(康奈克斯电气) | C8270 | |
6 | D882 Y档160~320 | Q1,Q2,Q4,Q5,Q6,Q7 | SOT-89-3_L4.5-W2.5-P1.50-LS4.2-BR | D882 Y档160~320 | CJ(江苏长电/长晶) | C9634 | |
1 | S8550 | Q3 | SOT-23-3_L2.9-W1.6-P1.90-LS2.8-BR | S8550 | CJ(江苏长电/长晶) | C105432 | |
13 | 1kΩ | R1,R2,R10,R14,R16,R19, R28,R32,R35,R37,R42, R45,R48 |
R0603 | 1kΩ | 0603WAF1001T5E | UNI-ROYAL(厚声) | C21190 |
18 | 10kΩ | R3,R4,R5,R7,R11,R17,R18, R20,R21,R22,R23,R25,R30, R33,R34,R38,R43,R44 |
R0603 | 10kΩ | 0603WAF1002T5E | UNI-ROYAL(厚声) | C25804 |
2 | 10kΩ | R6,R47 | RES-ADJ-SMD_3P-L3.0-W3.8-P1.75-BR | 10kΩ | TC33X-2-103E | BOURNS | C719176 |
1 | 1MΩ | R8 | R0603 | 1MΩ | 0603WAF1004T5E | UNI-ROYAL(厚声) | C22935 |
4 | 2.2kΩ | R9,R13,R24,R36 | R0805 | 2.2kΩ | 0805W8F2201T5E | UNI-ROYAL(厚声) | C17520 |
3 | 330Ω | R12,R29,R40 | R0805 | 330Ω | 0805W8F3300T5E | UNI-ROYAL(厚声) | C17630 |
3 | 4.7kΩ | R15,R31,R41 | R0805 | 4.7kΩ | 0805W8F4701T5E | UNI-ROYAL(厚声) | C17673 |
2 | 100Ω | R26,R27 | R0805 | 100Ω | 0805W8F1000T5E | UNI-ROYAL(厚声) | C17408 |
2 | 100kΩ | R39,R49 | R0603 | 100kΩ | 0603WAF1003T5E | UNI-ROYAL(厚声) | C25803 |
1 | 30kΩ | R46 | R0603 | 30kΩ | 0603WAF3002T5E | UNI-ROYAL(厚声) | C22984 |
1 | 0Ω | R50 | R0603 | 0Ω | 0603WAF0000T5E | UNI-ROYAL(厚声) | C21189 |
2 | 100mΩ | R51,R52 | R1206 | 100mΩ | 1206W4F100LT5E | UNI-ROYAL(厚声) | C25334 |
1 | EC11E18244AU | SW1 | SW-TH_EC11XXXXXXXX | EC11E18244AU | ALPSALPINE(阿尔卑斯阿尔派) | C202365 | |
1 | TS-1187A-B-A-B | SW2 | SW-SMD_4P-L5.1-W5.1-P3.70-LS6.5-TL-2 | TS-1187A-B-A-B | XKB Connectivity(中国星坤) | C318884 | |
9 | Test-Point | TP1,TP2,TP3,TP4,TP5, TP6,TP7,TP8,TP9 |
test-point-0.5mm | ||||
1 | ATMEGA328P-AU | U1 | TQFP-32_L7.0-W7.0-P0.80-LS9.0-BL | ATMEGA328P-AU | MICROCHIP(美国微芯) | C14877 | |
1 | CH340C | U2 | SOP-16_L10.0-W3.9-P1.27-LS6.0-BL | CH340C | WCH(南京沁恒) | C84681 | |
1 | PCF8574T/TR | U3 | SO-16_L10.3-W7.5-P1.27-LS10.3-BL | PCF8574T/TR | HGSEMI(华冠) | C2987288 | |
7 | EL357N(C)(TA)-G | U4,U5,U6,U8, U9,U10,U11 |
OPTO-SMD-4_L4.4-W4.1-P2.54-LS7.0-TL | EL357N(C)(TA)-G | EVERLIGHT(亿光) | C29981 | |
1 | HX711 | U7 | SOP-16_L10.0-W3.9-P1.27-LS6.0-BL | HX711 | AVIA(海芯科技) | C43656 | |
1 | A4988SETTR-T | U12 | WQFN-28_L5.0-W5.0-P0.50-BL-EP3.2 | A4988SETTR-T | ALLEGRO(美国埃戈罗) | C38437 | |
1 | XL1509-5.0E1 | U13 | SOIC-8_L5.0-W4.0-P1.27-LS6.0-BL | XL1509-5.0E1 | XLSEMI(芯龙) | C61063 | |
1 | USB-TYPE-C-018 | USB1 | USB-C_SMD-TYPE-C-31-M-12 | USB-TYPE-C-018 | DEALON(德艺隆) | C2927038 | |
1 | 16MHz | X1 | OSC-SMD_3P-L3.2-W1.3-P0.95-L | 16MHz | CSTCE16M0V53-R0 | muRata(村田) | C32180 |
DISEÑO DE LA ESTRUCTURA EN 3D SOLIDWORKS

CODIGO ARDUINO

//Incluye las librerías #include "HX711.h" //#include <Wire.h> #include <LiquidCrystal_I2C.h> #include <EEPROM.h> LiquidCrystal_I2C lcd(0x20, 16, 2); HX711 balanza; const int zero = 2; const int add = 14; const int ok = 3; int last_add = 0; int last_less = 0; int last_ok = 0; unsigned int umbral = 100; bool act = false; #define MOTOR 6 int DT = 5; int CLK = 4; int peso_calibracion = 193; // Es el peso referencial a poner, en mi caso mi celular pesa 185g (SAMSUMG A20) long escala; int state_zero = 0; int last_state_zero = 0; //Función calibración void calibration() { // despues de hacer la calibracion puedes borrar toda la funcion "void calibration()" boolean conf = true; long adc_lecture; // restamos el peso de la base de la balaza lcd.setCursor(0, 0); lcd.print("Calibrando base"); lcd.setCursor(4, 1); lcd.print("Balanza"); delay(3000); balanza.read(); balanza.set_scale(); //La escala por defecto es 1 balanza.tare(20); //El peso actual es considerado zero. lcd.clear(); //Iniciando calibración while (conf == true) { lcd.setCursor(1, 0); lcd.print("Peso referencial:"); lcd.setCursor(1, 1); lcd.print(peso_calibracion); lcd.print(" g "); delay(3000); lcd.clear(); lcd.setCursor(1, 0); lcd.print("Ponga el Peso"); lcd.setCursor(1, 1); lcd.print("Referencial"); delay(3000); //Lee el valor del HX711 adc_lecture = balanza.get_value(100); //Calcula la escala con el valor leido dividiendo el peso conocido escala = adc_lecture / peso_calibracion; //Guarda la escala en la EEPROM EEPROM.put(0, escala); delay(100); lcd.setCursor(1, 0); lcd.print("Retire el Peso"); lcd.setCursor(1, 1); lcd.print("referencial"); delay(3000); lcd.clear(); lcd.setCursor(1, 0); lcd.print("READY!!...."); delay(3000); lcd.clear(); conf = false; //para salir de while lcd.clear(); } } void setup() { balanza.begin(DT, CLK); //asigana los pines para el recibir el trama del pulsos que viene del modulo pinMode(zero, INPUT); //declaramos el pin2 como entrada del pulsador pinMode(add, INPUT); pinMode(ok, INPUT); pinMode(MOTOR, OUTPUT); digitalWrite(MOTOR, 0); lcd.init(); // Inicializamos el lcd lcd.backlight(); // encendemos la luz de fondo del lcd EEPROM.get(0, escala); if (umbral == 65535 || umbral > 1000) { // 10000 es un límite razonable para tu aplicación umbral = 100; EEPROM.get(6, umbral); // Guarda 0 en la EEPROM } if (digitalRead(zero) == 1) { //esta accion solo sirve la primera vez para calibrar la balanza, es decir se presionar ni bien se enciende el sistema calibration(); } balanza.set_scale(escala); // Establecemos la escala balanza.tare(20); //El peso actual de la base es considerado zero. } void loop() { //EEPROM.get(3, umbral); int state_zero = digitalRead(zero); float peso; peso = balanza.get_units(10); //Mide el peso de la balanza //Muestra el peso lcd.setCursor(1, 0); lcd.print("Peso: "); lcd.print(peso, 0); lcd.println(" g "); delay(5); lcd.setCursor(1, 1); lcd.print("Umbral : "); lcd.print(umbral); //Botón de zero, esto sirve para restar el peso de un recipiente if (state_zero != last_state_zero) { if (state_zero == LOW) { balanza.tare(10); //El peso actual es considerado zero. } } last_state_zero = state_zero; if (digitalRead(add) != last_add) { if (digitalRead(add) == LOW) { umbral += 100; if (umbral >= 1000) { umbral = 100; } EEPROM.put(6, umbral); lcd.setCursor(1, 1); lcd.print("Umbral : "); lcd.print(umbral); lcd.println(" g "); } } last_add = digitalRead(add); if (digitalRead(ok) != last_ok) { if (digitalRead(ok) == LOW) { act = true; } } last_ok = digitalRead(ok); if (act == true) { digitalWrite(MOTOR, 1); } if (peso >= (umbral - 6)) { digitalWrite(MOTOR, 0); act = false; } }