อุปกรณ์กำลังสูงในที่นี้จะหมายถึง อุปกรณ์ที่ไม่สามารถนำ ESP32 เข้าไปควบคุมตรง ๆ ได้ เช่น มอเตอร์ หลอดไฟกำลังสูง หลอดไฟ 220VAC เครื่องใช้ไฟฟ้าต่าง ๆ เป็นต้น ซึ่งในบทนี้เราจะมีเรียนรู้วิธีการใช้อุปกรณ์ต่าง ๆ ช่วยให้ ESP32 สามารถขับอุปกรณ์กำลังสูงเหล่านั้นได้โดยไม่เกิดความเสียหายกับตัว ESP32
การขับจะหมายถึงการทำให้อุปกรณ์สามารถทำงานได้ใน 2 โหมด คือเปิด และปิด สำหรับการทำให้อุปกรณ์ที่ใช้ไฟฟ้ากระแสตรงสามารถทำงานได้ใน 2 โหมดนี้ สามารถเลือกใช้งานอุปกรณ์ช่วยขับได้ดังนี้
รีเลย์ (Relay) คืออุปกรณ์อิเล็กทรอนิกส์ที่ทำหน้าที่คล้ายสวิตซ์ในการควบคุมการจ่ายพลังงานไฟฟ้า รีเลย์จะมีแรงดันที่ใช้ในการขับอยู่เช่นเดียวกัน และตัวรีเลย์เองก็ถือเป็นอุปกรณ์กำลังสูงที่ต้องใช้ทรานซิสเตอร์มาช่วยขับด้วย แต่ในการใช้งานมักจะเลือกใช้งานแบบโมดูลสำเร็จรูปเพียงต่อสัญญาณเข้า ไฟเลี้ยง และอุปกรณ์ที่ต้องการควบคุมก็สามารถใช้งานได้ทันที
รีเลย์จะแบ่งเป็น 2 แบบ ดังนี้
รีเลย์แบบขดลวด – เป็นรีเลย์ที่มีส่วนประกอบของขดลวดเหนี่ยวนำ และหน้าคอนเทค หลักการคือเมื่อเกิดความเหนี่ยวนำขึ้นจะทำให้คอนเทคถูกดึงด้วยสนามแม่เหล็กมาชนกัน ทำให้พลังงานไฟฟ้าสามารถไหลผ่านไปได้ ทั้งนี้ข้อเสียของรีเลย์แบบนี้คือเมื่อหน้าคอนเทคมีการสัมผัสกันจะทำให้เกิดการอาร์คขึ้น รวมทั้งต้องใช้กระแสไฟฟ้าจำนวนหนึ่งในการจ่ายไปให้ขดลวดเหนี่ยวนำ
รูปที่ 8.1 ส่วนประกอบของรีเลย์แบบขดลวด
รีเลย์แบบขดลวดจะแบ่งย่อยได้ตามหน้าคอนเทคที่มีภายใน สำหรับรีเลย์ที่นิยมใช้มักมีหน้าคอนเทคเดียวและมีขาต่อใช้งานจำนวน 5 ขา คือ ขาขดลวดเหนี่ยวนำ 2 ขา และขาควบคุมอุปกรณ์อื่นจำนวน 3 ขา ขาควบคุมอุปกรณ์อื่นจะแยกได้เป็นขา NC (Normally Close) COM (Common) และ NO (Normally Open) การใช้งานส่วนใหญ่จะใช้ขา NO และ COM
การใช้งานโมดูลรีเลย์สำเร็จรูปจะคำนึงถึงแรงดันไฟฟ้าที่ใช้ขับรีเลย์ และจำนวนรีเลย์ที่ต้องการใช้เป็นหลัก สำหรับ ESP32 ไม่มีโมดูลรีเลย์สำเร็จรูปที่ใช้แรงดันไฟฟ้า 3.3V แต่สามารถใช้รีเลย์สำเร็จรูปที่ใช้แรงดันไฟฟ้า 5V ได้ โดยสามารถดึงแรงดันไฟฟ้า 5V มาจ่ายให้กับโมดูลรีเลย์ได้จากช่อง Vin ของบอร์ด NodeMCU-32S ซึ่งแรงดันไฟฟ้า 5V จะมาจากพอร์ต MicroUSB
รูปที่ 8.2 โมดูลรีเลย์สำเร็จรูป 1 ช่อง ใช้แรงดัน 5V
ในการทดลองจะใช้รีเลย์ในการขับมอเตอร์ ซึ่งสามารถต่อวงจรได้ดังนี้ ท่านสามารถเปลี่ยนแหล่งจ่ายไปตามแรงดันที่มอเตอร์ต้องการได้ เช่น มอเตอร์ 12VDC ควรใช้แหล่งจ่ายเป็นแบตเตอรี่ 12V หรือเพาเวอร์ซัพพลายที่มีกระแสมากพอจะจ่ายให้กับมอเตอร์
สำหรับโมดูลรีเลย์แต่ละรุ่นจะใช้สถานะในการทำงานไม่เหมือนกัน ในบางรุ่นโดยเฉพาะรุ่นรีเลย์ 2 ช่อง จะทำงานแบบ Active LOW ดังนั้นเมื่อต้องการให้มอเตอร์ทำงานจึงต้องจ่ายสถานะ LOW ให้รีเลย์
แต่สำหรับโมดูลรุ่น 1 ช่องมีหน้าตาแบบที่ยกมานี้จะใช้การทำงานแบบ Active HIGH ดังนั้นหากต้องการให้มอเตอร์ทำงานสามารถสั่ง HIGH ได้เลย
หลังจากต่อวงจรแล้ว ให้เข้าไปคัดลอกโค้ดโปรแกรมที่ https://goo.gl/EeSi64 จากนั้นนำมาอัพโหลดลงบอร์ด NodeMCU-32S ได้เลย และหลังจากอัพโหลดโปรแกรมแล้ว ให้ทดลองกดปุ่ม IO0 จะพบว่ามอเตอร์หมุน และหากกดอีกครั้ง มอเตอร์จะหยุดหมุน ทั้งนี้ทุกครั้งที่กดปุ่มจะได้ยินเสียงของรีเลย์ซึ่งเป็นเสียงของหน้าคอนเทคสัมผัสกัน
โค้ดที่ได้ทดลองมีดังนี้
บรรทัดที่ 1 ประกาศให้ BTN_PIN แทนเลข 0
บรรทัดที่ 2 ประกาศให้ RELAY_PIN แทนเลข 13
บรรทัดที่ 4 สร้างฟังก์ชั่น setup
บรรทัดที่ 5 กำหนดให้ขาใน BTN_PIN มีสถานะเป็นอินพุตแบบดิจิตอล
บรรทัดที่ 6 กำหนดให้ขาใน มีสถานะเป็นเอาต์พุตแบบดิจิตอล
บรรทัดที่ 7 จบคำสั่งในฟังก์ชั่น setup
บรรทัดที่ 9 สร้างฟังก์ชั่น loop
บรรทัดที่ 10 เปรียบเทียบว่ามีการกดสวิตซ์หรือไม่ ถ้ามีการกดสวิตซ์ให้ทำคำสั่งในปีกกา
บรรทัดที่ 11 วนรอบรอจนกว่าจะปล่อยสวิตซ์
บรรทัดที่ 12 สลับสถานะทางดิจิตอลของขาใน RELAY_PIN
บรรทัดที่ 13 จบคำสั่งใน if
บรรทัดที่ 14 จบคำสั่งในฟังก์ชั่น loop
โซลิตสเตตรีเลย์ – เป็นรีเลย์ที่ทำมาจากอุปกรณ์อิเล็กทรอนิกส์ ไม่มีหน้าสัมผัส มักใช้มอสเฟส หรือไทรแอคในการในการขับ ในส่วนของวงจรขับมักแยกออกจากวงจรควบคุมด้วยออปโต้คัปเปลอร์
โมดูลโซลิสสเตตรีเลย์สำเร็จรูปมักแบ่งตามชนิดของกระแสไฟฟ้าที่ใช้ คือ ใช้กับไฟฟ้ากระแสตรง โดยทำมาจากมอสเฟส หรือทรานซิสเตอร์ และใช้กับไฟฟ้ากระแสสลับ โดยทำมาจากไทรแอค
รูปที่ 8.3 โมดูลโซลิตสเตตรีเลย์สำหรับไฟฟ้ากระแสตรงใช้มอสเฟส
การควบคุมอุปกรณ์ไฟฟ้ากระแสตรงจะแบ่งอุปกรณ์ได้ 2 แบบ คืออุปกรณ์แบบขดลวดความร้อน และมอเตอร์ อุปกรณ์ทั้ง 2 มีความแตกต่างกันที่ ขดลวดความร้อน หลอดไฟ และอุปกรณ์ขดลวดอื่น ๆ จะควบคุมการจ่ายพลังงานเท่านั้น ซึ่งใช้การควบคุมแบบทางเดียว แต่การควบคุมมอเตอร์จะต้องใช้การควบคุมแบบ 2 ทาง คือการควบคุมความเร็วในการหมุน และการควบคุมทิศทางที่หมุน การควบคุมอุปกรณ์ทั้ง 2 แบบจะใช้อุปกรณ์ช่วยควบคุมที่ต่างกัน
การควบคุมหลอดไฟ หรือขดลวดความร้อนไฟฟ้ากระแสตรง มักใช้โมดูลโซลิตสเตตรีเลย์สำหรับไฟฟ้ากระแสตรงในการควบคุม โดยการควบคุมจะจ่ายความถี่ PWM ไปที่ด้านอินพุต จากนั้นที่ฝั่งเอาต์พุตจะได้ความถี่ PWM แบบเดียวกัน ทำให้สามารถควบคุมความสว่าง / ความร้อนของอุปกรณ์นั้น ๆ ได้
การควบคุมมอเตอร์นิยมใช้งานโมดูลสำเร็จรูปแบบต่าง ๆ ทั้งนี้โมดูลสำเร็จรูปจะต้องเลือกตามกระแสไฟฟ้าที่มอเตอร์ใช้สูงสุด เช่น มอเตอร์ใช้กระแสไฟฟ้าสูงสุดประมาณ 1A ควรจะใช้โมดูลควบคุมมอเตอร์ที่รองรับกระแสไฟฟ้าได้ 2A เป็นต้น
โมดูลควบคุมมอเตอร์ที่นิยมใช้งานจะเป็นโมดูลที่ใช้ไอซี L298N สามารถขับมอเตอร์ที่ใช้กำลังไฟฟ้าสูงสุด 2A ได้ รองรับแรงดันอินพุตสำหรับควบคุมมอเตอร์ตั้งแต่ 5V ถึง 35V รองรับมอเตอร์ได้ 2 ตัว โดยแต่ละตัวมีช่องควบคุมจำนวน 3 ช่อง คือ IN จำนวน 2 ช่องสำหรับควบคุมทิศทางและความเร็วด้วย PWM และช่อง EN สำหรับควบคุมเปิด-ปิดการทำงานทั้งหมด ทั้งนี้ขา EN มักจะมีจั้มเปอร์ต่อกับ +5V อยู่แล้ว จึงไม่จำเป็นต้องนำมาต่อเข้ากับ ESP32 อีก
รูปที่ 8.4 โมดูลขับมอเตอร์ใช้ไอซี L298N
การทดลองใช้งาน ให้ต่อวงจรต่อไปนี้ โดยเปลี่ยนแบตเตอรี่ 9V เป็นแหล่งจ่ายที่ใช้ทดสอบ
ในการเขียนโปรแกรมจะแบ่งการควบคุมออกเป็น 2 ขั้น ดังนี้
แต่สำหรับ ESP32 จะพิเศษที่การควบคุม PWM จะต้องควบคุมผ่าน Timer การเปลี่ยนขาส่งสัญญาณ PWM จึงไม่สามารถทำได้ง่ายนัก ดังนั้นการใช้งานที่ง่ายกว่าคือการใช้ PWM ทั้ง 2 ขา แยก Timer เป็น 2 ตัว
โค้ดโปรแกรมที่ใช้ทดลองจึงสามารถเข้าไปคัดลอกมาอัพโหลดลงบอร์ด NodeMCU-32S ได้ที่ https://goo.gl/CZm1fR
ผลของโค้ดคือมอเตอร์จะหมุนไปในทิศทางหนึ่งในระดับความเร็ว 25% 50% 100% ตามลำดับ แล้วหยุด จากนั้นมอเตอร์หมุนไปอีกทิศทางหนึ่งในระดับความเร็ว 25% 50% 100% ตามลำดับ แล้วหยุดจากนั้นวนลูปไปเรื่อย ๆ ไม่รู้จบ
โค้ดที่ได้ทดลองเมื่อตัดคอมเม้นออก มีดังนี้
บรรทัดที่ 1 กำหนดให้แทนคำว่า IN1 ด้วย 23
บรรทัดที่ 2 กำหนดให้แทนคำว่า IN2 ด้วย 22
บรรทัดที่ 4 สร้างฟังก์ชั่นย่อย setPWM() ใช้สำหรับตั้งค่าสัญญาณ PWM โดยที่ค่าพารามิเตอร์ ch แทนด้วยช่องของ Timer และค่าพารามิเตอร์ duty แทนด้วยค่าดิวตี้ไซเคิลที่อยู่ในช่วง 0% ถึง 100%
บรรทัดที่ 5 ใช้ฟังก์ชั่น map เปลี่ยนค่าในตัวแปร duty จากช่วง 0 ถึง 100 เป็นช่วง 0 ถึง 1023 แล้วนำค่าไปเก็บไว้ในตัวแปร new_duty
บรรทัดที่ 6 ใช้ฟังก์ชั่น ledcWrite() เปลี่ยนค่าดิวตี้ไซเคิลเป็นค่าตามตัวแปร new_duty โดย Timer ตัวที่ต้องการเปลี่ยนอยู่ในตัวแปร ch ที่รับค่าเข้ามาทางพารามิเตอร์
บรรทัดที่ 7 จบคำสั่งในฟังก์ชั่นย่อย setPWM()
บรรทัดที่ 9 สร้างฟังก์ชั่น setup
บรรทัดที่ 10 ใช้ฟังก์ชั่น ledcSetup() เริ่มตั้งค่าใช้งาน PWM โดยใช้ Timer ตัวที่ 0 กำหนดให้ผลิตวามถี่ที่ 500Hz และใช้ความละเอียดแบบ 10 บิต
บรรทัดที่ 11 ใช้ฟังก์ชั่น ledcSetup() เริ่มตั้งค่าใช้งาน PWM โดยใช้ Timer ตัวที่ 1 กำหนดให้ผลิตวามถี่ที่ 500Hz และใช้ความละเอียดแบบ 10 บิต
บรรทัดที่ 12 ใช้ฟังก์ชั่น ledcAttachPin() ผูกขาใน IN1 เข้ากับ Timer ตัวที่ 0
บรรทัดที่ 13 ใช้ฟังก์ชั่น ledcAttachPin() ผูกขาใน IN2 เข้ากับ Timer ตัวที่ 1
บรรทัดที่ 14 จบคำสั่งในฟังก์ชั่น setup
บรรทัดที่ 16 สร้างฟังก์ชั่น loop
บรรทัดที่ 17 เรียกใช้ฟังก์ชั่น setPWM() กำหนดให้ Timer ตัวที่ 0 ที่ผูกอยู่กับขาใน IN1 มีค่าสัญญาณ PWM เป็น 0% หรือเทียบได้กับสถานะ LOW หรือเทียบได้กับการต่อลงกราว์ด
บรรทัดที่ 18 เรียกใช้ฟังก์ชั่น setPWM() กำหนดให้ Timer ตัวที่ 1 ที่ผูกอยู่กับขาใน IN2 มีค่าสัญญาณ PWM เป็น 25%
บรรทัดที่ 19 ด้วยการตั้งค่า PWM ในบรรทัดที่ 17 – 18 ทำให้มอเตอร์เริ่มหมุนไปในทิศทางหนึ่งด้วยความเร็ว 25% แล้วหน่วงเวลา 1 วินาทีในบรรทัดนี้ทำให้มอเตอร์ทำงานแบบนี้เป็นเวลา 1 วินาที
บรรทัดที่ 23 ด้วยการตั้งค่า PWM ในบรรทัดที่ 21 – 22 ทำให้มอเตอร์หมุนไปในทิศทางหนึ่งด้วยความเร็ว 50% แล้วหน่วงเวลา 1 วินาทีในบรรทัดนี้ทำให้มอเตอร์ทำงานแบบนี้เป็นเวลา 1 วินาที
บรรทัดที่ 27 ด้วยการตั้งค่า PWM ในบรรทัดที่ 25 – 26 ทำให้มอเตอร์หมุนไปในทิศทางหนึ่งด้วยความเร็ว 100% (ความเร็วเต็มที่) แล้วหน่วงเวลา 1 วินาทีในบรรทัดนี้ทำให้มอเตอร์ทำงานแบบนี้เป็นเวลา 1 วินาที
บรรทัดที่ 31 ด้วยการตั้งค่า PWM ในบรรทัดที่ 29 – 30 ทำให้มอเตอร์หยุดหมุน เนื่องการตั้งให้ขาใน IN1 และ IN2 มีค่า PWM เป็น 0 ทำให้เทียบได้กับการนำขั้วทั้ง 2 ของมอเตอร์ลงกราว์ดทำให้กระแสไฟฟ้าไม่ไหลผ่าน แล้วหน่วงเวลา 1 วินาทีในบรรทัดนี้ทำให้มอเตอร์ทำงานแบบนี้เป็นเวลา 1 วินาที
บรรทัดที่ 33 เรียกใช้ฟังก์ชั่น setPWM() กำหนดให้ Timer ตัวที่ 0 ที่ผูกอยู่กับขาใน IN1 มีค่าสัญญาณ PWM เป็น 25%
บรรทัดที่ 34 เรียกใช้ฟังก์ชั่น setPWM() กำหนดให้ Timer ตัวที่ 1 ที่ผูกอยู่กับขาใน IN2 มีค่าสัญญาณ PWM เป็น 0% หรือเทียบได้กับสถานะ LOW หรือเทียบได้กับการต่อลงกราว์ด
บรรทัดที่ 35 ด้วยการตั้งค่า PWM ในบรรทัดที่ 33 – 34 ทำให้มอเตอร์เริ่มหมุนไปในทิศทางตรงกันข้ามกับทิศทางก่อนหน้านี้ด้วยความเร็ว 25% เนื่องจากมีการสลับฝั่งที่จ่ายสัญญาณ PWM แล้วหน่วงเวลา 1 วินาทีในบรรทัดนี้ทำให้มอเตอร์ทำงานแบบนี้เป็นเวลา 1 วินาที
บรรทัดที่ 39 ด้วยการตั้งค่า PWM ในบรรทัดที่ 37 – 38 ทำให้มอเตอร์หมุนด้วยความเร็ว 50% แล้วหน่วงเวลา 1 วินาทีในบรรทัดนี้ทำให้มอเตอร์ทำงานแบบนี้เป็นเวลา 1 วินาที
บรรทัดที่ 43 ด้วยการตั้งค่า PWM ในบรรทัดที่ 41 – 42 ทำให้มอเตอร์หมุนด้วยความเร็ว 100% (ความเร็วเต็มที่) แล้วหน่วงเวลา 1 วินาทีในบรรทัดนี้ทำให้มอเตอร์ทำงานแบบนี้เป็นเวลา 1 วินาที
บรรทัดที่ 47 ด้วยการตั้งค่า PWM ในบรรทัดที่ 45 – 46 ทำให้มอเตอร์หยุดหมุน แล้วหน่วงเวลา 1 วินาทีในบรรทัดนี้ทำให้มอเตอร์ทำงานแบบนี้เป็นเวลา 1 วินาที
บรรทัดที่ 48 จบคำสั่งในฟังก์ชั่น loop
จะเห็นว่าโค้ดตัวอย่างถึงแม้จะมีหลายบรรทัด แต่จะมีการใช้ฟังก์ชั่นซ้ำ ๆ กัน การกำหนดค่าในพารามิเตอร์ของฟังก์ชั่นย่อย setPWM() ทำให้สามารถควบคุมมอเตอร์ได้ทั้งทิศทาง และความเร็ว การใช้งานแบบมอเตอร์ 2 ตัวสามารถทำได้แบบเดียวกันคือการใช้ Timer ตัวที่ 3 และ 4 ในการควบคุมขา IN3 และ IN4 ทั้งนี้ก่อนใช้งานต้องมีการตั้งค่าด้วยฟังก์ชั่น ledcSetup() และ ledcAttachPin() ทุกครั้ง สำหรับรายละเอียดของการสร้างสัญญาณ PWM สามารถย้อนกลับไปอ่านได้ที่หัวข้อ การใช้งาน PWM
ไฟฟ้ากระแสสลับ คือไฟฟ้าที่มีการสลับสับเปลี่ยนขั้วบวกและลบไปมาตลอดเวลา มีการใช้ไฟฟ้ากระแสสลับนี้ในไฟบ้าน โดยอุปกรณ์อิเล็กทรอนิกส์ส่วนใหญ่เมื่อเสียบเข้ากับไฟบ้านที่เป็นไฟฟ้ากระแสสลับแล้วมักจะมีการลดแรงดันลงแล้วแปลงเป็นไฟฟ้ากระแสตรงภายหลัง แต่สำหรับอุปกรณ์บางชื้น เช่น หลอดไฟแบบไส้ เตาปิ้งขนมปัง เตารีด มักจะไม่มีวงจรอิเล็กทรอนิกส์ที่ใช้ไฟฟ้ากระแสตรงภายใน และใช้ไฟฟ้ากระแสสลับโดยตรงในการทำงาน
อุปกรณ์ใช้ไฟฟ้ากระแสสลับมักนิยมใช้งานรีเลย์ในการขับ ทั้งนี้รีเลย์แบบขดลวดที่ใช้ในไฟฟ้ากระแสตรงสามารถนำมาใช้งานในกระแสสลับได้เลย มีการต่อวงจรที่คล้ายกัน มีเพียงการเปลี่ยนแหล่งจ่ายจากไฟฟ้ากระแสตรงเป็นไฟฟ้ากระแสสลับหรือปลั๊กไฟเท่านั้น
การทดลองต่อไปนี้จะทดลองทำไฟกระพริบโดยใช้หลอดไฟ 220V สามารถต่อวงจรได้ดังนี้
จากนั้น เปิดตัวอย่าง Blink ขึ้นมา แล้วแก้ไชคำว่า LED_BUILTIN เป็น 13 ทั้งหมดในโค้ด (เนื่องจากต่อขาของรีเลย์ไว้ที่ GPIO13) แล้วอัพโหลดลงบอร์ด NodeMCU-32S ได้เลย
จากนั้น จะได้ยินเสียงรีเลย์ตัดไปมา พร้อมกับหลอดไฟที่กระพริบ ซึ่งโค้ดที่ใช้ทดลองนี้เป็นโค้ดเดียวกับในหัวข้อ เรียนรู้จากตัวอย่างโปรแกรมไฟกระพริบ หากไม่เข้าใจโค้ดส่วนใดสามารถย้อนกลับไปอ่านคำอธิบายได้เลย
โซลิตสเตตรีเลย์มักนิยใช้ในการขับอุปกรณ์ไฟฟากระแสสลับเช่นเดียวกัน ข้อดีคือมีขนาดเล็ก และไม่ต้องการไฟเลี้ยงรีเลย์ เนื่องจากตัวรีเลย์นั้นทำมาจากไทรแอคซึ่งจะใช้ไฟฟ้ากระแสสลับในการขับตัวเอง ทั้งนี้โซลิตสเตตรีเลย์จะมีความสามารถในการรองรับกระแสไฟฟ้าที่ต่ำกว่ารีเลย์แบบขดลวด หากใช้งานกระแสไฟฟ้าใกล้กับกระแสสูงสุดที่รองรับได้ควรติดแผ่นระบายความร้อนเพิ่มเติม
โซลิตสเตตรีเลย์จะมีทั้งแบบสำเร็จรูป นั่นคือเพียงจ่ายสัญญาณควบคุมเข้าไปก็ใช้งานได้เลย และแบบต่อเอง แบบต่อเองนี้จะใช้ไทรแอคมาต่อเป็นวงจรโซลิตสเตตรีเลย์ซึ่งจะรองรับกระแสไฟฟ้าได้มากกว่า และกรณีต้องการขับอุปกรณ์ใช้กระแสไฟฟ้ามากขึ้น สามารถเปลี่ยนเฉพาะตัวไตรแอดได้เลย
แต่ที่จะมาแนะนำนั้นคือโมดูลโซลิตสเตตรีเลย์สำเร็จรูป รองรับกระแสไฟฟ้าไหลผ่านสูงสุด 2A หรือไม่เกิน 4,400W สามารถใช้งานได้ง่าย แต่ยังจำเป็นต้องใช้ไฟ 5V เลี้ยงอยู่เนื่องจากโซลิตสเตตรีเลย์บนบอร์ดต้องใช้แรงดันไฟฟ้า 5V ในการทำงาน
รูปที่ 8.5 โมดูลโซลิตสเตตรีเลย์ไฟฟ้ากระแสสลับแบบ 1 ช่อง
การใช้โมดูลโซลิตสเตตรีเลย์สามารถต่อวงจรได้ดังนี้
โค้ดโปรแกรมที่ใช้ทดลองสามารถใช้โค้ดเดียวกับหัวข้อที่แล้วได้เลย คือเปิดตัวอย่างโค้ด Blink จากนั้นขาที่ใช้งานเป็นขา 13 แล้วอัพโหลดลงบอร์ด ผลที่ได้คือหลอดไฟกระพริบแต่จะไม่มีเสียงออกมาจากรีเลย์เนื่องจากโซลิตสเตตรีเลย์ใช้การควบคุมการไหลของไฟฟ้าโดยตรง ไม่ใช้หน้าคอนเทคในการควบคุมการไหลของไฟฟ้า
จะแบ่งอุปกรณ์ตามลักษณะการควบคุมแบบเดียวกับการควบคุมอุปกรณ์ใช้ไฟฟ้ากระแสตรง คือ
การควบคุมแบบนี้จะใช้การควบคุมแบบ 1 ทาง โดยควบคุมเฉพาะการจ่ายกระแสไฟฟ้า ทั้งนี้การควบคุมการจ่ายกระแสไฟฟ้าในระบบไฟฟ้ากระแสสลับจะมีด้วยกันหลายเทคนิค ดังนี้
ควบคุมมุมเฟส – ในไฟฟ้ากระแสสลับจะมีรูปคลื่นของแรงดันไฟฟ้าเป็นรูปคลื่นไซน์ เทคนิคการควบคุมมุมเฟสจะทำการดัดแปลงรูปคลื่นไซน์โดยจะมีส่วนหนึ่งของรูปคลื่นถูกตัดออกไป ทำให้อุปกรณ์ได้รับพลังงานไฟฟ้าไม่เต็มที่แล้วทำให้สามารถควบคุมอุปกรณ์นั้น ๆ ได้ การที่จะดัดแปลงรูปคลื่นไซน์ได้นั้น จะต้องมีการตรวจจับจุดแรงดัน 0V หรือที่เรียกว่า Zero Crossing แล้วหน่วงเวลาเพื่อให้ส่วนหนึ่งของรูปไซน์หายไป แล้วจึงเริ่มให้โซลิตสเตตรีเลย์จ่ายพลังงานไฟฟ้าเพื่อให้อุปกรณ์ที่ต้องการควบคุมได้รับพลังงานไฟฟ้าจากรูปคลื่นที่เหลือ การตัดรูปไซน์ไปในช่วงแรกจึงทำให้อุปกรณ์ได้รับพลังงานไฟฟ้าได้ไม่เต็มที่นั่นเอง
เทคนิคการควบคุมมุมเฟสอาจจะเรียกได้ว่า “เทคนิคการควบคุมไฟฟ้ากระแสสลับแบบธรรมชาติ” เนื่องจากอุปกรณ์ควบคุมความสว่างของหลอดไฟ ควบคุมความเร็วของมอเตอร์ AC ใช้เทคนิคการควบคุมมุมเฟสในการควบคุมอุปกรณ์ใช้ไฟฟ้ากระแสสลับแบบเดียวกัน
เทคนิคการควบคุมมุมเฟสจะต้องอาศัยวงจรอิเล็กทรอนิกส์ถึง 2 วงจร คือวงจรตรวจจับ Zero Crossing และวงจรโซลิตสเตตรีเลย์ แต่บอร์ดสำเร็จรูปที่ผลิตโดย RobotDyn ได้มีวงจรทั้ง 2 วงจรนี้ให้แล้ว ทำให้สามารถนำไปใช้งานได้ง่ายขึ้น
รูปที่ 8.6 โมดูล RobotDyn AC Light Dimmer Module
การใช้งาน สามารถต่อวงจรได้ดังนี้
หลังจากต่อวงจรเรียบร้อยแล้ว ขั้นตอนต่อไปคือการอัพโหลดโปรแกรมลงบอร์ด สามารถเข้าไปดาวน์โหลดโค้ดโปรแกรมใช้ทดลองได้ที่ https://goo.gl/TvGnCv จากนั้นนำมาอัพโหลดลงบอร์ด NodeMCU-32S ได้เลย
ผลของโปรแกรมคือหลอดไฟจะค่อย ๆ สว่างขึ้นเรื่อย ๆ จนสว่างสุดแล้วดับ จากนั้นจะสว่างขึ้นเรื่อย ๆ วนไปแบบนี้ไม่สิ้นสุด
สำหรับโค้ดโปรแกรมที่ได้ทดลองไปมีดังนี้ บางส่วนของโค้ดไม่มีในตัวอย่างและจำเป็นต้องอ่านคู่มืออย่างละเอียดเพื่อทำความเข้าใจฟังก์ชั่น แต่เนื่องจากในชุดบทความนี้เน้นเนื้อหาเบื้องต้นเพื่อนำไปใช้งาน โค้ดส่วนนั้นจึงไม่ได้ถูกนำมาอธิบายด้วย
บรรทัดที่ 1 ประกาศให้แทน PWM_PIN ด้วยเลข 23 ใช้กำหนดหมายเลขขา GPIO ที่ต่อกับขา PWM
บรรทัดที่ 2 ประกาศให้แทน Z_C_PIN ด้วยเลข 23 ใช้กำหนดหมายเลขขา GPIO ที่ต่อกับขา Z-C
บรรทัดที่ 4 ประกาศตัวแปร DimmerValue และให้มีค่าเป็น 100
บรรทัดที่ 6 สร้างออปเจค timer แบบพ้อยเตอร์ชนิด hw_timer_t
บรรทัดที่ 8 สร้างฟังก์ชั่นย่อย DimmerSetup()
บรรทัดที่ 9 – 28 คำสั่งต่าง ๆ ในฟังก์ชั่นย่อย ใช้ตั้งค่าให้โมดูลพร้อมใช้งาน
บรรทัดที่ 29 จบคำสั่งในฟังก์ชั่นย่อย DimmerSetup()
บรรทัดที่ 31 สร้างฟังก์ชั่น setup
บรรทัดที่ 32 เรียกใช้ฟังก์ชั่นย่อย DimmerSetup() เพื่อตั้งค่าต่าง ๆ ให้พร้อมใช้งานกับ RobotDyn AC Light Dimmer Module
บรรทัดที่ 33 จบคำสั่งในฟังก์ชั่น setup
บรรทัดที่ 35 สร้างฟังก์ชั่น loop
บรรทัดที่ 36 ใช้ Ternary Operators ตรวจสอบตัวแปร DimmerValue ว่าเป็น 0 หรือไม่ หากใช้ ส่งกลับค่า 100 แต่หากไม่ ส่งกลับค่า DimmerValue – 1 แล้วนำค่าที่ส่งกลับไปใส่ลงตัวแปร DimmerValue
บรรทัดที่ 37 หน่วงเวลา 10 มิลิวินาที หรือ 0.01 วินาที
บรรทัดที่ 38 จบคำสั่งในฟังก์ชั่น setup
ในการนำไปใช้งานจริงขอแค่มีส่วนหัว พร้อมเรียกฟังก์ชั่นย่อย DimmerSetup() ในฟังก์ชั่น setup ก็สามารถใช้งานได้แล้ว โดยการใช้งานเพียงกำหนดค่าที่ต้องการลงในตัวแปร DimmerValue ได้เลย หากค่า 100 หลอดไฟจะดับ และค่า 0 หลอดไฟจะติดสว่างสุด ทั้งนี้ค่าที่ตั้งในตัวแปร DimmerValue ต้องกำหนดค่าหลังเรียกใช้ฟังก์ชั่นย่อย DimmerSetup() แล้วเท่านั้น
ตัดแบ่งลูกคลื่น – คือการใช้สัญญาณ PWM ไปตัดแบ่งลูกคลื่นโดยตรง วิธีนี้จำเป็นต้องใช้ความถี่ PWM อย่างน้อย 10 เท่าของความความถี่ลูกคลื่น นั่นคือการใช้งานความถี่ตั้งแต่ประมาณ 500Hz ขึ้นไป สำหรับ ESP32 ที่สามารถใช้ความถี่ PWM ได้ในระดับ 100kHz จึงไม่มีปัญหาต่อการใช้งาน แต่การใช้เทคนิคนี้จะต้องต่อวงจรอิเล็กทรอนิกส์เอง เพราะไม่มีโมดูลสำเร็จรูปออกมาจำหน่ายในขณะนี้
สำหรับวงจรสามารถดูได้ดังนี้ สังเกตว่าวงจรมีหลักการง่าย ๆ คือใช้มอเฟสในการช๊อตวงจรเพื่อให้กระแสไฟฟ้าส่วนใหญ่ไปตกอยู่ที่หลอดไฟ แล้วทำให้หลอดไฟสว่างขึ้นมา
การควบคุมแบบมอเตอร์จะเป็นการควบคุมแบบ 2 ทาง คือควบคุมทิศทาง และควบคุมความเร็ว สำหรับมอเตอร์ไฟฟ้ากระแสสลับแต่ละตัวจะมีวงจรที่ใช้ควบคุมไม่เหมือนกัน การควบคุมเบื้องต้นคือหาวิธีควบคุมทิศทางก่อน จากนั้นจึงใช้วงจรแบบในหัวข้อที่ผ่านมาในการควบคุมความเร็วให้ได้ตามที่ต้องการ ทั้งนี้ควรคำนึงถึงกระแสไฟฟ้าที่ต้องการใช้เนื่องจากโซลิตสเตตรีเลย์ส่วนใหญ่รองรับกระแสไฟฟ้าไม่มาก ควรเลือกใช้โซลิตสเตตรีเลย์ที่รองรับกระแสไฟฟ้าได้เพียงพอสำหรับมอเตอร์
บทนี้เป็นการกล่าวถึงการควบคุมอุปกรณ์ต่าง ๆ โดยแยกหัวข้อเป็นอุปกรณ์ที่ใช้ไฟฟ้ากระแสตรงแรงดันต่ำ และอุปกรณ์ที่ใช้ไฟฟ้ากระแสสลับแรงดันสูง การควบคุมอุปกรณ์แต่ละตัวจะแตกต่างกันไป โดยส่วนใหญ่แล้วจะนิยมใช้งานโมดูลรีเลย์สำเร็จรูปเพื่อขับอุปกรณ์เหล่านั้น โดยข้อมูลในบทนี้จะปูพื้นฐานไปสู่การเขียนโปรแกรมเพื่อควบคุมอุปกรณ์ต่าง ๆ ต่อไป ผู้เขียนแนะนำให้ศึกษาข้อมูลของอุปกรณ์แต่ละตัวก่อนใช้งานทุกครั้ง และการทำงานกับไฟบ้าน หรือไฟฟ้ากระแสสลับมีอันตรายมาก ผู้อ่านควรตั้งสติก่อนทดลองทุกครั้ง