กลับไปหน้ารวมไฟล์
fat-cat-food-guardian-ad8ad0.md

สรุปแบบรุ่นพี่บอกน้อง

เรามีแมวสองตัวนะฮะ ลิลลี่อ้วนเกินไป ต้องควบคุมอาหาร ส่วนจอร์จตัวเล็กมาก กินน้อย แต่ถ้าหิวจัดจะไปหาอาหารกินจากที่ไหนก็ได้ที่มันหาเจอ ถ้าไม่มีโปรเจกต์นี้ เราต้องเอาชามของลิลลี่วางไว้ตอนเช้า พร้อมอาหารที่ตวงไว้ให้พอดีทั้งวัน แล้วก็ต้องเก็บชามไว้ที่สูงๆ ที่จอร์จเอื้อมไม่ถึง พอเจ้าลิลลี่ร้องหาอาหารเพิ่ม (วันนึงร้องหลายรอบ) เราก็ต้องเอาชามลงมาให้มันกิน ถ้าลืมเก็บชามกลับที่สูง จอร์จก็จะแย่งอาหารพิเศษที่ตวงไว้ให้ลิลลี่กิน แล้วลิลลี่ก็จะอด!

โปรเจกต์นี้ใช้โหลดเซลล์กับ Arduino Uno มาควบคุมเซอร์โวให้ปิด-เปิดฝาชามของลิลลี่ตอนที่มันไม่อยู่ จะได้กันจอร์จไม่ให้แย่งกินได้ ระบบนี้พี่คาลิเบรตไว้ให้รู้แล้วว่าแมวตัวไหนกำลังยืนอยู่บนแท่นชั่ง ถ้ารู้สึกว่าเป็นแมวตัวใหญ่ (ลิลลี่) เซอร์โวจะขยับเปิดให้มันกินได้ พอมันก้าวออกจากแท่น เซอร์โวก็จะปิดฝาชามทันที แต่ถ้าระบบรู้สึกว่าเป็นแมวตัวเล็ก (จอร์จ) จะไม่ทำอะไรเลย! พี่ยังเพิ่มสวิตช์แบบกดค้างไว้ชั่วคราว (momentary switch) ไว้ด้วย เพื่อใช้เลื่อนฝาออกเวลาเราจะเติมอาหาร

รายละเอียดเทคนิค: ตรวจจับและลอจิกควบคุม

โปรเจกต์นี้เผยให้เห็นเลเยอร์ต่างๆ ที่ซ่อนอยู่ในปฏิสัมพันธ์ง่ายๆ จากการชั่งน้ำหนักไปสู่การสั่งงานกลไก:

  • เลเยอร์ระบุตัวตน: Arduino Uno ทำหน้าที่เป็นหน่วยประมวลผลหลัก อ่านข้อมูลน้ำหนักความละเอียดสูงจากโหลดเซลล์ผ่านโมดูลขยายสัญญาณ HX711 อย่างต่อเนื่อง
  • เลเยอร์แปลงสัญญาณ: HX711 ใช้โปรโตคอลแบบอนุบาลความเร็วสูง ส่งค่าการวัดน้ำหนักแบบ 24-bit ที่แม่นยำไปยัง Arduino ทำให้สามารถแยกความแตกต่างระหว่างแมวสองตัวได้อย่างถูกต้อง
  • เลเยอร์อินเทอร์เฟซกลไก: เซอร์โวมอเตอร์มาตรฐาน ให้การขับเคลื่อนทางกายภาพเพื่อปิดและเปิดฝาชามอาหารตามคำสั่งจาก Arduino
  • ลอจิกประมวลผล: โค้ด Arduino ใช้กลยุทธ์ "state machine": มันตีความน้ำหนักบนแท่น เปรียบเทียบกับค่าที่ตั้งไว้ตอนคาลิเบรต (สำหรับ "แมวตัวใหญ่" vs "แมวตัวเล็ก" vs "ไม่มีแมว") และสั่งให้เซอร์โวเปิดเฉพาะสำหรับแมวที่ได้รับอนุญาตเท่านั้น
  • การคาลิเบรต & ฟีดแบ็กลูป: การคาลิเบรตเริ่มต้นสำคัญมาก ระบบต้องเรียนรู้น้ำหนักของแท่นชั่งเอง (tare) จากนั้นเรียนรู้น้ำหนักที่รู้ค่าเพื่อกำหนดสเกลแฟกเตอร์ สถานะและค่าที่อ่านได้แบบดิบจะถูกส่งไปยัง Serial Monitor เพื่อใช้ดีบักระหว่างการตั้งค่านี้

รายละเอียดเพิ่มเติม

ใช้เวลาหลายวันกว่าจะตั้งระบบทั้งหมดในโหมดที่พี่เรียกว่า "โหมดม้านั่งทดสอบ" (test bench mode) ซึ่งประกอบด้วยเซนเซอร์ชั่งน้ำหนักจริง (ติดชั่วคราวระหว่างแผ่นไม้อัดสองชิ้น) โมดูล HX711, Arduino Uno, บอร์ดทดลอง (breadboard) และเซอร์โวตัวจิ๋วราคาถูกหนึ่งตัว การตั้งแบบนี้ทำให้พี่เริ่มเข้าใจว่าโหลดเซลล์ทำงานยังไง และเริ่มพัฒนาซอฟต์แวร์ได้ทันที นี่เป็นโปรเจกต์ Arduino โปรเจกต์แรกของพี่ เลยใช้เวลาพอสมควรกว่าจะทำให้พื้นฐานมันทำงานได้! ขอบคุณทุกคนในส่วนที่ให้เครดิตงานด้วยนะ โปรเจกต์นี้คงไม่เกิดขึ้นถ้าไม่มีพวกเธอ!

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

พี่ยังตั้งใจจะเรียนรู้ SketchUp ด้วยการลองร่างเลย์เอาต์เบื้องต้นของโปรเจกต์ในซอฟต์แวร์โมเดล 3D อีกด้วย

โครงสร้างฮาร์ดแวร์-ซอฟต์แวร์

  • Arduino Uno: "สมอง" ของโปรเจคนี้ จัดการการอ่านค่าหนักแบบต่อเนื่องและควบคุมตรรกะการทำงานของเซอร์โว
  • โหลดเซลล์ & แอมป์ HX711: เป็น "สายวัด" ที่แม่นยำสำหรับตรวจจับว่าแมวตัวไหนกำลังยืนอยู่
  • มอเตอร์เซอร์โว (HiTec): เป็นกลไกทางกายภาพที่ไว้ใจได้สำหรับการปิด-เปิดฝาชามอาหาร
  • ปุ่มกดแบบ Momentary: เอาไว้กดเปิด-ปิดฝาชามด้วยมือเวลาจะเติมอาหาร
  • เบรดบอร์ด & จัมเปอร์ไวร์: ตัวช่วยจัดวงจรแบบชั่วคราวให้ต่อทุกอย่างได้โดยไม่ต้องบัดกรี ง่ายดี
  • แหล่งจ่ายไฟ 5V แยก: สำคัญมาก! ใช้จ่ายไฟให้เซอร์โวตัวใหญ่โดยเฉพาะ จะได้ไม่ไปทำลายเรกูเลเตอร์ใน Arduino

พี่ลองวาดภาพคร่าวๆ ใน SketchUp ฟรีๆ ก่อน เพื่อดูว่าอะไรจะวางตรงไหนได้บ้าง สุดท้ายก็สร้างฐานกับทางลาดแบบมีบานพับจากไม้เก่า แล้วยึดโหลดเซลล์ด้วยสลักเกลียว M5 กับ M6 ส่วนเซอร์โวตัวใหญ่ก็ยึดติดกับฐานไปเลย ขณะที่ยังใช้เบรดบอร์ดอยู่นี่แหละ พี่ก็พัฒนาซอฟต์แวร์ต่อได้ โดยเพิ่มสวิตช์กดและฝาชามอาหารจำลองที่ทำจากกระดาษแข็งเข้าไป พี่ต้องมีฝาจำลองนี่แหละเพื่อจะได้รู้ว่าเซอร์โวต้องหมุนไปกี่องศาถึงจะปิด-เปิดฝาชามได้เต็มที่ วิธีเปิดก็ง่ายๆ กดสวิตช์เลย พอเติมอาหารเสร็จแล้วก็กดสวิตช์อีกทีเพื่อปิด **ข้อควรระวังสำคัญ:** หลังจากติดตั้งโหลดเซลล์ในโครงสร้างจริงแล้ว ต้องคาลิเบรตโหลดเซลล์ใหม่ทุกครั้ง! และอีกเรื่อง พอเริ่มใช้เซอร์โวตัวใหญ่จริงๆ พี่ต้องใช้พาวเวอร์ซัพพลายแบบปรับค่าได้บนโต๊ะทำงานมาจ่ายไฟให้เซอร์โว (+5 VDC) โดยเฉพาะ เพราะกระแสที่เซอร์โวตัวใหญ่กินนี่อาจทำร้าย Arduino Uno ของเราได้ถ้าเอาไฟจากขา +5 VDC ของ Arduino ไปจ่าย!

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

โครงสร้างฐานกับเบรดบอร์ด - ต้องไปวัดตัวแมวมาก่อนว่าจะทำขนาดเท่าไหร่ดี!
ยกทางลาดขึ้นให้เห็นการติดตั้งโหลดเซลล์
ฝาชามอาหารจำลองที่ทำจากกระดาษแข็ง
ลิลลี่ (แมวตัวใหญ่) กำลังคุมงานพัฒนาอยู่ ส่วนถังนั้นเอาไว้จำลองน้ำหนักแมว (ใส่น้ำ/ตะกั่ว)

สุดท้ายพี่ก็เอาโปรโตไทป์ชุดเบรดบอร์ดนี่ไปทดสอบใช้งานจริงเลย ได้บทเรียนมาหลายอย่าง

1. เซอร์โวขยับเร็วเกินไป แมวตกใจเลย พอมันขยับครั้งนึง แมวไม่กล้าเข้าใกล้อีกแล้ว หลังจากหาข้อมูลในฟอรั่ม Arduino นานพักนึง ก็ไปเจอไลบรารี่เซอร์โวที่ควบคุมทั้งความเร็วและตำแหน่งได้ (VarSpeedServo.h แทน Servo.h) จัดไปวัยรุ่น!

2. ฟังก์ชัน "ปิดฝา" ต้องมีดีเลย์ก่อนจะปิด เหตุผลเดียวกัน แมวตกใจตอนฝาเริ่มปิดทันทีที่น้ำหนักบนโหลดเซลล์ลดลง (เช่น ถ้าแมวก้าวถอยหลังครึ่งก้าวเพื่อปรับท่า ฝาก็จะปิดเร็วปรี๊ด แมวก็กระโดดหนี) พี่เลยเพิ่มดีเลย์ 7 วินาทีก่อนปิด ซึ่งดูเหมือนจะเป็นจุดที่พอดี ปล่อยให้แมวขยับตัวได้นิดหน่อย แต่ก็ยังปิดได้ทันก่อนแมวอีกตัวจะมาแย่งกิน ของมันก็ดูน่ากลัวน้อยลงตอนขยับช้าลงแล้ว!

3. ทางลาดที่ใช้ชั่งน้ำหนักเจ้าเหมียวควรจะยาวกว่าที่พี่ทำไปอีกนิดนึง ไม่งั้นมันยืดตัวเอาหัวไปถึงชามได้โดยไม่ต้องขึ้นมาทั้งสี่ขาบนทางลาดเลย (ก็คือไม่ยอมเหยียบ Load Cell ไงน้อง!) ตอนแรกแมวก็กลัวเสียงเซอร์โว่และความสั่นสะเทือนน่ะนะ แต่พอชินแล้วมันก็เริ่มไว้ใจ แต่มันฉลาดมาก ยืดตัวไปดมชามได้โดยไม่ต้องขึ้นมาทั้งตัว พอไม่ยอมเหยียบ Load Cell ประตูก็ไม่เปิด ก็เลยกินข้าวไม่ได้ (ทางลาดยาวๆ เอาไว้ทำเวอร์ชั่นหน้าละกัน!)

ทดลองแบบ "สดๆ" บนเบรดบอร์ด เพื่อพิสูจน์ว่าแนวคิดนี้ใช้ได้จริง

อุปสรรคและบทเรียนที่ได้

ปัญหาที่แก้ไขยากที่สุดคือ "เซอร์โว่สั่นพล่าน" (Servo Chatter) โผล่มาตอนที่พี่เริ่มใช้เซอร์โว่ตัวใหญ่กับแหล่งจ่ายไฟแยก มันจะขยับแบบสุ่มๆ เล็กน้อยทุก 10-15 วินาที นี่แหละตัวการสำคัญที่ทำให้เจ้าเหมียว "ช็อคแตก" ไม่ยอมไว้ใจกลไกนี้ ไม่ว่าจะหิวแค่ไหนก็ตาม! พี่ไปเสิร์ชดูในฟอรั่มต่างๆ ต่างก็บอกว่าแหล่งจ่ายไฟน่าจะเป็นปัญหา พี่ก็มัวแต่ไปมั่วกับไฟอยู่นาน แล้วพี่สังเกตว่า เวลาที่โค้ดอยู่ในโหมดดีเลย์ หรือโหมดเปิดด้วยมือที่รอให้กดปุ่มอีกครั้งเพื่อปิด เซอร์โว่มันนิ่งสนิทเลย นี่แหละที่ทำให้พี่เริ่มคอมเมนต์ส่วนต่างๆ ของโค้ดออก จนในที่สุดก็เจอว่า การเรียกใช้ `scale.get_units()` นี่แหละตัวปัญหา! พี่เดาว่า อินเตอร์รัปต์หรืออะไรสักอย่างทำให้เกิดการเปลี่ยนแปลงความกว้างพัลส์แบบสุ่มๆ ขึ้นตอนนั้น วิธีแก้คือพี่ใช้คำสั่ง `detach()` Servo ก่อนเรียก `get_units()` พอได้ค่ามาแล้วค่อย `attach()` ใหม่ มันเวิร์คสุดๆ ไปเลย!

อีกปัญหานึงคือตอนแรกๆ ที่พี่เพิ่มปุ่มกดสำหรับเปิดเครื่องให้อาหารด้วยมือ มันมีปัญหา "เด้ง" ของสวิตช์ (Switch Bounce) สุดท้ายพี่แก้แบบง่ายๆ ด้วยการใส่ดีเลย์สั้นๆ หลังจากอ่านค่าจากปุ่มนั่นแหละ มันก็หาย! ไม่รู้ว่านี่คือวิธีที่ "ถูกต้อง" ในการจัดการ Switch Bounce หรือเปล่า แต่สำหรับโปรเจคนี้ที่เรื่องเวลาการันตีไม่สำคัญ พี่ก็จัดไปแบบนี้แหละ!

ผลงานชิ้นโบว์แดง

ถึงแม้ว่าตอนนี้พี่ยังมองว่านี่เป็นแค่ต้นแบบ (Prototype) แต่มันก็ทำงานได้เต็มที่และ "ประจำการ" เรียบร้อยแล้ว ภาพด้านล่างคือสถานะปัจจุบันของโปรเจค

เพิ่มฝาครอบ Lexan (เทปสีฟ้าทำให้เห็นง่ายเวลาอัดวิดีโอ จะได้ดูว่ามันทำงานยังไง!)
ปุ่มสวิตช์เปิดด้วยมือ (มองเห็นยากหน่อยเพราะติดอยู่กลางกล่องสีดำ)
แผ่นกระดาษแข็งด้านข้างคอยกันไม่ให้ลิลลี่แอบเข้ามาทางข้างๆ โดยไม่ไปเหยียบ Load Cell
ตัวอย่างการทำงาน - แมวสีขาวคือจอร์จตัวเล็ก, แมวสีดำคือลิลลี่ตัวใหญ่ สังเกตว่าลิลลี่ยังกระโดดหนีทุกครั้งที่เซอร์โว่ทำงาน เพราะระบบเพิ่งเปิดใช้ได้ประมาณ 1 สัปดาห์เอง

แผนอัพเกรดในอนาคต

อัพเกรดที่พี่กำลังคิดๆ ไว้:

1. สร้างชุดชั่งน้ำหนักอีกชุดสำหรับแมวอีกตัว แล้วเขียนโค้ดเพิ่มให้ระบบเปิดชามอาหารได้เฉพาะแมวตัวเล็กเท่านั้น [สำหรับใครที่กังวลว่าจอร์จจะกินข้าวยังไง ไม่ต้องห่วงนะ พี่เอาอาหารของจอร์จใส่กล่องใหญ่ที่มีรูที่ลิลลี่ตัวใหญ่ลอดไม่เข้า มันกินได้เต็มที่ตลอดเวลา!]

2. เอาความสามารถ WiFi เข้ามาเล่นด้วย แล้วให้ระบบบันทึกน้ำหนักแมวลงไฟล์ในเครือข่ายของพี่ จะได้รู้ตัวตอนที่ลิลลี่ (Lily) ถึงน้ำหนักเป้าหมายไง

3. หรือไม่ก็ทำให้มันทำข้อ 2 ได้ แต่ให้ข้อมูลไปแสดงบนแอปในมือถือพี่เลย!

4. เพิ่มฮอปเปอร์กับระบบตวงวัด เพื่อแจกจ่ายอาหารอัตโนมัติซะเลย!

ไอเดียสำหรับอนาคต (ถ้ามีเวลาว่างจากงาน)

  • เชื่อมต่อกับแดชบอร์ดข้อมูลแบบไร้สาย: ใส่โมดูล WiFi (เช่น ESP8266) เพื่อบันทึกน้ำหนักแมวและเหตุการณ์การให้อาหาร ขึ้นไปยังคลาวด์หรือแดชบอร์ดในเครือข่ายบ้าน สำหรับตรวจสอบจากที่ไหนก็ได้
  • ประสานงานเซนเซอร์หลายตัว: ใส่เซนเซอร์ตรวจจับการเคลื่อนไหว (PIR) เพื่อรู้ว่าแมวกำลังจะมา อาจใช้ปลุกระบบจากโหมดประหยัดพลังงาน หรือเก็บข้อมูลพฤติกรรมเพิ่มเติม
  • ปรับแต่งโปรไฟล์ขั้นสูง: ใส่ลอจิกที่ฉลาดขึ้นเพื่อติดตามระยะเวลากิน ปริมาณที่กิน (โดยใส่โหลดเซลตัวที่สองไว้ใต้ชาม) และปรับตารางการให้อาหารอัตโนมัติ

[!IMPORTANT] ข้อควรระวังเรื่องไฟและการปรับเทียบ: มอเตอร์เซอร์โวตัวใหญ่ต้องการแหล่งจ่ายไฟ 5V แยกต่างหาก เพื่อป้องกันไฟตก (brownout) หรือเสียหายต่อ Arduino จัดการเรื่องไฟให้ดีนะน้อง และอย่าลืมปรับเทียบโหลดเซล (tare และ scale factor) ให้ครบทุกครั้งหลังประกอบชิ้นส่วนเครื่องกลเสร็จ เพราะแรงกดจากการยึดอาจทำให้จุดศูนย์ของเซนเซอร์เพี้ยนได้

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

apps:
  - "1x Arduino IDE"
author: "jaustin2930"
category: ""
components:
  - "1x Load Cell & HX711"
  - "1x Dual DC Power Supply: 5vdc @ 1.5A & 9vdc @ 1.5v"
  - "1x HiTec RCD 33755S HS-755HB Karbonite Giant Scale Servo"
  - "1x Arduino UNO"
description: "ระบบให้อาหารแมวอัจฉริยะที่คอยปกป้องอาหารของน้องแมวเจ้าเล่ห์ (ที่ต้องควบคุมอาหาร) ไม่ให้เพื่อนร่วมบ้านจอมตะกละมากินซะหมด! ใช้เซนเซอร์ตรวจจับ + มอเตอร์ขับล็อก ถ้าแมวจอมตะกละมาใกล้...ระบบจะอินเตอร์รัพต์ทันที! งานง่ายแต่หล่อ วัยรุ่นวิศวะต้องจัดไป"
difficulty: "Intermediate"
documentationLinks: []
downloadableFiles:
  - "https://projects.arduinocontent.cc/5643bdf0-2c5c-49fe-9bc9-5e79ceb7d57e.ino"
  - "https://projects.arduinocontent.cc/7583c06c-a431-4464-ab3d-66b3e5317545.ino"
encryptedPayload: "U2FsdGVkX19pcS52vSBqYyk6qlASSfXF8IlZo3C88g9LVKpM5adFjRHWhFSyTHIjhb9DbGFeBD0TBFZEBkG8M0568KG0kk3OVvkz7sJsN3Y="
heroImage: "https://cdn.jsdelivr.net/gh/bigboxthailand/arduino-assets@main/images/projects/fat-cat-food-guardian-ad8ad0_cover.jpg"
lang: "en"
likes: 1
passwordHash: "2f5f1303a680c061eff24897014bf0840d158a7b73a6bf6b5be1fee44a8eda72"
price: 1120
seoDescription: "Smart Arduino pet feeder to protect dietary food from greedy cats. A perfect DIY project for multi-pet households."
tags:
  - "home automation"
  - "smart appliances"
  - "smart appliances"
  - "pets"
title: "ระบบเฝ้าอาหารแมวอ้วน กันน้องจอมตะกละแบบตึงๆ!"
tools: []
videoLinks:
  - "https://www.youtube.com/embed/SHaIIWN7iF8"
views: 1758