แอปพลิเคชันนี้แสดงการทำงานของระบบจ่ายสารโดยใช้ปั๊มแบบเพอริสตัลติก (Peristaltic pumps) 2 ตัว (ขับด้วย PWM ผ่าน Solid State Relay), ทรานสดิวเซอร์วัดน้ำหนักแบบดิจิทัล 1 ตัว (ใช้ HX711), ไฟจราจร LED และบอร์ด Arduino Mega2560 พร้อมชิลด์อีเธอร์เน็ต
เริ่มแรกจะเติมของเหลวลงในภาชนะบนตาชั่งทีละ 15 มล. จนถึง 100 มล. จากนั้นก็จะปล่อยออกหมด คำสั่งเริ่มและหยุดจะถูกส่งผ่านอีเธอร์เน็ตโดยใช้ WawiLib เพื่ออ่านและเขียนตัวแปรในสเก็ตช์ การเปลี่ยนสถานะของ State Machine จะแสดงผลที่หน้าต่างเอาต์พุตของ WawiLib
มีวิดีโอ 3 คลิปที่บันทึกการทำงานของแอปพลิเคชันนี้:
เทคโนโลยีที่ใช้และอธิบายละเอียด:
ตรรกะของ Finite State Machine (FSM)
โปรแกรมที่ใช้ delay() แบบธรรมดาจะล่มเวลาเราต้องการหยุดฉุกเฉิน (Emergency Stop) เอ็งจิ้นตัวนี้เลยใช้ Finite State Machine (FSM) แบบ Explicit มาช่วย ตรรกะสำหรับแอปจ่ายสารแบบแม่นยำมักจะมีสถานะ (State) ประมาณนี้:
- สถานะ
IDLE: รอรับอินพุตเป้าหมาย (เช่น ขอจ่าย 50g) - สถานะ
DOSING_FAST: SSR เปิด PWM 100% ให้ปั๊มเพอริสตัลติก 12V จัดเต็ม - สถานะ
DOSING_SLOW: เมื่อน้ำหนักเข้าใกล้เป้าหมาย (เช่น เหลืออีก 5g) Arduino จะลด PWM ของ SSR ลงให้เป็นพัลส์ช้าๆ เพื่อควบคุมแบบละเอียด - สถานะ
DOSING_DONE: Load Cell วัดน้ำหนักได้ตรงเป๊ะๆ ระบบตัดไฟทันที
วิธีแบบ State-Based นี้ทำให้การทำงานเชื่อถือได้และสามารถหยุดแทรก (Interrupt) ได้ ไดอะแกรมสถานะด้านล่างแสดงการไหลของงานนี้


นี่คือตัวอย่างโค้ดจาก Implementation:
// Finite state machine code example:
//+++++++++++++++++++++++++++++++++++++++
case FsmState::STEP3_WAIT_CMD_FILL:
{
if (cmdFill)
FsmGoTo(FsmState::STEP4_P_FILL_FAST);
}
break;
ตัวอย่างที่ทั่วไปมากขึ้นของตรรกะ FSM สำหรับการจ่ายสารแบบแม่นยำอาจจะจัดโครงสร้างได้แบบนี้:
switch (currentState) {
case DOSING_FAST:
analogWrite(SSR_PIN, 255); // Full power
if (currentWeight >= (targetWeight - 5.0)) { // Approach threshold!
currentState = DOSING_SLOW; // Shift to fine control
}
break;
case DOSING_SLOW:
analogWrite(SSR_PIN, 80); // Reduced power for drop-by-drop control
if (currentWeight >= targetWeight) {
analogWrite(SSR_PIN, 0); // Exact weight achieved! Hard stop!
currentState = DOSING_DONE;
}
break;
}
ตัวจับเวลาแบบซอฟต์แวร์ด้วย Arduino "millis()"
ตัวจับเวลาแบบซอฟต์แวร์บน Arduino ที่ใช้ millis() (เขียนเป็นอ็อบเจ็กต์ C++ แยกไฟล์ในสเก็ตช์) วิธีใช้จะต่างจากที่เห็นกันทั่วไปหน่อยนะ (เพราะเราเอา millis() ไปห่อไว้ในอ็อบเจ็กต์ C++ แล้วเพิ่มไฟล์นั้นเข้าไปใน IDE) เรื่องทั้งหมดมีอธิบายขั้นตอนละเอียดในไฟล์ .pdf
// blinking 2 timers at the same time with variable time period:
#include "WawiTimer.h"
// blinker bit helper timers(software timers):
WawiTimer tBlink250; // 250 ms on
WawiTimer tBlink500; // 500 ms
// blinking bits that toggle:
bool blink250;
bool blink500;
//------------------------------------------------------------
// create blinkbits:
void Loop()
{
if (tBlink250.isZero())
{
tBlink250.setMs(250);
blink250 = !blink250;
}
if
{
tBlink500.setMs(500);
blink500 = !blink500;
}
tBlink250.loop(); // 250 ms
tBlink500.loop(); // 500 ms
}
ลืม millis() ไปได้เลย! เพิ่มอ็อบเจ็กต์ตัวจับเวลาของตัวเองที่ทำงานนับถอยหลังเข้าไป โดยที่ลูปหลักไม่สะดุดแม้แต่น้อย: สิ่งที่ต้องทำมีแค่เพิ่มไฟล์ 2 ไฟล์ลงในสเก็ตช์! (รายละเอียดว่าทำยังไงมีอยู่ในเอกสารประกอบ)
PWM (Pulse Width Modulation) ผ่าน SSR (Solid State Relay)
Pulse Width Modulation เป็นเทคนิคที่ใช้ควบคุม (เช่น) ความเร็วของมอเตอร์กระแสตรง บางพินของ Arduino สามารถสวิตช์เปิดปิดได้เร็วมาก (แบบฮาร์ดแวร์) ที่ความถี่หลาย kHz ถ้าเราใช้ฟังก์ชันนี้มาควบคุมกระแสให้มอเตอร์กระแสตรง ก็จะทำให้มันวิ่งด้วยความเร็วที่ปรับได้นั่นเอง วีดีโอและเอกสารอธิบายรายละเอียดไว้แล้ว
ข้อควรรู้เรื่อง Solid State Relay (SSR) กับ PWM
ห้ามส่งสัญญาณ PWM (พัลส์เร็วๆ) ไปที่รีเลย์แบบกลไกคลิกๆ ธรรมดาเด็ดขาด! มันจะส่งเสียงหึ่งๆ และละลายในเวลาไม่กี่วินาทีเพราะเกิดอาร์คที่หน้าสัมผัส ต้องใช้ DC-to-DC Solid State Relay (SSR) (เช่น ยี่ห้อ Fotek หรือบอร์ด MOSFET แรงสูง) เท่านั้น SSR ไม่มีชิ้นส่วนเคลื่อนไหว ทำให้ Arduino สามารถสวิตช์กระแสสูงได้เร็วหลายร้อยครั้งต่อวินาที (analogWrite()) เพื่อควบคุมความเร็วของมอเตอร์กระแสตรงได้อย่างลื่นไหล!
แผนภาพด้านล่างแสดงการตั้งค่าและการต่อเบื้องต้น


การป้องกันด้วย Flywheel Diode
มอเตอร์กระแสตรงมีขดลวดอยู่ข้างใน ซึ่งเป็นตัวเหนี่ยวนำ ต้องแน่ใจว่าเมื่อรีเลย์เปิดวงจร กระแสไฟจะไม่ถูกตัดขาดทันที เพราะจะทำให้เกิดแรงดันสไปก์สูงซึ่งทำลายชิ้นส่วนอื่นได้ ไดโอดคือตัวเลือกที่ดีที่สุดสำหรับงานนี้ บทช่วยสอนนี้จะอธิบายแนวคิดของ Flywheel Diode อย่างละเอียด

ฮาร์ดแวร์และสถาปัตยกรรมระบบ
ในแล็บเภสัชหรือระบบให้ปุ๋ยไฮโดรโพนิก การจ่ายของเหลวให้แม่นยำด้วยการจับเวลาเฉยๆ มันไม่น่าเชื่อถือเลยน้อง! ความหนืดที่เปลี่ยนไปหรือแรงดันตกนิดหน่อยก็ทำให้คลาดเคลื่อนมหาศาลแล้ว ระบบ ปั๊มเพอริสตัลติกสำหรับจ่ายสาร (Dosing Peristaltic Pump) ตัวนี้เลยพึ่งพาตัวควบคุมแบบวงปิดที่ใช้ข้อมูลมวลจริงเป็นหลัก (closed-loop mass feedback controller) ไอเดียคือให้ Arduino คอยประเมินน้ำหนักสัมบูรณ์ของบีกเกอร์เป้าหมายผ่านตัวขยายสัญญาณ Load Cell HX711 แล้วค่อยๆ หรี่การทำงานของ Solid State Relay (SSR) ผ่านสัญญาณ PWM เพื่อลดความเร็วปั๊มเพอริสตัลติกอย่างนุ่มนวล ก่อนจะถึงน้ำหนักเป้าหมายเป๊ะๆ!
โครงสร้างพื้นฐานฮาร์ดแวร์ทางเคมี
- Arduino Mega2560 พร้อม Ethernet Shield (หรือใช้ Nano/Uno สำหรับงานที่ง่ายกว่า)
- ปั๊มเพอริสตัลติก 12V (ใช้ท่อซิลิโคน ของเหลวจะได้ไม่สัมผัสชิ้นส่วนโลหะ เหมาะกับสารชีวภาพปลอดเชื้อหรือปุ๋ยเคมีแรงๆ)
- ตัวขยายสัญญาณ HX711 และ Load Cell (ให้ความละเอียดการวัดมวลระดับต่ำกว่ากรัม!)
- DC-to-DC SSR (Solid State Relay) หรือ MOSFET กำลังสูงแบบ Logic Level (เช่น IRLZ44N)
- พาวเวอร์ซัพพลาย 12V ตัวเบิ้ม (เพื่อขับแรงบิดของชุดโรลเลอร์ในปั๊มเพอริสตัลติก)
- ไฟจราจร LED สำหรับแสดงสถานะแบบเห็นชัดๆ
การติดตามและควบคุมด้วย WawiLib
เราส่งคำสั่งเริ่มและหยุดผ่านอีเธอร์เน็ต โดยใช้ WawiLib ในการอ่านและเขียนตัวแปรในสเก็ตช์ การเปลี่ยนแปลงสถานะของ State Machine จะแสดงผลที่หน้าต่างเอาต์พุตของ WawiLib ให้เห็นเลย

- สามารถดาวน์โหลดไฟล์สอนละเอียดยิบ AppNotePeriPump.pdf ได้จากเว็บไซต์ Sylvester Solutions ซึ่งอธิบายขั้นตอนต่างๆ อย่างเป็นขั้นเป็นตอน ไปที่หน้าคู่มือในเว็บไซต์ได้เลย
หากยังไม่รู้วิธีโปรแกรมงานออโตเมชันให้ถูกหลัก (เช่น ไม่ใช้คำสั่ง delay) ลองดูจากบทเรียนนี้สิ น้องจะได้ความรู้เพียบ! ทุกคอนเซปต์อธิบายไว้ละเอียดในไฟล์ PDF และมีซอร์สโค้ด .ino แนบมาด้วย
โค้ดชุดนี้เอาไปใช้เป็นโครงสร้างพื้นฐาน (framework) สำหรับแอปพลิเคชันอื่นๆ อีกมากมายได้ เพราะจัดโครงสร้างมาแบบมือโปรเลย
จัดไปวัยรุ่น! สู้งานนะน้อง