การหรี่แสง LED และ Beyond: PWM บน Raspberry Pi
PWM เป็นสิ่งที่เราทุกคนใช้ทุกวันแม้ว่าเราจะไม่รู้ก็ตาม เป็นเทคนิคที่ตรงไปตรงมาและมีประโยชน์อย่างเหลือเชื่อในการใช้งานที่หลากหลาย สิ่งที่ดีที่สุดคือ Raspberry Pi ของคุณสามารถทำได้โดยไม่ต้องเสียเหงื่อ ยังไง? มาดูกัน.
PWM คืออะไร?
คำว่า"การปรับความกว้างพัลส์"แม้จะดูซับซ้อน แต่ก็หมายถึงการสลับสัญญาณไฟฟ้าอย่างรวดเร็วระหว่างสถานะเปิดและปิด เทคนิคนี้นำเสนอวิธีการง่ายๆ ในการสร้างสัญญาณอะนาล็อกที่หลากหลาย โดยไม่ต้องใช้ฮาร์ดแวร์เพิ่มเติม เช่น Raspberry Pi HAT หรือส่วนประกอบภายนอก แท้จริงแล้ว สำหรับงานต่างๆ เช่น การควบคุมเตาไฟ การหมุนมอเตอร์ หรือการปรับความสว่างของ LED สัญญาณ PWM จะเลียนแบบแรงดันไฟฟ้าอนาล็อกของแท้ได้อย่างมีประสิทธิภาพ
รอบการทำงาน
กระบวนการนี้เกี่ยวข้องกับการป้อนลำดับของพัลส์เข้าไปในโหลดซึ่งเป็นวัตถุที่ถูกขับเคลื่อน แม้ว่าการกระทำนี้อาจดูเหมือนเป็นพื้นฐานในตัวเอง แต่จะมีความหมายมากขึ้นอย่างมากเมื่อระยะเวลาของพัลส์เหล่านี้ได้รับการปรับเปลี่ยน ด้วยการเปลี่ยนความกว้างของพัลส์ เราสามารถเปลี่ยนระยะเวลาในระหว่างที่พัลส์ยังคงทำงานอยู่หรือ"เปิด"ได้ สัดส่วนของเวลาในแต่ละรอบในระหว่างที่ชีพจรยังคงทำงานอยู่เรียกว่ารอบการทำงาน
พิจารณาสัญญาณมอดูเลตความกว้างพัลส์ (PWM) สามโวลต์ที่มีรอบหน้าที่ห้าสิบเปอร์เซ็นต์ ในสถานการณ์สมมตินี้ แรงดันไฟฟ้าเฉลี่ยที่ใช้กับไดโอดเปล่งแสง (LED) จะสอดคล้องกับสัญญาณหนึ่งโวลต์ครึ่งที่ไม่มีการรบกวน เมื่อเพิ่มรอบการทำงาน ความสว่างของ LED จะเพิ่มขึ้น ในขณะที่ลดลงจะส่งผลให้ความสว่างลดลงตามไปด้วย ในทำนองเดียวกัน สัญญาณเสียงยังสามารถสร้างขึ้นได้โดยใช้ PWM ซึ่งอาจนำไปสู่การรบกวนกับเอาต์พุตเสียงจาก Raspberry Pi หากมีการใช้งานแอปพลิเคชัน PWM อื่นพร้อมกัน
PWM บน Raspberry Pi
การใช้ซอฟต์แวร์ Pulse width Modulation (PWM) เป็นตัวเลือกที่ใช้งานได้สำหรับพิน GPIO ทั้งหมดบน Raspberry Pi อย่างไรก็ตาม การเข้าถึงฟังก์ชันการทำงานของฮาร์ดแวร์ PWM นั้นจำกัดอยู่ที่พินเฉพาะ ได้แก่ GPIO12, GPIO13, GPIO18 และ GPIO19
การใช้ซอฟต์แวร์คอมพิวเตอร์เพื่อสร้างสัญญาณอาจส่งผลให้มีการใช้ทรัพยากร CPU เพิ่มขึ้น ในขณะที่หน่วยประมวลผลกลาง (CPU) ถูกยุ่งอยู่กับงานนี้ แต่ก็อาจหมกมุ่นอยู่กับหน้าที่อื่นที่อาจส่งผลเสียต่อจังหวะการมอดูเลตความกว้างพัลส์ (PWM)
ดังนั้นจึงมักเป็นความคิดที่ดีกว่าที่จะมอบหมายงานให้กับวงจรเฉพาะ ในกรณีของ Raspberry Pi วงจรนี้จะอยู่ภายใน System on Chip ซึ่งเป็นที่เก็บ CPU ฮาร์ดแวร์ PWM มักจะแม่นยำและสะดวกกว่ามาก จึงเป็นตัวเลือกที่ต้องการในกรณีส่วนใหญ่ หากคุณต้องการทราบว่าเกิดอะไรขึ้นภายใต้ชิป Broadcom BCM2711 ของ Raspberry Pi 4 คุณสามารถดู เอกสารประกอบ BCM2711. บทที่ 8 ครอบคลุมเนื้อหาเกี่ยวกับ PWM!
การหรี่ไฟ LED
เพื่อให้ฟังก์ชัน LED ของเราทำงานร่วมกับ Raspberry Pi ได้อย่างเหมาะสม เราจะต้องทำการเขียงหั่นขนม กระบวนการนี้เกี่ยวข้องกับการเชื่อมต่อทั้ง LED และตัวต้านทานควบคุมกระแสในการกำหนดค่าแบบอนุกรม จำเป็นอย่างยิ่งที่จะต้องรวมตัวต้านทานนี้ไว้ด้วยเนื่องจากทำหน้าที่ป้องกันไม่ให้ LED โดนกระแสไฟที่มากเกินไป ดังนั้นจึงช่วยปกป้อง LED จากการตายอันโชคร้ายที่มีลักษณะเฉพาะคือกลิ่นพิษที่เล็ดลอดออกมาจากการสลายตัวของควัน
การหาค่าตัวต้านทาน
ตำแหน่งที่ตัวต้านทานต่อกับ LED จะไม่มีผลกระทบต่อประสิทธิภาพการทำงานของตัวต้านทาน แต่เป็นค่าความต้านทานที่กำหนดกระแสไหลผ่านอุปกรณ์ เนื่องจาก Raspberry Pi 4 สามารถจ่ายกระแสไฟได้ประมาณ 16 มิลลิแอมแปร์ (mA) ต่อพิน เราจึงอาจใช้กฎของโอห์มเพื่อคำนวณค่าความต้านทานที่จำเป็นสำหรับการทำงานที่เหมาะสม
หลักการข้างต้นกำหนดว่าอิมพีแดนซ์จะต้องเทียบเท่ากับความต่างศักย์ไฟฟ้าของตัวนำเทียบกับกระแสที่ไหลผ่าน แรงดันไฟฟ้าที่จ่ายโดยพิน GPIO ของ Raspberry Pi เป็นที่ทราบกันดีว่าอยู่ที่ 3.3 โวลต์ ในขณะที่กระแสไฟฟ้าที่กำหนดถูกกำหนดไว้ที่ 16 มิลลิแอมแปร์ หรือ 0.016 แอมแปร์ เมื่อแบ่งค่าเหล่านี้ ผลลัพธ์ที่ได้คือ 206 อย่างไรก็ตาม การค้นหาตำแหน่งตัวต้านทานที่มีข้อกำหนดเฉพาะที่แม่นยำสามารถพิสูจน์ได้ว่ามีความท้าทาย จึงจะใช้ทางเลือกอื่นแทน 220 โอห์ม
โปรดเชื่อมต่อขั้วบวก (ขั้วบวก) ของแถบ LED เข้ากับ GPIO 18 ซึ่งสอดคล้องกับขาจริง 12 บน Raspberry Pi นอกจากนี้ ให้ติดขั้วลบ (แคโทด) ของแถบ LED เข้ากับพินกราวด์ของอุปกรณ์ตัวใดตัวหนึ่ง อย่าลืมรวมตัวต้านทานไว้ในวงจร โดยวางไว้ที่ใดก็ได้ตามเส้นทางตามต้องการ เมื่อการเตรียมการเหล่านี้เสร็จสิ้น คุณก็พร้อมที่จะดำเนินโครงการต่อไป
การใช้ PWM บน Raspberry Pi
เพื่อให้ฮาร์ดแวร์ PWM ทำงานบน Raspberry Pi เราจะใช้ ไลบรารี rpi-hardware-pwm จาก Cameron Davidson-Pilon ซึ่งดัดแปลงมาจาก รหัสโดย Jeremy Impson สิ่งนี้ถูกใช้ใน Pioreactor (เครื่องปฏิกรณ์ชีวภาพแบบ Pi)€”แต่ก็ง่ายพอสำหรับวัตถุประสงค์ของเรา
เราจะเริ่มต้นด้วยการเข้าถึงไฟล์การกำหนดค่าที่อยู่ในโฟลเดอร์ “/boot” เพื่อดำเนินงานของเราต่อไป จำเป็นต้องต่อท้ายข้อความบรรทัดเดียว นั่นคือ “dtoverlay=pwm-2chan” หากเราต้องการใช้พิน GPIO นอกเหนือจากที่กำหนดให้กับ 18 และ 19 เราอาจรวมพารามิเตอร์เสริมตามความจำเป็น อย่างไรก็ตาม ในกรณีนี้ เราจะคงความเรียบง่ายไว้
รีบูท Pi ของคุณแล้วรัน:
lsmod | grep pwm
คำสั่งปัจจุบันให้รายการที่ครอบคลุมของโมดูลทั้งหมดที่ติดอยู่กับส่วนประกอบหลักที่สำคัญของระบบปฏิบัติการ ซึ่งถูกกำหนดให้เป็นเคอร์เนล เพื่อระบุเฉพาะส่วนประกอบที่เกี่ยวข้องกับการปรับความกว้างพัลส์ เราใช้ฟังก์ชัน grep ซึ่งย่อมาจาก"เครื่องพิมพ์นิพจน์ทั่วไปที่ใช้ทั่วโลก
หากการมีอยู่ของ “pwm\_bcm2835” ภายในโมดูลแค็ตตาล็อกบ่งชี้ว่าการติดตั้งสำเร็จ แสดงว่ากระบวนการตั้งค่าเบื้องต้นของเราใกล้จะเสร็จสมบูรณ์แล้ว ขั้นตอนสุดท้ายเกี่ยวข้องกับการติดตั้งไลบรารีจริงผ่านคำสั่งจากเทอร์มินัล:
sudo pip3 install rpi-hardware-pwm
ตอนนี้เราพร้อมที่จะเริ่มต้นแล้ว
การเข้ารหัสวงจร LED PWM
ถึงเวลาแล้วที่จะเจาะลึกโลกแห่งการเขียนโปรแกรมโดยใช้ภาษา Python ภายในสภาพแวดล้อมของ Thonny ในการเริ่มต้น เราต้องเริ่มต้นแพลตฟอร์ม Thonny จากนั้นจำลองข้อมูลโค้ดที่ให้มาภายในอินเทอร์เฟซ เมื่อป้อนรหัสสำเร็จแล้ว ให้กดปุ่ม “Run” เพื่อรันโปรแกรม
from rpi_hardware_pwm import HardwarePWM
import time
pwm = HardwarePWM(pwm_channel=0, hz=60) # here's where we initialize the PWM
pwm.start(0) # start the PWM at zero – which means the LED is off
for i in range(101):
pwm.change_duty_cycle(i)
time.sleep(.1) # by introducing a small delay, we can make the effect visible.
pwm.stop()
ที่จริงแล้ว ภายใต้สถานการณ์ปกติ เราควรสังเกตว่า LED จะส่องสว่างมากขึ้นเรื่อยๆ จนกระทั่งถึงเวลาที่ตัวแปรตัวนับมีค่าถึง 100 เมื่อถึงจุดนั้น ไฟจะหยุดส่องสว่าง รับประกันการตรวจสอบรายละเอียดของปรากฏการณ์นี้
เรากำลังนำเข้าส่วนที่เกี่ยวข้องของไลบรารี PWM ของฮาร์ดแวร์ พร้อมด้วยโมดูลเวลาที่เกี่ยวข้อง และการกำหนดตัวแปรใหม่ pwm\_channel สามารถกำหนดเป็น 0 หรือ 1 โดยที่ 0 สอดคล้องกับ GPIO pin 18 บน Raspberry Pi ในขณะที่ 1 ถูกแมปกับ GPIO pin 19
เราอาจกำหนดค่าเฮิรตซ์ (hz) ให้กับความถี่ที่ต้องการโดยพลการ แม้ว่าจะต้องพิจารณาข้อจำกัดในทางปฏิบัติ เช่น ความเร็วในการประมวลผลของ Raspberry Pi ก็ตาม ค่า hz 60 ไม่ควรแสดงการสั่นไหวของพัลส์ความกว้าง (PWM) ที่รับรู้ได้ ขอแนะนำให้เริ่มต้นด้วยค่า hz ที่ต่ำมาก เช่น 10 และเพิ่มขึ้นทีละน้อยจนกระทั่งมองเห็นพัลส์ที่มองเห็นได้ วิธีการนี้ช่วยให้สามารถสังเกตปรากฏการณ์ได้โดยตรง แทนที่จะอาศัยเพียงการยอมรับข้อความเท่านั้น
งานปัจจุบันของเราเกี่ยวข้องกับการเพิ่มรอบการทำงานของสัญญาณพัลส์ไวด์มอดูเลชั่น (PWM) เพิ่มขึ้นตั้งแต่ศูนย์ถึงหนึ่งร้อยเปอร์เซ็นต์ โดยใช้ Python for loop พารามิเตอร์"time.sleep"สามารถปรับได้ตามความชอบส่วนบุคคลหรือข้อกำหนดเฉพาะ เนื่องจาก PWM ได้รับการประมวลผลโดยฮาร์ดแวร์และทำงานโดยอิสระจากความล่าช้าของซอฟต์แวร์
มีอะไรอีกมากมายให้เรียนรู้ด้วย PWM
เป็นเรื่องน่ายกย่องที่คุณรันโปรแกรม PWM บน Raspberry Pi ของคุณได้สำเร็จ อย่างไรก็ตาม สิ่งสำคัญคือต้องทราบว่าแอปพลิเคชันที่เป็นไปได้สำหรับการปรับความกว้างพัลส์นั้นกว้างขวางอย่างมากเมื่อใช้ฮาร์ดแวร์ต่อพ่วงที่เหมาะสม เช่น PWM HAT เฉพาะ ดังนั้น จึงควรระมัดระวังที่จะไม่จำกัดตัวเองอยู่แค่การส่องสว่างแบบธรรมดาของ LED เพียงดวงเดียว แต่ควรสำรวจความเป็นไปได้ในการควบคุมมอเตอร์ การเข้ารหัสข้อมูล และสร้างสัญญาณเสียงผ่านวิธีการมอดูเลตต่างๆ โอกาสที่มีอยู่มีมากมายและรอการสำรวจอยู่