เรียนรู้การสร้างระบบเตือนการบุกรุกด้วยตนเองโดยใช้ Raspberry Pi เพื่อเปลี่ยนคอมพิวเตอร์ขนาดเล็กนี้ให้กลายเป็นระบบรักษาความปลอดภัยอัจฉริยะ
ลองนึกถึงภาพยนตร์ที่สายลับหรือหัวขโมยต้องฝ่าแสงเลเซอร์ที่คอยเฝ้าวัตถุต่างๆ หากทำลายลำแสง สัญญาณเตือนภัยจะดังขึ้น นั่นคือสิ่งที่เราจะทำกันในที่นี้
สำหรับบทช่วยสอนนี้ เราใช้เซ็นเซอร์เลเซอร์จาก (Waveshare Sensors Pack) แต่เซ็นเซอร์ที่คล้ายกันควรทำงานในลักษณะเดียวกัน
เลเซอร์จะปล่อยลำแสงออกมาอย่างต่อเนื่อง และตัวรับจะตรวจจับเฉพาะลำแสงที่สะท้อนออกมาซึ่งมีความยาวคลื่นเดียวกันเท่านั้น (650 นาโนเมตร) ดังนั้นจะไม่ถูกกระตุ้นด้วยแสงที่มองเห็นได้อื่นๆ เมื่อตรวจจับลำแสงได้ พินดิจิทัลจะส่งสัญญาณ 1 เมื่อลำแสงขาด จะส่งเป็น 0
เมื่อปิดเครื่องแล้ว ให้เชื่อมต่อเซนเซอร์เลเซอร์กับ Raspberry Pi ตามรูปที่ 1 เราจะจ่ายไฟให้เซนเซอร์จากพิน 3V3 ของ Raspberry Pi ต่อลงกราวด์ด้วยพิน GND (ผ่านรางด้านข้างของแผงทดลอง) และเอาต์พุตดิจิทัล (มีเครื่องหมาย DOUT บนเซนเซอร์) จะถูกส่งไปยัง GPIO 21
เซ็นเซอร์เลเซอร์ที่ใช้ที่นี่จะปล่อยลำแสงเลเซอร์อย่างต่อเนื่อง ระวังอย่าให้ลำแสงเลเซอร์พุ่งไปที่ศีรษะของบุคคลอื่น เพราะอาจทำให้สายตาเสียหายได้ ข้อมูลเพิ่มเติมเกี่ยวกับความปลอดภัยของเลเซอร์
เมื่อต่อสายเซนเซอร์เลเซอร์เรียบร้อยแล้ว ให้เปิด Raspberry Pi คุณจะเห็นไฟ LED แสดงสถานะพลังงานสีแดงของเซนเซอร์ (ทางด้านขวา) สว่างขึ้นหากเชื่อมต่ออย่างถูกต้อง นอกจากนี้ เซนเซอร์ยังควรปล่อยลำแสงเลเซอร์จากท่อโลหะด้วย ดังนั้นควรระวังอย่ามองตรงไปที่ท่อโลหะ
เล็งลำแสงไปที่ผนังใกล้เคียง (ห่างออกไปไม่เกิน 1.5 เมตร) และตรวจสอบว่าไฟ LED ด้านซ้าย (มีเครื่องหมาย DAT) ติดสว่างขึ้น เพื่อยืนยันว่าตรวจจับลำแสงเลเซอร์ได้ คุณอาจต้องปรับความเอียงแนวตั้งและแนวนอนของเซ็นเซอร์ หรือเลื่อนเซ็นเซอร์ให้เข้าใกล้ผนังมากขึ้น สำหรับการแจ้งเตือนที่เสร็จสิ้นแล้ว เราขอแนะนำให้คุณวางเซ็นเซอร์เลเซอร์ไว้ใกล้พื้นพอสมควร เพื่อให้ผู้ที่เดินผ่านไปผ่านมาสามารถตัดลำแสงได้ และจะไม่เข้าใกล้ดวงตาของพวกเขา
ในการเริ่มต้น เราจะสร้างโปรแกรม Python ง่ายๆ ตามรายการในไฟล์ laser_test.py เพื่ออ่านเอาต์พุตดิจิทัลของเซ็นเซอร์และพิมพ์ข้อความออกมาเพื่อแสดงเมื่อลำแสงขาด จากเมนูบนเดสก์ท็อป ไปที่การเขียนโปรแกรม และเปิด Thonny IDE เพื่อเริ่มเขียนโค้ด
from gpiozero import Button
laser = Button(21)
msg = ""
while True:
if laser.value == 0:
msg = "Intruder!"
else:
msg = "All clear"
print(msg, end = "\r")
เช่นเคย เราใช้ไลบรารี GPIO Zero ที่ด้านบนของโค้ด เราจะนำเข้าเมธอด Button จากไลบรารีนี้ เราจะใช้ไลบรารีนี้เพื่อตรวจจับว่าเอาต์พุตดิจิทัลจากเซ็นเซอร์มีค่าสูงเมื่อใด ซึ่งเทียบเท่ากับการกดปุ่ม เนื่องจากไลบรารีนี้เชื่อมต่อกับ GPIO 21 เราจึงกำหนดอ็อบเจกต์เลเซอร์ให้กับไลบรารีนี้ด้วย laser = Button(21)
ในลูป while True: แบบไม่มีที่สิ้นสุด เราจะตรวจสอบว่าพินอยู่ต่ำหรือไม่ (ถ้าค่าเลเซอร์ == 0) ซึ่งหมายความว่าลำแสงถูกตัดขาด และตั้งค่าข้อความ (ตัวแปร msg1) ที่เราจะพิมพ์ลงในพื้นที่ Shell ตามลำดับ ในคำสั่ง print ของเรา เราจะเพิ่มพารามิเตอร์ end = "\r" เพื่อให้ข้อความถูกพิมพ์บนบรรทัดเดียวกันเสมอ
รันโค้ด laser_test.py จากนั้นลองทำลายลำแสงด้วยมือของคุณ และดูว่าข้อความเปลี่ยนเป็น 'ผู้บุกรุก!' หรือไม่ คุณอาจพบว่าวิธีนี้จะทำงานได้ดีกว่าหากวางมือของคุณไว้ห่างจากเซ็นเซอร์มากขึ้น แม้ว่าไฟ LED DAT จะดับลงเพียงชั่วขณะ แต่ก็เพียงพอที่จะส่งสัญญาณเตือนในภายหลังได้
ตอนนี้เรามีเซ็นเซอร์เลเซอร์ที่ทำงานได้ ให้เพิ่มเซ็นเซอร์เสียงเพื่อให้การตั้งค่าของเราปลอดภัยจากการบุกรุกมากยิ่งขึ้น เราใช้เซ็นเซอร์เสียง Waveshare สำหรับสิ่งนี้ ซึ่งมีอยู่ใน Sensors Pack แต่เซ็นเซอร์อื่นๆ ที่คล้ายคลึงกันก็มีจำหน่ายพร้อมกับไมโครโฟน USB
เซ็นเซอร์ของเรามีพินสำหรับเอาต์พุตอะนาล็อกและดิจิทัล แต่เราต้องการเอาต์พุตดิจิทัลสำหรับสัญญาณเตือนเท่านั้น เมื่อปิดเครื่องแล้ว เราจะเชื่อมต่อพินนั้น (DOUT) เข้ากับ GPIO 14 และพิน VCC และ GNC เข้ากับ 3V3 และ GND (ใช้ร่วมกับเซ็นเซอร์เลเซอร์ผ่านรางด้านข้างของแผงทดลอง) ดังแสดงในรูปที่ 1
เมื่อเปิด Raspberry Pi อีกครั้ง คุณจะเห็นไฟ LED แสดงสถานะการทำงานทางด้านซ้ายของเซนเซอร์เสียงสว่างขึ้น ให้ส่งเสียงดัง แล้วคุณจะเห็นไฟ LED ทางด้านขวาสว่างขึ้นเพื่อแสดงว่าตรวจพบแล้ว
มาสร้างโปรแกรมที่คล้ายกันเพื่อทดสอบเซ็นเซอร์กัน ในรายการโค้ด sound_test.py เรากำหนดอ็อบเจ็กต์เสียงให้กับ GPIO14 ด้วย sound = Button(14) อีกครั้ง เราใช้เมธอด Button เพื่อตรวจจับเมื่อพินถูกทริกเกอร์
from gpiozero import Button
sound = Button(14)
msg = ""
while True:
if sound.value == 1:
msg = "Intruder!"
else:
msg = "All clear"
print(msg, end = "\r")
ในครั้งนี้ ในลูป while True: เราจะทดสอบว่าพินมีค่าสูงหรือไม่ (มีเสียงดังพอที่จะกระตุ้นเซ็นเซอร์เสียงได้) เช่นเดียวกับก่อนหน้านี้ การดำเนินการนี้จะกำหนดว่าข้อความใด (ในตัวแปร msg1) จะถูกพิมพ์ลงในพื้นที่ Shell
ตอนนี้ถึงเวลาทดสอบเซ็นเซอร์เสียงของเราเพื่อตรวจสอบว่าเชื่อมต่อและทำงานถูกต้องหรือไม่ รันโค้ด Python sound_test.py จากนั้นส่งเสียงดังเพื่อให้ไฟ LED DAT ทางด้านขวาของเซ็นเซอร์สว่างขึ้น คุณอาจพบว่าคุณต้องส่งเสียงดังสักหนึ่งวินาทีหรือมากกว่านั้น และมีความล่าช้าเล็กน้อยก่อนที่ข้อความจะเปลี่ยนจาก "ปลอดภัย" เป็น "ผู้บุกรุก!" ชั่วครู่
หากคุณประสบปัญหาในการเปิดใช้งาน ให้ลองเปลี่ยนความไวของเซนเซอร์เสียงโดยการปรับสกรูโพเทนชิออมิเตอร์ตัวล่าง (มีเครื่องหมาย D สำหรับดิจิทัล) บนเซนเซอร์ โดยการหมุนทวนเข็มนาฬิกาจะเพิ่มความไว แต่ต้องไม่มากเกินไป มิฉะนั้น ไฟ LED DAT จะติดสว่างตลอดเวลา
หากเซ็นเซอร์และโค้ดของคุณทำงานได้อย่างถูกต้อง ก็ถึงเวลาที่จะไปยังส่วนถัดไป ข้อความที่พิมพ์ออกมาก็ใช้ได้ แต่หากต้องการการแจ้งเตือนที่เหมาะสม คุณต้องใช้การแจ้งเตือนแบบภาพและ/หรือเสียง
ตามคู่มือเดือนที่แล้ว เราจะเพิ่ม LED สีแดงมาตรฐานสำหรับการแจ้งเตือนทางภาพ LED ของเรามีขนาด 5 มม. แต่คุณสามารถใช้ขนาดอื่นได้ เช่นเคย จำเป็นต้องใช้ตัวต้านทานเพื่อจำกัดกระแสไฟให้กับ LED เพื่อให้แน่ใจว่าจะไม่ได้รับกระแสไฟมากเกินไปและอาจไหม้ได้ เมื่อวาง LED ไว้ในแผงทดลองโดยมีขาในแถวที่ไม่เชื่อมต่อกันหลายแถว เราจะเชื่อมต่อตัวต้านทาน 330 Ω ระหว่างขาขั้วลบ (สั้นกว่า) และรางกราวด์ของแผงทดลอง ขาขั้วบวก (งอ ยาวกว่า) เชื่อมต่อกับ GPIO 16 บน Raspberry Pi ตามแผนผังการเดินสายในรูปที่ 1
สำหรับการแจ้งเตือนด้วยเสียง เราจะใช้บัซเซอร์เพียโซแอคทีฟขนาดเล็กเพื่อให้เกิดเสียงบี๊บ คุณสามารถใช้สิ่งอื่นเพื่อส่งเสียงเตือนได้ บัซเซอร์มีขาบวกที่ยาวกว่าและขาลบที่สั้นกว่า ตำแหน่งของทั้งสองอาจทำเครื่องหมายไว้ด้านบน ต่อพินลบเข้ากับรางกราวด์ของแผงทดลอง และต่อพินบวกเข้ากับ GPIO 25 (ตามรูปที่ 1)
เมื่อเชื่อมต่อทุกอย่างเรียบร้อยแล้วตามรูปที่ 1 ตอนนี้คุณก็พร้อมที่จะตั้งโปรแกรมสัญญาณกันขโมยได้แล้ว ในโค้ดสุดท้าย intruder_alarm.py เราเพิ่ม LED และ Buzzer ลงในไฟล์นำเข้า gpiozero ที่ด้านบน นอกจากนี้ เรายังนำเข้า sleep จากไลบรารีเวลาเพื่อใช้เป็นตัวหน่วงเวลาด้วย
from gpiozero import Button, LED, Buzzer
from time import sleep
laser = Button(21)
sound = Button(14)
led = LED(16)
buzzer = Buzzer(25)
def alarm():
print("Intruder alert!", end = "\r")
for i in range(10):
led.toggle()
buzzer.toggle()
sleep(0.5)
while True:
if laser.value == 0 or
sound.value == 1:
alarm()
else:
print("All clear ",
end = "\r")
led.off()
buzzer.off()
หากต้องการ คุณสามารถสร้างฟังก์ชันแยกต่างหากพร้อมข้อความที่แตกต่างกันสำหรับสัญญาณเตือนแต่ละครั้ง (เช่น สัญญาณเตือนไฟไหม้และแก๊สในฉบับที่แล้ว) แต่ครั้งนี้ เราทำให้เรียบง่ายด้วยฟังก์ชันสัญญาณเตือนเดียว เนื่องจากเราไม่ต้องกังวลว่าจะตรวจจับผู้บุกรุกได้อย่างไร เมื่อถูกกระตุ้น ฟังก์ชันนี้จะดำเนินการลูป for ซึ่งจะสลับ LED และบัซเซอร์ให้เปิดและปิดตามจำนวนครั้งที่กำหนด โดยแต่ละครั้งจะหน่วงเวลาพักเครื่อง 0.5 วินาที
ในขณะนั้น True: ลูป เราจะตรวจสอบค่าพินจากเซ็นเซอร์ทั้งสองตัวและส่งสัญญาณเตือนเมื่อลำแสงเลเซอร์ขาด (laser.value == 0) หรือเกินเกณฑ์เสียง (sound.value == 1) หากไม่มีการเรียกใช้งานทั้งสองตัว เราจะแสดงข้อความเริ่มต้นและตรวจสอบให้แน่ใจว่า LED และบัซเซอร์ปิดอยู่
ตอนนี้ทดสอบระบบเตือนภัย เหมือนอย่างก่อนหน้านี้ ให้ลองตัดลำแสงเลเซอร์: จากนั้นไฟ LED ควรกะพริบและเสียงสัญญาณเตือนจะดังขึ้น ทำแบบเดียวกันกับเซ็นเซอร์เสียงโดยส่งเสียงดังเป็นเวลานาน สัญญาณเตือนจะทำงานอีกครั้ง ทุกครั้ง ข้อความ "ผู้บุกรุก!" จะปรากฏในพื้นที่ Shell
ตอนนี้เรามีระบบแจ้งเตือนการบุกรุกแบบง่ายๆ แล้ว หากต้องการปรับปรุงให้ดีขึ้น คุณสามารถเพิ่มเซ็นเซอร์เพิ่มเติม เช่น PIR หรือแม้แต่กล้องเพื่อตรวจจับการเคลื่อนไหว คุณสามารถเปิดไฟขนาดใหญ่และ/หรือเล่นเสียงเตือนหรือข้อความเสียงพูดบนลำโพงที่เชื่อมต่ออยู่ได้ นอกจากนี้ คุณยังสามารถส่งอีเมลหรือการแจ้งเตือนแบบพุชไปยังโทรศัพท์ของคุณได้ทุกครั้งที่ระบบแจ้งเตือนทำงาน