กลับไปหน้ารวมไฟล์
dosing-peristaltic-pump-pwm-ssr-hx711-scale-and-an-fsm-36c4d1.md

แอปพลิเคชันนี้แสดงการทำงานของระบบจ่ายสารโดยใช้ปั๊มแบบเพอริสตัลติก (Peristaltic pumps) 2 ตัว (ขับด้วย PWM ผ่าน Solid State Relay), ทรานสดิวเซอร์วัดน้ำหนักแบบดิจิทัล 1 ตัว (ใช้ HX711), ไฟจราจร LED และบอร์ด Arduino Mega2560 พร้อมชิลด์อีเธอร์เน็ต

เริ่มแรกจะเติมของเหลวลงในภาชนะบนตาชั่งทีละ 15 มล. จนถึง 100 มล. จากนั้นก็จะปล่อยออกหมด คำสั่งเริ่มและหยุดจะถูกส่งผ่านอีเธอร์เน็ตโดยใช้ WawiLib เพื่ออ่านและเขียนตัวแปรในสเก็ตช์ การเปลี่ยนสถานะของ State Machine จะแสดงผลที่หน้าต่างเอาต์พุตของ WawiLib

มีวิดีโอ 3 คลิปที่บันทึกการทำงานของแอปพลิเคชันนี้:

Application demonstration.
The hardware explained (SSR and flywheel diode concepts)
Software with WawiLib variable access, C++ timer objects, PWM Solid State Relay and FSM

เทคโนโลยีที่ใช้และอธิบายละเอียด:

ตรรกะของ Finite State Machine (FSM)

โปรแกรมที่ใช้ delay() แบบธรรมดาจะล่มเวลาเราต้องการหยุดฉุกเฉิน (Emergency Stop) เอ็งจิ้นตัวนี้เลยใช้ Finite State Machine (FSM) แบบ Explicit มาช่วย ตรรกะสำหรับแอปจ่ายสารแบบแม่นยำมักจะมีสถานะ (State) ประมาณนี้:

  1. สถานะ IDLE: รอรับอินพุตเป้าหมาย (เช่น ขอจ่าย 50g)
  2. สถานะ DOSING_FAST: SSR เปิด PWM 100% ให้ปั๊มเพอริสตัลติก 12V จัดเต็ม
  3. สถานะ DOSING_SLOW: เมื่อน้ำหนักเข้าใกล้เป้าหมาย (เช่น เหลืออีก 5g) Arduino จะลด PWM ของ SSR ลงให้เป็นพัลส์ช้าๆ เพื่อควบคุมแบบละเอียด
  4. สถานะ DOSING_DONE: Load Cell วัดน้ำหนักได้ตรงเป๊ะๆ ระบบตัดไฟทันที

วิธีแบบ State-Based นี้ทำให้การทำงานเชื่อถือได้และสามารถหยุดแทรก (Interrupt) ได้ ไดอะแกรมสถานะด้านล่างแสดงการไหลของงานนี้

Finite state machine diagram for dosing.
Finite state machine diagram.

นี่คือตัวอย่างโค้ดจาก 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()) เพื่อควบคุมความเร็วของมอเตอร์กระแสตรงได้อย่างลื่นไหล!

แผนภาพด้านล่างแสดงการตั้งค่าและการต่อเบื้องต้น

การตั้งค่าพื้นฐานของปั๊ม 2 ตัวกับมอเตอร์กระแสตรงและไดโอด Flywheel
การต่อ SSR เข้ากับ Arduino (ลอจิกผกผัน)

การป้องกันด้วย Flywheel Diode

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

Wawilib ใช้สำหรับติดตามและแก้ไขตัวแปร พร้อมดูผลลัพธ์ดีบักจากสเก็ตช์ไปในตัว
  • สามารถดาวน์โหลดไฟล์สอนละเอียดยิบ AppNotePeriPump.pdf ได้จากเว็บไซต์ Sylvester Solutions ซึ่งอธิบายขั้นตอนต่างๆ อย่างเป็นขั้นเป็นตอน ไปที่หน้าคู่มือในเว็บไซต์ได้เลย

หากยังไม่รู้วิธีโปรแกรมงานออโตเมชันให้ถูกหลัก (เช่น ไม่ใช้คำสั่ง delay) ลองดูจากบทเรียนนี้สิ น้องจะได้ความรู้เพียบ! ทุกคอนเซปต์อธิบายไว้ละเอียดในไฟล์ PDF และมีซอร์สโค้ด .ino แนบมาด้วย

โค้ดชุดนี้เอาไปใช้เป็นโครงสร้างพื้นฐาน (framework) สำหรับแอปพลิเคชันอื่นๆ อีกมากมายได้ เพราะจัดโครงสร้างมาแบบมือโปรเลย

จัดไปวัยรุ่น! สู้งานนะน้อง

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

apps:
  - "1x WawiLib"
author: "user1793315"
category: "Sensors & Environment"
components:
  - "1x Bench Power Supply, DC"
  - "1x OOTDTY 2 Channel SSR Solid State Relay High Lever Trigger 5A 5v12v For Uno R3 APR11_10"
  - "1x Arduino Ethernet Shield 2"
  - "1x Arduino Mega 2560"
  - "1x DC Small Dosing Pump 3V 6V 12V 24V Micro Self priming Mute Mini Peristaltic Liquid"
  - "1x     Digital Load Cell Weight Sensor HX711 AD Converter Breakout Module 5KG Portable Electronic Kitchen Scale for Arduino Scale new     Digital Load Cell Weight Sensor HX711 AD Converter Breakout Module 5KG Portable Electronic Kitchen Scale for Arduino Sca"
  - "1x Mini 5V Traffic Light LED Display Module for Arduino Red Yellow Green 5mm LED RG"
description: "Industrial analytical chemistry! Construct an ultra-precise fluid dosing engine driven by a finite state machine, orchestrating peristaltic DC tracking algorithms dynamically scaled against mass feedback from an HX711 load cell bridge."
difficulty: "Intermediate"
documentationLinks: []
downloadableFiles:
  - "https://projects.arduinocontent.cc/2c1f185c-449b-45cb-8c9a-6b0965e398ce.ino"
  - "https://projects.arduinocontent.cc/2c1f185c-449b-45cb-8c9a-6b0965e398ce.ino"
encryptedPayload: "U2FsdGVkX19vNyoikWRBY8LtfEiYn11ZobPJc7jbaKDAEyFkfklX0XnOa3MuxdhQwQkxk0DkUOCR4CFl3vAq5Q=="
heroImage: "https://cdn.jsdelivr.net/gh/bigboxthailand/arduino-assets@main/images/projects/dosing-peristaltic-pump-pwm-ssr-hx711-scale-and-an-fsm-36c4d1_cover.jpg"
lang: "en"
likes: 0
passwordHash: "cfe852765ad69bbabde9423ec500249a45ae16a247d6d5a5e954cbd5758b8767"
price: 2450
seoDescription: "Learn to build a Dosing Peristaltic Pump with PWM SSR, HX711 scale, and Finite State Machine using WawiLib and software timers."
tags:
  - "peristaltic pump"
  - "timer"
  - "fsm"
  - "solid state"
title: "โปรเจคปั๊มจ่ายยาแบบ PWM + ตราชั่ง HX711 ควบคุมด้วย State Machine งานง่ายแต่หล่อ!"
tools: []
videoLinks:
  - "https://www.youtube.com/embed/kgk6FQgIbCU"
  - "https://www.youtube.com/embed/r9Xk9aEaWg8"
  - "https://www.youtube.com/embed/SnCkaiOW8Sw"
views: 15206