Industrial Dosing: เครื่องจ่ายผงอัตโนมัติ
- ว่าไงทุกคน! โปรเจคนี้เราเริ่มจากปัญหาจริงในแล็บนี่แหละ การตวงผงให้ได้ปริมาณเป๊ะๆ บางทีก็ปวดหัวใช่มั้ยล่ะ? แต่พอมีเจ้านี่แล้ว... จบเรื่อง!
- เราใช้ Load Cell มาชั่งน้ำหนัก จอแสดงผลไว้ดูน้ำหนักกับค่าที่ตั้ง ใช้ปุ่มกดกับโพเทนชิโอมิเตอร์ตั้งค่า และสุดท้ายมอเตอร์เซอร์โวคอยจ่ายผง เรียบร้อย!
The Load Cell Feedback Loop (HX711)
หลังจากยึด Load Cell เข้ากับฐานแล้ว เราใช้โค้ดจาก Hrisko, J มาปรับเทียบ Load Cell กัน
ระบบมันไม่สามารถพึ่งเวลาแบบ "เปิดสกรู 3 วินาที" เฉยๆ ได้หรอกนะ น้อง เพราะความชื้นหรือการจับตัวของผงทำให้อัตราการไหลไม่คงที่ ระบบต้องชั่งน้ำหนักแบบเรียลไทม์ไปด้วยเลย
- ถ้วยรับผงของเราวางอยู่บนแท่งอลูมิเนียมที่เรียกว่า Load Cell (Strain Gauge).
- พอผงตกลงมาในถ้วย แท่งอลูมิเนียมจะโก่งตัวนิดหน่อย (เล็กมากๆ)
- การโก่งตัวนิดเดียวเนี่ย ทำให้เกิดการเปลี่ยนแปลงแรงดันไฟฟ้าเล็กจิ๋ว (ระดับมิลลิโวลต์)
- ชิป HX711 จะทำหน้าที่ขยายสัญญาณแรงดันจิ๋วนั้นให้ Arduino ของเราอ่านค่าได้
- ในโค้ด โดยใช้ไลบรารี่
<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 กรัม
- จ่ายแบบจัดเต็ม (Bulk Dispense Rate): Arduino จะสั่งงานเซอร์โวมอเตอร์ที่ติดกับกลไกจ่ายผง เพราะตั้งไว้ 40 กรัม มอเตอร์จะหมุนเต็มกำลัง ดันผงออกจากรางแบบสุดเหวี่ยง
- ช่วงชะลอตัว (The Dynamic Slowdown): Load cell จะส่งน้ำหนักกลับมาทุกขณะ
น้ำหนัก: 20g... 30g... 35g... - ทันทีที่น้ำหนักเข้าใกล้เป้าหมาย Arduino จะเข้าสู่ลูป "จบแบบแม่นยำ (Precision Finish)" มันจะสั่งให้เซอร์โวมอเตอร์ช้าลงแบบค่อยเป็นค่อยไป
- เมื่อน้ำหนักบนตาชั่งเท่ากับเป้าหมายพอดี Arduino จะสั่งให้เซอร์โวมอเตอร์หยุด
หลังจากรับค่าผู้ใช้แล้ว ลูป while จะคอยตรวจสอบตลอดว่าน้ำหนักจาก loadcell ตรงกับที่ต้องการหรือยัง พอถึงน้ำหนักเป้าหมายมันก็จะหยุด
ระหว่างกระบวนการนี้ น้ำหนักจะแสดงผลบนจอตลอดเวลา เราใช้ฟังก์ชัน round และคณิตศาสตร์พื้นฐานเพื่อคำนวณและแสดงน้ำหนัก
เรายังสร้างความเร็วไว้ 3 ระดับด้วย เพื่อให้ระบบจ่ายช้าลงเมื่อน้ำหนักเข้าใกล้เป้าหมาย
สำหรับการจ่ายผง เราใช้เซอร์โวมอเตอร์ ใช้ฟังก์ชันพื้นฐาน servo.write โดยกำหนดมุม (degree) ต่างกันเพื่อให้ได้ความเร็วต่างกัน
สุดท้าย เรายังเพิ่มฟังก์ชัน "ชั่งน้ำหนักบรรจุภัณฑ์ (tare)" ซึ่งจะวัดน้ำหนักเมื่อกดปุ่มตอนเริ่มต้น เพื่อหักลบน้ำหนักของภาชนะออก
สิ่งที่ต้องมีสำหรับระบบ
- Arduino Mega/Uno: สำหรับประมวลผลแบบเรียลไทม์
- โหลดเซลล์อลูมิเนียม (เช่น ขนาดสูงสุด 1kg) และ โมดูล HX711 24-Bit ADC
- เซอร์โวมอเตอร์ สำหรับจ่ายผง
- เครื่องพิมพ์ 3D หรือวัสดุอื่นๆ สำหรับสร้างกลไกจ่ายผงและถังเก็บแบบกำหนดเอง
หลังจากโค้ดเสร็จ เราก็เริ่มประกอบเครื่องจ่ายผง เราใช้บล็อก Duplo แต่น้องๆ จะใช้วัสดุอื่นก็ได้ตามสบายเลยจ้า



