ทำเครื่องจ่ายน้ำอัตโนมัติด้วย KidBright32

เคยสงสัยหรือไม่ว่า ตู้น้ำหยอดเหรียญที่ตั้งอยู่ในสถานที่ต่าง ๆ เช่น หอพัก ร้านค้า และสถานที่อื่น ๆ มีหลักการทำงานอย่างไร ตู้วัดประมาณน้ำอย่างไร ในบทความนี้เราจะมาเรียนรู้หลักการวัดและควบคุมปริมาณการจ่ายน้ำ และทดลองทำเครื่องจ่ายน้ำด้วยบอร์ด KidBright กัน

หลักการวัดและควบคุมปริมาณการจ่ายน้ำ

แบ่งออกได้ 2 วิธี

1.การวัดโดยตรง

คือ การวัดปริมาณน้ำที่ไหลผ่านท่อ หรือวัดน้ำหนักของน้ำในภาชนะโดยตรง โดยใช้เซ็นเซอร์ต่าง ๆ เข้าไปวัดโดยตรง

  • ข้อดี คือ ปริมาณน้ำที่จ่ายมีความเที่ยงตรงสูง และเชื่อถือได้
  • ข้อเสีย คือ ค่าใช้จ่ายในการจัดทำและบำรุงรักษาสูงกว่าวิธีจับเวลา

2.การจับเวลา

คือ การวัดว่าใน 1 วินาทีจ่ายน้ำได้กี่ลิตร จากนั้นจึงเทียบบัญญัติไตรยางค์เพื่อควบคุมปริมาณน้ำที่จ่าย เช่น วัดแล้วว่าใน 1 วินาทีจ่ายน้ำได้ 5 ลิตร หากต้องการให้จ่ายน้ำ 15 ลิตร ให้จ่ายน้ำเป็นเวลา 3 วินาที เป็นต้น

  • ข้อดี คือ บำรุงรักษาง่าย ใช้อุปกรณ์น้อย
  • ข้อเสีย คือ มีความน่าเชื่อถือต่ำ ไม่สามารถจ่ายน้ำได้ละเอียดมากนัก ปริมาณน้ำที่จ่ายได้ขึ้นอยู่กับหลายปัจจัย เช่น ปริมาณน้ำในถังเก็บ แรงดันน้ำ เป็นต้น

การใช้บอร์ด KidBright ร่วมกับปั้มน้ำ

การเชื่อมต่อปั้มน้ำเข้ากับบอร์ด KidBright แนะนำให้ใช้งานปั้มน้ำ USB ซึ่งมีลักษณะดังรูปด้านล่างนี้

รูปที่ 1 ปั้มน้ำ USB ที่ใช้ในโครงงานนี้

ปั้มน้ำแบบ USB สามารถเชื่อมต่อกับบอร์ด KidBright ได้โดยตรงผ่านช่อง USB โดยปั้มน้ำที่นำมาต่อจะต้องใช้กระแสไฟฟ้าไม่เกิน 300mA สำหรับปั้มน้ำ USB ในรูปที่ 1 ใช้กระแสไฟฟ้าประมาณ 200mA ดังนั้นจึงต่อเข้ากับบอร์ด KidBright ได้โดยตรง ดังรูปที่ 2

รูปที่ 2 การเชื่อมต่อปั้มน้ำ USB เข้ากับบอร์ด KidBright ผ่านช่อง USB

ทดสอบเขียนโปรแกรมสั่งงานปั้มน้ำ

ในการเขียนโปรแกรมสั่งงานปั้มน้ำ บทความนี้ใช้ microBlock IDE ในการเขียนโปรแกรม โดยเลือกใช้การเขียนโปแกรมแบบภาษา Python ในการสั่งงาน

1) เปิดโปรแกรม microBlock IDE ขึ้นมา กดปุ่มสร้างโปรเจคใหม่

2) ตั้งชื่อโปรเจค (1) เลือกบอร์ดที่ใช้งาน ตัวอย่างใช้บอร์ด KidBright32 V1.3 (2) กดปุ่ม Create

3) กดปุ่มเปลี่ยนเป็นโหมด Code จะเห็นว่าสามารถพิมพ์โค้ดโปรแกรม Python ได้แล้ว

4) กดปุ่มใด ๆ บนคีย์บอร์ด โปรแกรมจะแจ้งเตือนเปลี่ยนเป็นโหมดเขียนโค้ด ให้กด Yes เพื่อยืนยันการเปลี่ยนโหมดการเขียนโปรแกรม

5) เขียนโปรแกรมทดสอบสั่งงานปั้มน้ำดังนี้

import usb # นำเข้าโมดูล usb เพื่อให้เขียนคำสั่งสั่งงาน USB ได้
from time import sleep # นำเข้าคำสั่ง sleep จากโมดูล time

usb.on() # สั่งให้อุปกรณ์ที่ต่อช่อง USB ทำงาน
sleep(1) # หน่วงเวลาเป็นเวลา 1 วินาที
usb.off() # สั่งให้อุปกรณ์ที่ต่อช่อง USB หยุดทำงาน

6) กดปุ่มอัพโหลดโปรแกรมลงบอร์ด KidBright

ผลการทำงาน คือ ปั้มน้ำทำงาน 1 วินาที แล้วหยุดทำงาน สามารถกดปุ่ม Reset เพื่อดูผลการทำงานซ้ำได้

**ปั้มน้ำต้องทำงานได้ในขั้นตอนนี้ จึงจะไปในขั้นตอนถัดไปได้**

การควบคุมการจ่ายน้ำด้วยวิธีจับเวลา

ข้อมูลจากผู้ขายปั้มน้ำได้ระบุไว้ว่า ปั้มน้ำ USB ตามรูปที่ 1 สามารถปั้มน้ำได้ปริมาณ 1.2 – 1.6 ลิตร/นาที ค่ากลางคือ 1.4 ลิตร/นาที สร้างเป็นสูตรหาค่าเวลาที่ปั้มน้ำต้องทำงานเมื่อกำหนดปริมาณน้ำที่กำหนด ได้ดังนี้

1.4 ลิตร / 60 วินาที = 23.33 มิลลิลิตร/วินาที

1 มิลลิลิตร = 1 / 23.33 มิลลิลิตร/วินาที = 0.042 วินาที

ดังนั้น

ปริมาณน้ำที่ต้องการในหน่วยมิลลิลิตร * 0.042 = ระยะเวลาที่ปั้มน้ำต้องทำงานในหน่วยวินาที

จากสูตรด้านบน ทดสอบหาค่ากลับ หากต้องการปริมาณน้ำ 1.4 ลิตร หรือ 1400 มิลลิลิตร ระยะเวลาที่ปั้มน้ำทำงานควรจะประมาณ 60 วินาที

1400 มิลลิลิตร * 0.042 = 58.8 วินาที

ค่าที่ได้ใกล้เคียง 60 วินาที แสดงว่าสูตรคำนวณถูกต้องแล้ว

ทดสอบเขียนโปรแกรมให้ปั้มน้ำจ่ายน้ำออกมา 100 มิลลิลิตร ดังนี้

import usb # นำเข้าโมดูล usb เพื่อให้เขียนคำสั่งสั่งงาน USB ได้ 
from time import sleep # นำเข้าคำสั่ง sleep จากโมดูล time

waterWant = 100 # สร้างตัวแปร กำหนดปริมาณน้ำที่ต้องการ 100 มิลลิลิตร
timeOn = waterWant * 0.042 # คำนวณหาค่าเวลาที่ปั้มน้ำต้องทำงานในหน่วยวินาที เก็บผลการคำนวณลงตัวแปร timeOn

usb.on() # สั่งให้ปั้มน้ำทำงาน 
sleep(timeOn) # หน่วงเวลาตามค่าที่อยู่ในตัวแปร timeOn
usb.off() # สั่งให้ปั้มน้ำหยุดทำงาน

อัพโหลดโปรแกรมเพื่อทดสอบการทำงาน ผลที่ได้ ปั้มน้ำควรจ่ายน้ำออกมา 100 มิลลิลิตร

จากการทดสอบด้วยเครื่องมือที่มีจำนวน 10 ครั้ง พบว่าใส่น้ำลงภาชนะปริมาณ 600 มิลลิลิตร หลังปั้มน้ำออก พบว่าน้ำเหลือประมาณ 360 มิลลิลิตร แสดงว่าปั้มน้ำจ่ายน้ำออกไป 600 – 360 = 240 มิลลิลิตร ซึ่งผิดจากที่คำนวณไว้ถึง 140 มิลลิลิตร แสดงว่าสูตรคำนวณด้านบนนั้น ไม่สามารถนำมาใช้จริงได้

รูปที่ 3 ปริมาณน้ำก่อนปั้มน้ำทำงาน
รูปที่ 4 ปริมาณน้ำที่เหลือในภาชนะหลังปั้มน้ำทำงาน

แก้ไขสูตรคำนวณใหม่ โดยเทียบบัญญัติไตรยางค์เช่นเดิม จากโค้ดโปรแกรม 100 * 0.042 = 4.2 แสดงว่า ปั้มน้ำทำงาน 4.2 วินาที ได้ 240 มิลลิลิตร เทียบบัญญัติไตรยางค์ใหม่ได้ 4.2 / 240 = 0.0175 วินาที/มิลลิลิตร

จากโค้ดโปรแกรมด้านบน แก้ไขโค้ดโปรแกรมบรรทัดที่ 5 เป็น * 0.0175 แทน แล้วอัพโหลดโปรแกรมทดสอบการทำงานอีกครั้ง

ทดสอบการทำงาน 10 ครั้ง พบว่า * 0.0175 ปริมาณน้ำที่ปั้มออกยังขาดอีกเล็กน้อย

รูปที่ 5 ปริมาณน้ำที่เหลือในภาชนะ (จาก 600 mL) หลังแก้ไขโค้ดโปรแกรมบรรทัดที่ 5 เป็น * 0.0175

จึงปรับค่า 0.0175 แบบสุ่ม โดยปริมาณน้ำที่ต้องการ 100 มิลลิลิตร แต่จ่ายน้ำได้ไม่ถึง 100 มิลลิลิตร แสดงว่าต้องเพิ่มค่า 0.0175 ขึ้น เพื่อให้ปั้มทำงานนานขึ้น

จากการทดสอบสุ่มค่าไปเรื่อย ๆ พบว่าค่า 0.02 ทำให้จ่ายน้ำได้ใกล้เคียง 100 มิลลิลิตรมากที่สุด

รูปที่ 6 ปริมาณน้ำที่เหลือในภาชนะ (จาก 600 mL) หลังแก้ไขโค้ดโปรแกรมบรรทัดที่ 5 เป็น * 0.02

ทำเครื่องจ่ายน้ำ

รูปแบบของเครื่องจ่ายน้ำที่ทำในบทความนี้ แสดงดังรูปที่ 7

รูปที่ 7 ภาพสามมิติของเครื่องจ่ายน้ำอัตโนมัติ

โครงสร้างของเครื่องทำจากกระดาษลังตัดแบ่งเป็น 5 ส่วน แต่ละส่วนมีขนาดดังรูปที่ 8

รูปที่ 8 ขนาดของชิ้นส่วนต่าง ๆ ที่ใช้ประกอบเป็นเครื่องจ่ายน้ำ

ประกอบแต่ละส่วนตามแบบรูปที่ 1 ได้ผลดังรูปที่ 9

รูปที่ 9 เครื่องจ่ายน้ำที่ประกอบเสร็จแล้ว

เขียนโปรแกรมใหม่ให้จ่ายน้ำ 300 มิลลิลิตรต่อเมื่อปล่อยปุ่ม S1 ได้โค้ดโปรแกรมดังนี้

import usb # นำเข้าโมดูล usb เพื่อให้เขียนคำสั่งสั่งงาน USB ได้ 
from time import sleep # นำเข้าคำสั่ง sleep จากโมดูล time 
import switch # นำเข้าโมดูล switch เพื่อให้เขียนโปรแกรมรับคำสั่งจากสวิตช์ S1 & S2 ได้
import display # นำเข้าโมดูล display เพื่อให้เขียนโปรแกรมควบคุมแอลอีดี 16x8 ได้

waterWant = 200 # สร้างตัวแปร กำหนดปริมาณน้ำที่ต้องการ 200 มิลลิลิตร 
timeOn = waterWant * 0.02 # คำนวณหาค่าเวลาที่ปั้มน้ำต้องทำงานในหน่วยวินาที เก็บผลการคำนวณลงตัวแปร timeOn 

while True: # วนรอบทำคำสั่งต่อไปนี้
    display.raw(b"\x00\x00\x00\x00\x38\x44\x42\x21\x42\x44\x38\x00\x00\x00\x00\x00") # แสดงรูปหัวใจ
    if switch.value(switch.S1) == 1: # ถ้ากดปุ่ม S1
        display.raw(b"\x00\x00\x00\x00\x08\x04\x02\xff\x02\x04\x08\x00\x00\x00\x00\x00") # แสดงรูปลูกศร
        usb.on() # สั่งให้ปั้มน้ำทำงาน 
        sleep(timeOn) # หน่วงเวลาตามค่าที่อยู่ในตัวแปร timeOn 
        usb.off() # สั่งให้ปั้มน้ำหยุดทำงาน
    sleep(0.05) # หน่วงเวลาทำงาน 0.05 วินาที

ผลที่ได้ เป็นดังวีดีโอด้านล่าง


บทความนี้จัดทำโดย สนธยา นงนุช ผู้เขียนบทความด้านสมองกลฝังตัวกว่า 100 บทความบนเว็บไซต์ ร้านไอโอเอ็กซ์ฮ๊อบ อนุญาตให้คัดลอก ทำซ้ำ ดัดแปลง เผยแพร่ ส่วนหนึ่งส่วนใดหรือทั้งหมดของบทความนี้ได้ โดยต้องระบุแหล่งที่มา (สัญญาอนุญาต CC-BY-4.0)