[21/08/2567] ใบงานรายวิชาพื้นฐานการอินเตอร์เฟส สัปดาห์ที่ 14
ใบงานประจำสัปดาห์ รายวิชาพื้นฐานการอินเตอร์เฟส
จงเขียนไมโครคอนโทรลเลอร์ โดยกำหนดให้มีการสื่อสารระหว่างคอมพิวเตอร์และไมโครคอนโทรลเลอร์ ซึ่งเป็นอินเตอร์เฟสต่อกัน ให้ทำงานได้ตามเป้าหมายที่กำหนด และเชื่อมต่อกับ led โดยใช้งานคำสั่งที่ส่ง output สัญญาณ analog เพื่อควบคุม led ให้ได้ตามโจทย์ที่กำหนด. โดยใช้ความรู้ในการเขียนโปรแกรมพื้นฐานที่เรียนในสัปดาห์ที่ผ่านมา นำมาประยุกต์ใช้งาน if , if else , while ,for , switch case ให้นักเรียนนักศึกษาทำไปทีละข้อย่อย จนครบโจทย์ที่สมบูรณ์
การเขียนสัญญาณ analog โดยอาศัยสัญญาณ PWM ?
PWM (Pulse Width Modulation) ใน Arduino Uno เป็นเทคนิคที่ใช้ในการจำลองสัญญาณอะนาล็อกผ่านการเปลี่ยนแปลงความกว้างของพัลส์ดิจิทัล ซึ่ง PWM มีประโยชน์ในการควบคุมอุปกรณ์ต่างๆ เช่น การหรี่ไฟ LED การควบคุมความเร็วมอเตอร์ และการสร้างเสียงจากลำโพง
หลักการทำงานของ PWM
PWM คือการสร้างสัญญาณดิจิทัลที่มีการเปิดและปิด (on/off) อย่างรวดเร็ว โดยค่าของสัญญาณจะเป็น "สูง" (high) หรือ "ต่ำ" (low) ตลอดเวลา แต่ความกว้างของพัลส์ที่เป็น "สูง" จะเปลี่ยนแปลงได้เพื่อให้ได้ค่าระดับเฉลี่ยของแรงดันไฟฟ้าที่ส่งไปยัง output หากเรานำมัลติมิเตอร์ไปตรวจวัดที่บริเวณขาออกแล้ว เราจะได้แรงดันที่แปรผันไปตามข้อมูลที่กำหนด
- Duty Cycle: คือสัดส่วนระหว่างระยะเวลาที่สัญญาณเป็น "สูง" (high) ต่อระยะเวลารวมของสัญญาณ 1 รอบ ซึ่ง Duty Cycle จะถูกกำหนดเป็นเปอร์เซ็นต์ เช่น 0% หมายถึงสัญญาณเป็น "ต่ำ" ตลอดเวลา และ 100% หมายถึงสัญญาณเป็น "สูง" ตลอดเวลา
- ความถี่ของ PWM: คือจำนวนรอบของสัญญาณ PWM ต่อวินาที ซึ่งสำหรับ Arduino Uno ความถี่ของ PWM ที่ใช้ทั่วไปคือประมาณ 490 Hz สำหรับพิน 3, 9, 10, 11 และ 980 Hz สำหรับพิน 5, 6
การใช้งาน PWM ใน Arduino Uno
การใช้งาน PWM นั้นต้องมีการระบุขาที่รองรับการทำงานอย่างจัดเจนซึ่งนักเรียนนักศึกษาจำเป็นต้องทราบก่อนว่า ไมโครคอนโทรลเลอร์ที่เรากำลังใช้งานอยู่นั้นรองรับหรือไม่หากรองรับจะรองรับที่ตำแหน่งขาใดบ้าง Arduino Uno มีพินดิจิทัลที่สามารถใช้ PWM ได้คือ Pin 3, 5, 6, 9, 10, 11 ซึ่งคุณสามารถใช้คำสั่งโดยเขียนฟังก์ชัน analogWrite()
ในการส่งสัญญาณ PWM ไปยังพินนั้นๆ ได้ โดยกำหนดตำแหน่งขาที่ต้องการส่งออกไปและค่าที่ส่งไปจะอยู่ในช่วงข้อมูลที่ไมโครคอนโทรลเลอร์นั้นๆรองรับ ดังตัวอย่าง arduino uno จะรองรับการส่งออกข้อมูลที่ 8bit = 28 = 256 และมีช่วงข้อมูลที่ 0 ถึง 255
ตัวอย่างการใช้งาน: PWM เพื่อหรี่ไฟ LED โดยกำหนดการใช้งานในตำแหน่งขาที่ 9 ซึ่งขาที่ 9 ของ arduino uno นั้นรองรับการทำงานแบบ PWM (ตรวจสอบให้แน่ใจว่าตำแหน่งขาที่ใช้งานนั้นรองรับ)
int ledPin = 9; // กำหนดให้พิน 9 เป็นขาออกสำหรับ LED
void setup() {
pinMode(ledPin, OUTPUT); // กำหนดให้พิน 9 เป็นขาออก
}
void loop() {
for(int brightness = 0; brightness < 255; brightness++) {
analogWrite(ledPin, brightness); // เขียนค่า PWM ไปยังพิน 9
delay(10); // หน่วงเวลา 10 มิลลิวินาที
}
for(int brightness = 255; brightness > 0; brightness--) {
analogWrite(ledPin, brightness); // เขียนค่า PWM ไปยังพิน 9
delay(10); // หน่วงเวลา 10 มิลลิวินาที
}
}
ข้อดีของการใช้ PWM
- ประหยัดพลังงาน เนื่องจากอุปกรณ์ถูกเปิดและปิดเป็นช่วงๆ แทนที่จะต้องการแรงดันไฟฟ้าคงที่ตลอดเวลา
- ควบคุมอุปกรณ์ที่ต้องการสัญญาณอะนาล็อก เช่น มอเตอร์ หรือไฟ LED ได้อย่างมีประสิทธิภาพ
PWM จึงเป็นเครื่องมือที่มีประโยชน์มากสำหรับการควบคุมอุปกรณ์ใน Arduino Uno.
เว็บไซต์อธิบายการทำงานของ PWM โดยละเอียด
- การส่ง output ในช่วงข้อมูลที่แตกต่างกันตั้งแต่จุดเริ่มต้นไปจนถึงค่าสูงสุด 0 -> nmax กล่าวคือ การเทียบบัญญัติไตรยางศ์ต่อแรงดันที่ส่ง output
- การส่งหรืออ่านค่า pwm ที่อ่านได้จะถูกอ้างอิงจำนวน bit ที่ไมโครกำหนดไว้ คือค่าความละเอียดที่บอกว่ามีกี่ระดับ สามารถทำการตรวจเช็คโดยเปิดข้อมูลของไมโครคอนโทรลเลอร์เบอร์นั้นๆ ว่ารองรับการอ่านข้อมูลที่กี่บิต โดยยิ่งระดับ bit ยิ่งเยอะค่าความละเอียดก็จะมากขึ้นหรือละเอียดขึ้นนั้นเอง ดังแสดงตารางต่อไปนี้
bit | จำนวน | ขอบเขต |
---|---|---|
2 bit | 4 | 0 ถึง 3 |
4 bit | 16 | 0 ถึง 15 |
8 bit | 256 | 0 ถึง 255 |
10 bit | 1024 | 0 ถึง 1023 |
12 bit | 4096 | 0 ถึง 4095 |
- กำหนดให้นักเรียนนักศึกษาเชื่อมต่อ ไมโครคอนโทรลเลอร์ กับ led จำนวนทั้งหมด 4 ดวงและมีการเขียนคำสั่งเพื่อควบคุมสัญญาณ PWM ขอควรระวังการต่อใช้งาน analog output โดยนักเรียนนักศึกษาจะต้องทำการศึกษาว่าไมโครคอนโทรลเลอร์เบอร์นั้นๆ มีการร้องรับการใช้งาน analog output ที่ตำแหน่งขาใดบ้าง การต่อสายผิดจะทำให้ค่าที่ผลลัพท์ที่ออกมาผิดพลาด
- จากรูปด้านบนแสดงตำแหน่งขา pinout ของ arduino uno r3 โดยการใช้งาน analog output ให้เราเลือกขาที่เป็น PWM (Pulse Width Modulation) เป็นเทคนิคที่ทำให้เราสามารถอ่าน/เขียนข้อมูลแบบ analog ด้วยสัญญาณ digital ได้ โดยตัวควบคุมการสร้างสัญญาณดิจิตอล (Digital control) จะสร้างสัญญาณคลื่นสี่เหลี่ยมออกมา โดยสัญญาณที่สร้างออกมาจะสลับกันระหว่าง เปิด(HIGH) กับ ปิด(LOW) รูปแบบสัญญาณเปิด-ปิดนี้สามารถจำลองเป็นแรงดันไฟฟ้าระหว่าง เปิด (5 Volts) กับ ปิด (0 Volts) หรือสังเกตตำแหน่งขาโดยจะมีการใส่สัญลักษณ ~ ที่บริเวณบอร์ด arduino uno r3
- กำหนดให้ต่อไมโครคอนโทรลเลอร์กับ led จำนวน 4 ดวงในตำแหน่ง (PWM หรือสัญลักษณ ~ )ที่ตำแหน่งขาของบอร์ด arduino uno r3 เท่านั้น เพื่อทำการศึกษาใบงานเกี่ยวกับการเรียกใช้งานสัญญาณ analog ในฝั่ง output ซึ่ง analog output ของ arduino uno r3 จะมี Amplitude ที่ความละเอียดที่ 256 ระดับ
การเรียกใช้งาน analog โดยอ้างอิง code ดังต่อไปนี้
analogWrite(3,0-255);
- การเรียกใช้งานคำสั่ง analogWrite(ตำแหน่งขา analog, ระดับbit) โดยมีระดับการใช้งานตั้งแต่ 0-255 อ้างอิงจาก 0 volt ไปจนถึงค่าสูงสุด 5 volt หากเรากำหนดค่าระดับบิท ที่ 0 แรงดันที่ออกไปยัง led จะเป็น 0 volt และหากกำหนดค่าระดับบิทที่ 255 แรงดันที่ออกไปจะเป็น 5v แทน *การเปรียบเทียบนี้เป็นลักษณะเบื้อนต้นเท่านั้น เพื่อให้นักเรียนนักศึกษาเข้าใจได้ง่าย หากแต่การทำงานจริง จะเป็นการใช้งานสัญญาณ pwm ซึ่งไม่ได้ส่งค่าแรงดันที่ต่างดับกันโดยตรง กล่าวคือการกำหนดความกว้างของสัญญาณ Pulse เป็นค่า % โดยจะแปรผันตรงกับระดับบิทที่เรากำหนดซึ่งเทียบบัญญัติไตรยางค์ต่อกัน
ข้อมูลอ้างอิงเพิ่มเติม คลิ๊กได้!
- Arduino Pinout- Arduino PWM
- Arduino PWM ไทย
- เขียนให้สุ่ม Random
ให้นักเรียนนักศึกษาทำไปทีละข้อย่อย จนครบโจทย์ที่สมบูรณ์
- 1 กำหนดให้นักเรียนนักศึกษาทำการเชื่อมต่อไมโครคอนโทรลเลอร์ เข้ากับled จำนวนทั้งหมด 4 ดวง(ต่อในตำแหน่งขา PWM หรือ หรือสัญลักษณ ~) และทำการเขียน code เพื่อควบคุม led อย่างน้อย 1 ดวงให้หรี่ไฟตั้งแต่ดับไปจนถึงสว่างที่สุด กำหนดค่าระดับบิท 0 ถึง 255 (การแสดงผลทุกๆข้อย่อย ต้องเป็นการแสดงผลแบบไฟหรี่เท่านั้น)
- 2 กำหนดให้เขียนโปรแกรมเพื่อสั่งงาน led ทั้ง 4 ดวงด้วยสัญญาณ analog ผ่านการเขียนคำสั่งด้วย PWM โดยเขียนให้แสดงไฟหรี่ติดขึ้น จากการส่งข้อมูลผ่านอินเตอร์เฟส Serial port โดยกำหนดการรับค่าจาก keybord เมื่อป้อนข้อมูลเป็นตัวเลข 1 ถึง 4 แล้วให้ไฟ ณ ตำแหน่งนั้นๆติดขึ้น เช่นหากป้อนตัวเลข 3 แล้ว led ดวงที่ 3 จะแสดงผลไฟหรี่ด้วยการติดขึ้นแล้วค้างไว้ การพิมพ์ตัวเลขต้องสอดคล้องกับ led
- 3 (ต่อ) กำหนดให้เขียนโปรแกรมเพิ่มเติม หากค่าที่รับเข้ามานอกเหนือจากตัวเลขที่กำหนดให้แสดงผลคำว่า "Error Input " ที่ Serial monitor
- 4 กำหนดให้ปรับปรุงโปรแกรม โดยเมื่อรับค่าจาก keyboard เป็นตัวเลขที่เคยป้อนเข้ามาแล้ว และ led ที่กำลังแสดงผลค้างอยู่กำหนดให้ led ดวงนั้นๆค่อยๆหรี่ดับลงดับสนิด ( led ดวงอื่นๆต้องไม่มีผลกระทบ)
- 5 (ต่อ) เขียนโปรแกรมเพิ่มเติม หากมีการป้อนข้อมูลด้วยคำว่า "end" แล้วกำหนดให้ led ที่กำลังติดค้างอยู่ทั้งหมดให้หรี่ดับลง
ความคิดเห็น
แสดงความคิดเห็น