กลับไปหน้ารวมไฟล์
automated-powder-dispenser-16d7c7.md

Industrial Dosing: เครื่องจ่ายผงอัตโนมัติ

  • ว่าไงทุกคน! โปรเจคนี้เราเริ่มจากปัญหาจริงในแล็บนี่แหละ การตวงผงให้ได้ปริมาณเป๊ะๆ บางทีก็ปวดหัวใช่มั้ยล่ะ? แต่พอมีเจ้านี่แล้ว... จบเรื่อง!
  • เราใช้ Load Cell มาชั่งน้ำหนัก จอแสดงผลไว้ดูน้ำหนักกับค่าที่ตั้ง ใช้ปุ่มกดกับโพเทนชิโอมิเตอร์ตั้งค่า และสุดท้ายมอเตอร์เซอร์โวคอยจ่ายผง เรียบร้อย!

The Load Cell Feedback Loop (HX711)

หลังจากยึด Load Cell เข้ากับฐานแล้ว เราใช้โค้ดจาก Hrisko, J มาปรับเทียบ Load Cell กัน

ระบบมันไม่สามารถพึ่งเวลาแบบ "เปิดสกรู 3 วินาที" เฉยๆ ได้หรอกนะ น้อง เพราะความชื้นหรือการจับตัวของผงทำให้อัตราการไหลไม่คงที่ ระบบต้องชั่งน้ำหนักแบบเรียลไทม์ไปด้วยเลย

  1. ถ้วยรับผงของเราวางอยู่บนแท่งอลูมิเนียมที่เรียกว่า Load Cell (Strain Gauge).
  2. พอผงตกลงมาในถ้วย แท่งอลูมิเนียมจะโก่งตัวนิดหน่อย (เล็กมากๆ)
  3. การโก่งตัวนิดเดียวเนี่ย ทำให้เกิดการเปลี่ยนแปลงแรงดันไฟฟ้าเล็กจิ๋ว (ระดับมิลลิโวลต์)
  4. ชิป HX711 จะทำหน้าที่ขยายสัญญาณแรงดันจิ๋วนั้นให้ Arduino ของเราอ่านค่าได้
  5. ในโค้ด โดยใช้ไลบรารี่ <HX711.h> Arduino จะคอยตรวจสอบน้ำหนักแบบต่อเนื่อง
#include <Q2HX711.h>
const byte hx711_data_pin = 3;
const byte hx711_clock_pin = 4;
float y1 = 20.0; // calibrated mass to be added
long x1 = 0L;
long x0 = 0L;
float avg_size = 10.0; // amount of averages for each mass measurement
Q2HX711 hx711(hx711_data_pin, hx711_clock_pin); // prep hx711
void setup() {
 Serial.begin(9600); // prepare serial port
 delay(1000); // allow load cell and hx711 to settle
 // tare procedure
 for (int ii=0;ii<int(avg_size);ii++){
   delay(10);
   x0+=hx711.read();
 }
 x0/=long(avg_size);
 Serial.println("Add Calibrated Mass");
 // calibration procedure (mass should be added equal to y1)
 int ii = 1;
 while(true){
   if (hx711.read()<x0+10000){
   } else {
     ii++;
     delay(2000);
     for (int jj=0;jj<int(avg_size);jj++){
       x1+=hx711.read();
     }
     x1/=long(avg_size);
     break;
   }
 }
 Serial.println("Calibration Complete");
}
void loop() {
 // averaging reading
 long reading = 0;
 for (int jj=0;jj<int(avg_size);jj++){
   reading+=hx711.read();
 }
 reading/=long(avg_size);
 // calculating mass based on calibration and linear fit
 float ratio_1 = (float) (reading-x0);
 float ratio_2 = (float) (x1-x0);
 float ratio = ratio_1/ratio_2;
 float mass = y1*ratio;
 Serial.print("Raw: ");
 Serial.print(reading);
 Serial.print(", ");
 Serial.println(mass);
}

วิศวกรรมเบื้องหลังการสั่งงานมอเตอร์

หลังจากปรับเทียบ loadcell เสร็จ เราก็เริ่มสร้างส่วนที่รับค่าจากผู้ใช้ เป้าหมายคืออยากให้โปรเจคนี้ทำงานได้โดยไม่ต้องพึ่งคอมพ์ เลยติดปุ่มกด, โพเทนชิโอมิเตอร์ (Potentiometer) และจอแสดงผลเข้าไป

เราใช้โพเทนชิโอมิเตอร์รับค่า แล้วใช้ฟังก์ชัน map แปลงค่าที่ได้ให้เป็นตัวเลขหลักเดียว จากนั้นใช้ปุ่มกดเพื่อยืนยันค่า โดยควบคุมด้วยลูป while

สมมติเราตั้งเป้า: เป้าหมาย: 40 กรัม

  1. จ่ายแบบจัดเต็ม (Bulk Dispense Rate): Arduino จะสั่งงานเซอร์โวมอเตอร์ที่ติดกับกลไกจ่ายผง เพราะตั้งไว้ 40 กรัม มอเตอร์จะหมุนเต็มกำลัง ดันผงออกจากรางแบบสุดเหวี่ยง
  2. ช่วงชะลอตัว (The Dynamic Slowdown): Load cell จะส่งน้ำหนักกลับมาทุกขณะ น้ำหนัก: 20g... 30g... 35g...
  3. ทันทีที่น้ำหนักเข้าใกล้เป้าหมาย Arduino จะเข้าสู่ลูป "จบแบบแม่นยำ (Precision Finish)" มันจะสั่งให้เซอร์โวมอเตอร์ช้าลงแบบค่อยเป็นค่อยไป
  4. เมื่อน้ำหนักบนตาชั่งเท่ากับเป้าหมายพอดี Arduino จะสั่งให้เซอร์โวมอเตอร์หยุด

หลังจากรับค่าผู้ใช้แล้ว ลูป while จะคอยตรวจสอบตลอดว่าน้ำหนักจาก loadcell ตรงกับที่ต้องการหรือยัง พอถึงน้ำหนักเป้าหมายมันก็จะหยุด

ระหว่างกระบวนการนี้ น้ำหนักจะแสดงผลบนจอตลอดเวลา เราใช้ฟังก์ชัน round และคณิตศาสตร์พื้นฐานเพื่อคำนวณและแสดงน้ำหนัก

เรายังสร้างความเร็วไว้ 3 ระดับด้วย เพื่อให้ระบบจ่ายช้าลงเมื่อน้ำหนักเข้าใกล้เป้าหมาย

สำหรับการจ่ายผง เราใช้เซอร์โวมอเตอร์ ใช้ฟังก์ชันพื้นฐาน servo.write โดยกำหนดมุม (degree) ต่างกันเพื่อให้ได้ความเร็วต่างกัน

สุดท้าย เรายังเพิ่มฟังก์ชัน "ชั่งน้ำหนักบรรจุภัณฑ์ (tare)" ซึ่งจะวัดน้ำหนักเมื่อกดปุ่มตอนเริ่มต้น เพื่อหักลบน้ำหนักของภาชนะออก

สิ่งที่ต้องมีสำหรับระบบ

  • Arduino Mega/Uno: สำหรับประมวลผลแบบเรียลไทม์
  • โหลดเซลล์อลูมิเนียม (เช่น ขนาดสูงสุด 1kg) และ โมดูล HX711 24-Bit ADC
  • เซอร์โวมอเตอร์ สำหรับจ่ายผง
  • เครื่องพิมพ์ 3D หรือวัสดุอื่นๆ สำหรับสร้างกลไกจ่ายผงและถังเก็บแบบกำหนดเอง

หลังจากโค้ดเสร็จ เราก็เริ่มประกอบเครื่องจ่ายผง เราใช้บล็อก Duplo แต่น้องๆ จะใช้วัสดุอื่นก็ได้ตามสบายเลยจ้า

Powder Dispenser Assembly

Circuit Diagram

Board

Servo

ข้อมูล Frontmatter ดั้งเดิม

apps:
  - "1x Arduino IDE"
author: "proprietor"
category: "Home & Automation"
components:
  - "1x Rotary potentiometer (generic)"
  - "1x Arduino Due"
  - "1x Loadcell Sensor"
  - "1x Male/Male Jumper Wires"
  - "1x Breadboard (generic)"
  - "1x Resistor 1k ohm"
  - "1x TM1637 4-bits digital LED-display"
  - "1x Pushbutton Switch, Momentary"
  - "1x SparkFun Load Cell Amplifier - HX711"
  - "1x SG90 Micro-servo motor"
  - "1x Male/Female Jumper Wires"
description: "Precision measurements! Upgrade from cheap plastic chutes to an industrial-grade motorized auger system capable of dispensing exact gram weights of protein powder or coffee grounds."
difficulty: "Advanced"
documentationLinks: []
downloadableFiles:
  - "https://projects.arduinocontent.cc/5fa7fed6-903a-4e65-9163-0f26e6e0be5b.ino"
encryptedPayload: "U2FsdGVkX1/wu2mtyhhpMd7ui/8/Luf+R8QwSWVke2Nq7t4QSm4JVYSjEeUVzr00HxHkXOEwecicof02TY7JM3QO5O6U7CCOu/7VfKSJeRo="
heroImage: "https://cdn.jsdelivr.net/gh/bigboxthailand/arduino-assets@main/images/projects/automated-powder-dispenser-16d7c7_cover.jpg"
lang: "en"
likes: 0
passwordHash: "ec6e2637d77609c3ac83afaf610fab095684f9e6e7f1c346bd692d7cfbdbd696"
price: 1120
seoDescription: "Build an Automated powder dispenser with Arduino and a pot. Control the exact amount of powder dispensed in this DIY project."
tags:
  - "scale"
  - "dispanser"
  - "powder"
title: "เครื่องแจกผงอัตโนมัติ งานง่ายแต่หล่อ!"
tools: []
videoLinks:
  - "https://www.youtube.com/embed/6z_ZCzpVibs"
views: 7656