Contents

การหรี่แสง LED และ Beyond: PWM บน Raspberry Pi

PWM เป็นสิ่งที่เราทุกคนใช้ทุกวันแม้ว่าเราจะไม่รู้ก็ตาม เป็นเทคนิคที่ตรงไปตรงมาและมีประโยชน์อย่างเหลือเชื่อในการใช้งานที่หลากหลาย สิ่งที่ดีที่สุดคือ Raspberry Pi ของคุณสามารถทำได้โดยไม่ต้องเสียเหงื่อ ยังไง? มาดูกัน.

PWM คืออะไร?

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

รอบการทำงาน

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

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

/th/images/pwm-anim.gif

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 เข้ากับพินกราวด์ของอุปกรณ์ตัวใดตัวหนึ่ง อย่าลืมรวมตัวต้านทานไว้ในวงจร โดยวางไว้ที่ใดก็ได้ตามเส้นทางตามต้องการ เมื่อการเตรียมการเหล่านี้เสร็จสิ้น คุณก็พร้อมที่จะดำเนินโครงการต่อไป

/th/images/raspberry-pi-led-circuit.jpg

การใช้ 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 

ตอนนี้เราพร้อมที่จะเริ่มต้นแล้ว

/th/images/a-coder-woman.jpg

การเข้ารหัสวงจร 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 เพียงดวงเดียว แต่ควรสำรวจความเป็นไปได้ในการควบคุมมอเตอร์ การเข้ารหัสข้อมูล และสร้างสัญญาณเสียงผ่านวิธีการมอดูเลตต่างๆ โอกาสที่มีอยู่มีมากมายและรอการสำรวจอยู่