กลับไปหน้ารวมไฟล์
snacks-vending-machine-powered-by-arduino-46554c.md

Intro

ว่าไงน้อง! สวัสดีจากอินโดนีเซียจ้า

เครื่องขายขนมกะทัดรัดตัวนี้คือโปรเจคจบของพี่เองจ่ะ จริงๆ มันเสร็จไปตั้งแต่ปลายปี 2015 แล้วแหละ

เป้าหมายของโปรเจคนี้คือการสร้างเครื่องขายขนมที่ใช้ไมโครคอนโทรลเลอร์ Arduino เป็นสมองบังคับ โดยใช้อุปกรณ์ที่ "หาง่าย ราคาถูก" ตามร้านค้าท้องถิ่นให้มากที่สุด

เป้าหมายหลัก (Goals): เครื่องต้อง รับเงินเหรียญได้ตามจำนวนที่กำหนด ก่อนจะให้ลูกค้าเลือกสินค้า และสุดท้ายก็ต้องส่งสินค้าออกมาได้.

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

Snack Vending Machine FINAL TESTING

โอเค! มาดูกันดีกว่าว่าพี่ทำยังไงถึงไปถึงจุดนั้นได้

Step 1: วาดภาพคร่าวๆ ของแนวคิด (Sketch the concept)

ก่อนจะลงมือทำอะไร ต้องคิดก่อนว่า แนวคิด (Concept) ของเราคืออะไร

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

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

สเก็ตช์และแนวคิดแรกสุดของพี่

ลองวาดทุกอย่างออกมาเลยน้อง อย่ากลัวว่าภาพวาดจะไม่สวย ดูตัวอย่างจากภาพพี่สิ :D

เวลาที่เหมาะที่สุดในการคิดถึงเรื่องที่คิดไม่ถึง คือก่อนที่โปรเจคจะเริ่มซะอีก

Step 2: สร้างโมเดล 3D (Create 3D Model)

ขั้นตอนนี้อาจไม่จำเป็นสำหรับทุกคน แต่สำหรับพี่และโปรเจคนี้ มันสำคัญมาก

โมเดล Solidworks ของพี่สำหรับโปรเจคนี้

พี่สร้างโมเดลใน Solidworks แบบจริงจัง และหมายถึงโมเดลที่เสร็จสมบูรณ์ทุกส่วนเลยนะ พี่ต้องกำหนดขนาดของสินค้า ซึ่งในที่นี้คือห่อขนม ขนาดของเหรียญที่รับได้ ขนาดของเหรียญที่ปฏิเสธ ขนาดของช่องหยอดเหรียญ ขนาดของรางเหรียญ ขนาดของปุ่มกด ขนาดของเกือบทุกอย่าง ขั้นตอนนี้รวมถึงการเปรียบเทียบ เลือก และวัดขนาดของ Arduino Microcontroller ที่ใช้ด้วย ว่าจะใช้เซ็นเซอร์อะไร หรืออาจจะใช้ในอนาคต วางตรงไหน ขนาดเท่าไหร่ เหรียญที่รับได้จะไปอยู่ที่ไหน พี่ยังคิดถึงว่าจะวางจอ LCD ขาวดำไว้ตรงไหนดี (ไม่จำเป็นแต่พี่อยากใส่)

และสุดท้าย ขณะที่สร้างโมเดล Solidworks อย่าลืมเจาะรูสกรูสำหรับทุกชิ้นส่วนด้วยล่ะ

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

Step 3: ออกแบบช่องหยอดเหรียญ (Design a Coin Slot)

ในการกรองเหรียญ ขั้นแรกพี่ใช้ขนาดของเหรียญเป็นเกณฑ์ โดยการออกแบบช่องหยอดเหรียญ (slot coin) พี่สามารถกำหนดได้ว่า เหรียญขนาดไหนที่อนุญาตให้เข้าเครื่องได้.

จากนั้น กรองขั้นที่สอง พี่กำหนดว่า เหรียญขนาดไหนที่อนุญาตให้รับได้และกลิ้งลงไปยังที่เก็บเหรียญ (coin holder).

เพราะด้วยแรงโน้มถ่วง ถ้าเส้นผ่านศูนย์กลางของเหรียญเล็กกว่าความยาวของรางเหรียญ (coin ramp/track) มันก็จะตกลงไปและถูกปฏิเสธ

ออกแบบช่องหยอดเหรียญเพื่อกรองเหรียญตามขนาด
  • เหรียญทางซ้ายในรูป จะเข้าไปในช่องหยอดเหรียญไม่ได้เลย
  • เหรียญตรงกลาง จะตกลงมาแล้วถูกตีกลับ
  • เหรียญทางขวาคือเหรียญที่ผ่านเกณฑ์ จะไหลลงไปยังที่เก็บเหรียญ

นี่คือวิดีโอตอนที่พี่ทดลองหยอดเหรียญ จะได้เห็นภาพเลยว่าวิธีนี้มันทำงานยังไง

Filtering coin based on its dimension using coin slot

ขั้นตอนที่ 4: เตรียมและทดสอบทุกชิ้นส่วน

Arduino Uno and stuff

จัดเตรียม Arduino ของน้องให้พร้อม เอาทุกอย่างที่ต้องใช้มาวางไว้ให้หมด

LCD testing

ทดสอบทุกชิ้นส่วนเลย LCD ปุ่มกด รีเลย์ LED ลองเอามาต่อรวมกัน เรียนรู้ logic กับการเขียนโค้ดแบบต่างๆ ให้แน่ใจว่าน้องเข้าใจสิ่งที่ตัวเองทำ ลองทดสอบไปจนถึงขีดจำกัด หาขีดจำกัดเจอ แต่ห้ามทำพังนะตัวนี้

ทำไมต้องใช้ตัวต้านทาน (Resistor) ถ้าไม่ใช้จะเกิดอะไรขึ้น ทำไมค่าจากเซ็นเซอร์ถึงไม่นิ่ง ค่าที่เซ็นเซอร์อ่านได้จริงๆ คืออะไร ฯลฯ พี่ทดลองแล้วพบว่าค่าจากเซ็นเซอร์วัดระยะ (proximity sensor) มัน "ไม่สะอาด" ต้องใส่ตัวต้านทานเพิ่มเพื่อให้มันนิ่งลง

Isolate around the receiver part of infrared sensor

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

ขั้นตอนที่ 5: สร้างกลไกสปายา (Spiral mechanism)

นี่คือหนึ่งในส่วนที่สำคัญที่สุดของตู้กดสินค้าเลยนะ กลไกการส่งสินค้า

พี่ใช้กลไกแบบสปายา โดยใช้ลวดอลูมิเนียม (เส้นผ่านศูนย์กลางลวด 2 มม.) ดัดเป็นเกลียวด้วยมือโดยใช้ท่อ PVC เส้นผ่านศูนย์กลาง 9 ซม. เป็นแม่แบบ

ลวดสปายาถูกยึดติดกับล้อโดยใช้สายรัด เมื่อเปิดมอเตอร์ DC ล้อจะหมุน และลวดสปายาก็จะหมุนตาม

การหมุนของสปายานี้ แปลงการเคลื่อนที่แบบหมุนเป็นการเคลื่อนที่แบบเส้นตรง ของสินค้า

รายละเอียดเทคนิคเพิ่มเติม: Kinematics ของสปายา (FS90R Servos)

เซอร์โวแบบ 180 องศาทั่วไปไม่สามารถดันขนมออกมาได้ โปรเจคนี้ใช้หลักการคล้ายๆ กันกับมอเตอร์ DC ในเซ็ตอัพที่ซับซ้อนขึ้น น้องสามารถใช้ **เซอร์โวแบบหมุนต่อเนื่อง FS90R หรือ MG996R** ได้ สปายาที่พิมพ์จากเครื่องพิมพ์ 3D หรือทำจากลวดหนา (หรือที่เรียกว่า "Auger") จะถูกยึดติดกับแขนเซอร์โว โปรโตคอลการจ่ายสินค้าในโค้ดจะสั่งให้เซอร์โวตัวที่ต้องการทำงาน สำหรับเซอร์โวหมุนต่อเนื่อง คำสั่ง `servo.write(180);` หมายถึง "หมุนไปข้างหน้าด้วยความเร็วสูงสุด" ไม่ใช่ "ให้ไปที่ตำแหน่ง 180 องศา" หลังจาก `delay(1500);` เพื่อให้สปายาหมุนครบรอบแล้ว คำสั่ง `servo.write(90);` คือคำสั่งทางคณิตศาสตร์สำหรับ "หยุด"

ขั้นตอนที่ 6: สร้างกลไกตรวจจับเหรียญ (Coin Identifying Mechanism)

รูปแรกคือเซ็นเซอร์เหรียญหมายเลข 1 มันใช้เซ็นเซอร์ตรวจจับความใกล้ หรือเซ็นเซอร์แม่เหล็กไฟฟ้าเหนี่ยวนำ เมื่อเหรียญที่ยอมรับได้ผ่านเซ็นเซอร์นี้ มันจะส่งสัญญาณให้ Arduino เริ่มจับเวลา (หน่วยมิลลิวินาที) สู้งานนะน้อง!

if sensor1 triggered then start counting time in millisecond 

และเมื่อเหรียญที่ยอมรับได้ผ่านเซ็นเซอร์เหรียญหมายเลข 2 ซึ่งเป็นเซ็นเซอร์ตัดระยะ Arduino จะหยุดจับเวลา และได้เวลาที่เหรียญนั้นๆ ใช้เดินทางจากเซ็นเซอร์หมายเลข 1 ถึงหมายเลข 2 มาเก็บไว้

if sensor2 triggered then stop counting time in millisecond. "travel times" is xxx millisecond 
การติดแม่เหล็กไว้ข้างทางลาดเหรียญ ช่วยให้เราจำแนกได้ระหว่างเหรียญที่ไม่ได้รับผลจากสนามแม่เหล็ก กับเหรียญที่โดนสนามแม่เหล็กดูด เหรียญที่โดนดูดจะกลิ้งช้าลงหน่อย (ประมาณ 300 ถึง 500 มิลลิวินาที) แต่มันก็ขึ้นอยู่กับว่าเราเอาแม่เหล็กไปติดไว้กี่อันด้วยแหละ อย่าลืม!

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

if "travel times" more than or equal to "yyy" millisecond, then its "aaa" coin, else it is "bbb"

รายละเอียดเทคนิคเพิ่มเติม: การคัดเลือกเหรียญแบบอุตสาหกรรม (The Comparator)

โปรเจคนี้ใช้วิธีกลไกและการจับเวลาที่ฉลาดๆ แต่วิธีแบบอุตสาหกรรมจริงจังกว่านั้นจะใช้ โมดูลรับเหรียญอิเล็กทรอนิกส์ (Electronic Coin Acceptor Module) (เช่นรุ่น CH-926) โมดูลนี้จะประเมินคุณสมบัติทางกายภาพของเหรียญแบบเป๊ะๆ ทั้งเส้นผ่านศูนย์กลาง ความหนา และองค์ประกอบโลหะผสม ด้วยความเร็วสูง ถ้าเหรียญที่ถูกต้องถูกหย่อนลงมา โมดูลรับเหรียญจะส่งพัลส์ไฟฟ้า 5V จำนวนหนึ่งลงสายสัญญาณอย่างรวดเร็ว (เช่น หนึ่งพัลส์สำหรับเหรียญ 1 ดอลลาร์, ห้าพัลส์รัวๆ สำหรับเหรียญ 25 เซนต์) Arduino ต้องใช้ฟังก์ชัน `attachInterrupt(..., FALLING)` เพื่อจับพัลส์เหล่านี้ แล้วเพิ่มมูลค่าที่ถูกต้องลงในตัวแปร `creditBalance` ภายใน

นี่คือวิดีโอตอนที่พี่ทดสอบวิธีนี้ ใช้แม่เหล็กในการจำแนกเหรียญ

การจำแนกเหรียญโดยใช้เซ็นเซอร์ตรวจจับความใกล้, เซ็นเซอร์อินฟราเรด และแม่เหล็ก

ขั้นตอนที่ 7: สร้างกลไกตรวจจับสินค้า (Product Detection Mechanism)

พี่ใช้เซ็นเซอร์อินฟราเรด 3 ตัว สำหรับตรวจจับสินค้าตอนที่มันตกลงมา หลังจากถูกดัน/เคลื่อนที่โดยกลไกสกรู (Spiral Mechanism)

เซ็นเซอร์อินฟราเรดสามตัวสำหรับตรวจจับสินค้า

เมื่อสินค้าตกลงมา มันจะไปกดเซ็นเซอร์อินฟราเรด ส่งสัญญาณ OFF ไปยังมอเตอร์ DC (ผ่านรีเลย์)

สรุปง่ายๆ ก็คือ เราอยากให้ตอนสินค้าตกลงมา กลไกสปริงให้หยุดหมุนซะ

คลิปนี้จะแสดงให้เห็นว่าระบบตรวจจับสินค้าทำงานยังไงในตู้กดนี้

คลิปทดสอบระบบตรวจจับสินค้า

ขั้นตอนที่ 8: ใช้ LCD แสดงข้อมูล

LCD แสดงข้อมูลและคำแนะนำ

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

ตอนเปิดเครื่อง

  • หน้าจอหลัก = "กรุณาใส่เหรียญ"
  • ถ้าใส่เหรียญ = "แสดงมูลค่าเหรียญ และยอดรวมทั้งหมด"
  • ถ้าไม่ใส่เหรียญ = คงหน้าจอหลักไว้

หลังจากตรวจจับเหรียญสำเร็จ

  • ถ้ายอดรวมมากกว่าหรือเท่ากับราคาสินค้า = "กรุณาเลือกสินค้า"
  • ถ้ายอดรวมน้อยกว่าราคาสินค้า = "กรุณาใส่เหรียญเพิ่ม"

หลังจากเปิดกลไกสปริง (เริ่มจ่ายสินค้า)

  • ถ้าระบบตรวจจับสินค้าทำงาน = "ขอบคุณครับ/ค่ะ" การทำรายการเสร็จสิ้น
  • หน่วงเวลา แล้วกลับไปที่หน้าจอหลัก

ขั้นตอนที่ 9: จบงานและทดสอบ

ในที่สุด ตู้กดขนม DIY ก็เสร็จสมบูรณ์ ;)

หลังจากผ่านไปประมาณ 3 เดือน พี่ก็พร้อมที่จะทำการทดสอบขั้นสุดท้ายกับเครื่องนี้แล้ว ตั้งแต่ทดสอบการชำระเงิน/เหรียญ การเลือกสินค้า ไปจนถึงการส่งมอบสินค้า

นี่คือคลิปวิดีโอทดสอบขั้นสุดท้ายของตู้กดขนม:

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

apps:
  - "1x Arduino IDE"
  - "1x Solidworks"
author: "Sevenmojoe"
category: "Home & Automation"
components:
  - "3x DC Motor 6V include Wheel"
  - "1x Relay (generic)"
  - "3x Push Button"
  - "1x Arduino UNO"
  - "1x Sensor Shield"
  - "2x LED (generic)"
  - "1x Power Supply 6V for DC motor"
  - "1x Distance interupter (infrared/optocoupler) sensor, used for coin sensor number 2"
  - "3x Infrared (reflective) or line follower sensor, used for product detection"
  - "1x Proximity (electromagnetic) sensor, used for coin sensor number 1"
  - "1x LCD (Nokia 5110 LCD)"
description: "Create a Vending Machine, powered by Arduino microcontroller, using \"any cheap and easy to get\" components available in local store."
difficulty: "Intermediate"
documentationLinks: []
downloadableFiles: []
encryptedPayload: "U2FsdGVkX193rF+r0lR+TxlPLRs0QJAcEsX7QDw/qLhdsBWnClGyy/vA1AdbxZL7/W8V3WcRJmcJ2DIM3k15KOS8vRMztf0q/NeHJsp1qP3xZb5GZSpbMsIGqy9ICDBN"
heroImage: "https://cdn.jsdelivr.net/gh/bigboxthailand/arduino-assets@main/images/projects/snacks-vending-machine-powered-by-arduino-46554c_cover.jpg"
lang: "en"
likes: 69
passwordHash: "4fa10f0dab47a3b3f1acf3d88af399099d0e03b24b70d5eaf92574d8245a0230"
price: 699
seoDescription: "Build a DIY Snacks Vending Machine using Arduino and affordable local components. Easy-to-follow guide for makers and students."
tags:
  - "vending"
  - "vending machine"
title: "ตู้หยิบขนมเทพๆ ด้วย Arduino งานง่ายแต่หล่อ!"
tools: []
videoLinks:
  - "https://www.youtube.com/embed/6qPCrWp8L4s"
  - "https://www.youtube.com/embed/yDRFBDbLNp0"
  - "https://www.youtube.com/embed/7RXVzYR_HE0"
  - "https://www.youtube.com/embed/VHj58T4UYEo"
  - "https://www.youtube.com/embed/6qPCrWp8L4s"
views: 59202