IoT — ควบคุมหลอดไฟ LEDs ด้วย Raspberry Pi เมื่อพบการเคลื่อนไหว
สังเกตกันไหมครับว่ากล้องวงจรปิดทุกวันนี้จะมีระบบการแจ้งเตือนเข้ามาที่โทรศัพท์มือถือของเรา เมื่อตรวจพบการเคลื่อนไหวผ่านหน้ากล้อง ซึ่งเทคโนโลยีที่อยู่เบื้องหลังการทำงานของมันก็คือเจ้าเซนเซอร์ตรวจจับการเคลื่อนไหวหรือที่เรียกว่า PIR Motion Sensor นี่แหละครับ
สวัสดีนะค้าบ ในบทความนี้อันจะสาธิตพร้อมอธิบายวิธีการนำ Raspberry Pi มาควบคุมการเปิด-ปิดหลอดไฟ LED ตัวจิ๋ว เมื่อเจ้าเซนเซอร์นั้นตรวจพบการเคลื่อนไหว ก่อนอื่นเลย…เรามารับชมวีดีโอการทดลองกันดีกว่าว่ามันทำงานยังไง
5
.
.
.
4
.
.
.
3
.
.
.
2
.
.
1
เรามาทำความรู้จักอุปกรณ์ที่ต้องใช้นอกเหนือจากเจ้า Raspberry Pi กันก่อนดีกว่า
โพรโทบอร์ด (Breadboard)
เจ้าโพรโทบอร์ดเป็นอุปกรณ์ที่เข้ามาช่วยให้เราสามารถเชื่อมต่อวงจรเพื่อใช้ในการทดลองแบบชั่วคราว (ไม่ค้างคืนนะ ฟร้ิววว…😬) ได้อย่างง่ายดายมั่ก ๆ คือแค่จิ้มสายลงไปอะ แล้วมันก็แบบรู้จักกันเลย เวลาจะไม่คุยกันแล้วก็แค่ถอดสายออก นี้มันสุดยอดนวัตกรรมชัด ๆ 🌟 โดยเจ้าหนี้ เอ้ย! เจ้านี่จะมีรูจำนวนมาก ภายใต้รูเหล่านั้นมันก็จะมีการเชื่อมต่อถึงกันอย่างมีรูปแบบ พอเรานำอุปกรณ์อิเล็กทรอนิกส์มาเสียบ จะทำให้พลังงานไฟฟ้าสามารถไหลจากอุปกรณ์หนึ่งไปยังอุปกรณ์หนึ่งได้
ถาม: แล้วมันเชื่อมต่อยังไงจุดตั้งเยอะแยะ จะจิ้มรูไหนเนี่ย?
ตอบ: จากรูปให้สังเกตตัวอักษรด้านบนโดยเริ่มจากสีสัญลักษณ์บวกลบ (+, -) โดยที่สีแดงจะหมายถึงขั้วบวก และสีดำหรือสีน้ำเงินจะหมายถึงขั้วลบ แนวการเชื่อมต่อจะเป็นแนวนอน หมายความว่าอะไร? หมายความว่าถ้าเรามีการนำไฟจากแหล่งจ่ายไฟ (Power Supply) มาพักไว้ที่ขั้วบวก (+) ที่ช่องใดช่องหนึ่ง สิ่งที่เกิดขึ้นคือทุกช่องตลอดแนวนอนนั้นจะมีไฟเลี้ยง เช่นกันกับขั้วลบ (-) ถ้ามีการต่อสายดิน (Ground) เข้ามาที่ช่องใดช่องหนึ่ง ทุกช่องตลอดแนวนอนก็จะทำหน้าที่เป็นสายดินนั้นเองสัญลักษณ์ตัวอักษร abc จะเป็นแนวการเชื่อมต่อแบบแนวตั้ง หมายความว่าอะไร? หมายความว่า a1 สามารถเชื่อมต่อได้เฉพาะในแถวเดียวกันในแนวตั้งเท่านั้น นั้นก็คือ b1, c1, d1, e1 ไม่สามารถเชื่อมต่อข้ามไป a2, a3, a4, …, a30 ได้ เช่นเดียวกับ f1 ก็จะสามารถเชื่อมต่อกับ g1, h1, i1, j1 ได้ แต่ไม่สามารถเชื่อมข้ามไป f2, f3, f4, …, f30 ได้
ลองดูภาพปลากรอบได้ที่นี่
อุ้ย! โทษ ๆ ภาพประกอบ ๆ
สายต่อวรจรแบบผู้-เมีย (Male to Female Jumper Wire)
และนี่ก็คือหน้าตาของมันนี่เองงงง…
ถาม: มันมีหน้าที่ไว้ทำอะไร?
ตอบ: เราจะใช้ไอเจ้านี่มาเชื่อมต่อวงจรระหว่าง Raspberry Pi กับอุปกรณ์อิเล็กทรอนิกส์ต่าง ๆ เช่น โพรโทบอร์ด เซนเซอร์ PIR เป็นต้น โดยผ่านทาง GPIO ดังที่ได้อธิบายไปเบื้องต้นในบทความที่แล้ว และเพื่อเป็นการไม่เสียเวลาเรามาทำความเข้าใจเพิ่มเติมสำหรับ GPIO บน Raspberry Pi กันดีกว่า
จูกราก เฮ้ย! จากรูปเราจะเห็นว่าบนตัวบอร์ดของ Pi นั้นจะมีทั้งหมด 40 PINs เลยทีเดียว โดยที่ PIN หมายเลข 1 และ 17 นั้นจะจ่ายไฟขนาด 3V3 ในขณะที่ 2 และ 4 จ่ายไฟไปที่ 5 โวลต์ (V) นอกจากนี้จะเห็นว่าหมายเลข 6, 9, 14, 20, 25, 30, 34, 39 ทำหน้าที่เป็นสายดินหรือที่เรียกกันว่า Ground นั้นเอง ส่วนหมายเลขอื่น ๆ ที่มีคำว่า GPIO นำหน้านั้น จะเป็น PIN ที่เราสามารถนำมาต่อเข้ากับอุปกรณ์เพื่อใช้ในการควบคุมนั้นเอง ยกตัวอย่างเช่น ถ้าเราจะต่อเซนเซอร์ PIR รับสัญญาณเข้ามา (Input) ที่ GPIO 4 ก็ต่อเข้าไปที่ PIN หมายเลข 7 ของบอร์ด
หลอดไฟ LEDs
ตัวหลอดไฟมีขนาด 3 และ 5 มิลลิเมตร (mm) จะมีขา 2 ข้าง ขาสั้นเพื่อรับสัญญาณลบ ขายาวเพื่อรับสัญญาณบวก รับไฟอยู่ที่ 1.8–2.2 โวลต์ (VDC) และนี่ก็คือหน้าตาของมัน
ตัวต้านทาน หรือ รีซิสเตอร์ (Resistor)
สังเกตว่าบน Raspberry Pi สามารถปล่อยกำลังไฟได้ที่ 3V3 และ 5 โวลต์
ถาม: จะเกิดอะไรขึ้นถ้าเรานำไฟไปต่อตรงกับเจ้าหลอดไฟ LEDs ที่รับไฟเต็มที่อยู่ที่ 2.2 โวลต์❓
ตอบ: มันก็ไหม้ดิเพื่อน 🔥ใช่แล้วครับมันก็จะพังไงครับ เราจึงต้องมีตัวต้านทานเข้ามาเป็นตัวคั่นกลางระหว่างเรา 😢
ซึ่งตัวต้านทานก็มีหลายขนาดเช่นกันขึ้นอยู่กับการเลือกใช้งาน โดยจะมีสูตรในการคำนวณว่าควรจะใช้ตัวต้านทานขนาดเท่าไรถึงจะป้องกันไม่ให้อุปกรณ์อิเล็กทรอนิกส์เสียหาย ถามว่าคำนวณยังไง? แนะนำให้เข้าไปอ่านที่นี่ได้เลยเค้าอธิบายได้ดีเลยทีเดียว
เซนเซอร์ตรวจจับการเคลื่อนไหว (PIR Motion Sensor)
และแล้วก็มาถึงคิวของพระเอกของเราในเรื่องนี้ คำว่า PIR เนี่ยมาจากตัวย่อว่า Passive infra-red sensor หรือความหมายโดยตรงก็คือ เซนเซอร์ตรวจจับการเคลื่อนไหวผ่านคลื่นอินฟราเรด โดยมันจะจับคลื่นอินฟราเรดที่แพร่มาจากมนุษย์ หรือสัตว์ที่มีการเคลื่อนไหว เรามักจะพบเจอในกล้องวงจรปิด หรือการเปิด-ปิดไฟอัตโนมัติเมื่อมีการเดินผ่านมา และผ่านไป…
หน้าตาของมันก็จะหล่อประมาณนี้
ถ้าเปิดโดมสีขาวออกก็จะเห็นตัวเซนเซอร์หน้าตาแบบนี้
เรามาเริ่มกันเลยดีกว่า!
อันจะเริ่มจากต่อไฟ 5V และสายดิน (Ground) จาก Raspbery Pi เข้าไปที่ Breadboard ก่อน โดยใช้ PIN หมายเลข 4 และ 6 ตามลำดับ
จากนั้นนำหลอดไฟ LEDs ทั้ง 3 หลอดเสียบเข้าไปที่โพรโทบอร์ด เริ่มจาก
ตัวที่ 1: อยู่ระหว่างช่อง b5 (ขาสั้น) และ b7 (ขายาว)
ตัวที่ 2: อยู่ระหว่างช่อง b10 (ขาสั้น) และ b12 (ขายาว)
ตัวที่ 3: อยู่ระหว่างช่อง b15 (ขาสั้น) และ b17 (ขายาว)
ทำการเชื่อมต่อตัวต้านทาน (Resistor) ระหว่างสายดินกับขาขั้วลบ (ขาสั้น) ของตัวหลอดไฟ
เนื่องจากเราจะควบคุมหลอดไฟ 3 ตัว จึงต้องใช้สายวงจร 3 เส้นต่อเข้ากับขาขั้วบวก (ขายาว) ของตัวหลอดไฟเพื่อจ่ายกระแสไฟและใช้ในการควบคุมการทำงาน โดยที่
ตัวที่ 1: ใช้ GPIO 4 หรือ PIN หมายเลข 7
ตัวที่ 2: ใช้ GPIO 20 หรือ PIN หมายเลข 38
ตัวที่ 3: ใช้ GPIO 21 หรือ PIN หมายเลข 40
ได้เวลาเชื่อมต่อเซนเซอร์ตรวจจับการเคลื่อนไหว ซึ่งเป็นพระเอกของเรา โดยจากรูป
จะเห็นว่าจะต้องใช้สายวงจร 3 เส้น โดยที่
เส้นที่ 1: ต่อไฟจาก Breadboard เข้ามาที่ช่อง 5V
เส้นที่ 2: ต่อสายดิน (Ground) จาก Breadboard เข้าที่ช่อง GND
เส้นที่ 3: ต่อสายวงจรจาก Raspberry Pi เพื่อควบคุมการทำงาน โดยเราจะใช้ GPIO 26 หรือ PIN หมายเลข 37 เชื่อมเข้ามาที่ช่อง OUT
เมื่อเชื่อมต่อทุกอย่างเสร็จเรียบร้อยแล้วจะได้หน้าตาหล่อประมาณนี้
เริ่มเขียนโปรแกรมสั่งงานกันเถอะ!
เราจะใช้ภาษา Python ในการควบคุมการทำงานของวงจร ก่อนอื่นเลยต้องกำหนดค่าเริ่มต้นของ GPIO แต่ละช่องที่ต่ออยู่ว่าจะรับหน้าท่ี่เป็น Input หรือ Output โดยที่ GPIO ที่ต่อเข้ากับหลอดไฟ LED นั้นจะถูกกำหนดเป็น Output และตัวเซนเซอร์นั้นจะถูกกำหนดเป็น Input
สร้างฟังก์ชั่น (Function) ในการทำงานเปิดปิดหลอดไฟ โดยส่งค่า GPIO.HIGH เพื่อใช้ในการเปิด ในขณะที่ส่งค่า GPIO.LOW เพื่อใช้ในการปิด
ฟังก์ชั่น (Function) ต่อมาจะเป็นส่วนหลักในการสั่งให้หลอดไฟสลับกันเปิดทีละ 0.3 วินาทีวนไปเรื่อย ๆ
และนี่ก็คือฟังก์ชั่นสำหรับสั่งหยุดการทำงาน
ส่วนหลักของโปรแกรมจะเริ่มตรงนี้ครับ เริ่มต้นที่ตัวเซนเซอร์จะรอการเคลื่อนไหว (เหมือนสิงโตที่รอพะงาบเหยื่ออยู่กลางทุ่ง) เมื่อตัวเซนเซอร์ตรวจพบ (เจอเหยื่อแล้ว) จะสั่งให้หลอดไฟ LED ทำงาน (พะงาบเหยื่อ) และจะรอสภาวะการหยุดนิ่งจึงจะสั่งให้หลอดไฟ LED หยุดทำงาน จากนั้นก็กลับมารอการเคลื่อนไหวใหม่
คำถาม: แล้วทำไมถึงต้องใช้ Thread ด้วย❓ 🤔
ตอบ: คำถามที่ดีครับ สังเกตฟังก์ชั่น startLEDs มันจะเป็นลักษณะของการวนลูปไปเรื่อย ๆ จนกว่าตัวแปร isStarted จะเป็น False จึงจะหลุดลูป ถ้าไม่มี Thread ช่วยมันจะทำงานแบบ Synchronized หรือรอจนกว่าฟังก์ชั่นนี้จะทำงานเสร็จ และนั้นหมายความว่าตัวเซนเซอร์จะไม่ถูกสั่งให้รอสภาวะการหยุดนิ่งในบรรทัดที่ 58 ส่งผลให้ฟังก์ชั่น stopLEDs ไม่ถูกเรียกใช้งาน ตัวแปร isStarted ก็จะเป็น True ตลอดไปนั้นเอง (หรือที่เราเรียกว่าติดลูปนั่นแหละ)
สุดท้ายแต่ไม่ท้ายสุด ในบทความหน้าจะเพิ่มความมันส์เข้ามาหน่อย โดยอันจะเปลี่ยนจากหลอดไฟ LED จิ๋วเป็นหลอดไฟ 💡 ขนาด 12 โวลต์ (VDC) ที่เราใช้ตามบ้าน ซึ่งเราจะมีพระเอกคนใหม่เข้ามาซึ่งก็คือ…แอน…แอ่น…แอ้น…
เจ้า Relay ตัวนี้นี่เอง
ขอบคุณทุกท่านที่เข้ามาอ่านบทความของผมบนพื้นที่แห่งนี้ ยังไงฝากติดตามผลงานสับตะไคร้ (Follow) และรักษาสุขภาพกันด้วยนะครับ 😉