

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;
}
}