[11/08/2567] ใบงานรายวิชาไมโครคอนโทรลเลอร์และโปรเซส สัปดาห์ที่ 13
ใบงานประจำสัปดาห์ที่ 13 รายวิชาไมโครคอนโทรลเลอร์และไมโครโปรเซสเซอร์
-ของเดิมมีการเปิดข้อสอบตามเวลาใช้ javascript อันนี้ลบออกแล้ว
-แก้ไขตัวนับเวลา
-เพิ่มเนื้อหาเกี่ยวกับ pwm
-แสดง code การใช้งาน analogwrite
-ออกโจทย์ใหม่
จงเขียนไมโครคอนโทรลเลอร์ โดยกำหนดให้เชื่อมต่อกับ 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,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 จำนวนทั้งหมด 3 ดวง(ต่อในตำแหน่งขา PWM หรือ หรือสัญลักษณ ~) และทำการเขียน code เพื่อควบคุม led อย่างน้อย 1 ดวงให้หรี่ไฟตั้งแต่ดับไปจนถึงสว่างที่สุดใช้งาน PWM (การแสดงผลทุกๆข้อย่อย ต้องเป็นการแสดงผลแบบไฟหรี่เท่านั้น)
- 2 (ต่อ) กำหนดให้เขียนโปรแกรมเพื่อสั่งงาน led ทั้ง 3 ดวงด้วยสัญญาณ analog โดยเขียนให้แสดงไฟหรี่ทีละดวงจากทางขวาไปทางซ้าย หรือทางซ้ายไปทางขวา(เลือกทางใดทางหนึ่ง)ครบทั้ง 3 ดวง จน led ทั้ง 3 ดวงติดค้างไว้
- 3 (ต่อ) กำหนดให้เขียนโปรแกรมหรี่ไฟดับจากตำแหน่งล่าสุดกลับไปยังตำแหน่งเริ่มต้น จน led ทุกดวงดับทั้งหมดในที่สุด (ต้องดับสนิทเท่านั้น)
- 4 (ต่อ) กำหนดให้ข้อ 2, 3 ทำงานวนซ้ำแบบไม่กำหนดรอบ และเมื่อ led ทั้ง 3 ดวงดับหมดแล้วให้ทำการแสดงข้อความการนับรอบการทำงานที่ serial monitor ด้วยคำว่า "cycle : ?" ? คือค่าจำนวนรอบที่นับ
- 5 (แจ้งครูผู้สอนส่งใบงานที่ 4 ให้เรียบร้อย) ใบงานในหัวข้อที่ 5 นี้จะไม่เกี่ยวข้อกับข้อย่อยที่ 2,3,4 โดยกำหนดใหม่ เป็นการแสดงผลที่ไม่เป็นรูปแบบ(สุ่มปรากฏ) กำหนดให้นักเรียนนักศึกษาเขียนโปรแกรมคำสั่งให้แสดงผลไฟหรี led (pwm) ครั้งละ 1 ดวงโดยแสดงผลแบบสุ่มตำแหน่งจาก led 3 ดวง ไม่มีการกำหนดรูปแบบการแสดงผลตายตัว
- 6 (ต่อ) เมื่อ led ดวงใดๆปรากฏ ให้แสดงผลคำใน Serial monitor ด้วยคำว่า index ? (? คือตำแหน่งนั้นๆมีทั้งหมดแค่ 4 ตำแหน่ง) เช่น สุ่มได้ led ดวงที่ 1 ปรากฏแสดงคำว่า index 1 (ดวงไหนปรากฏให้แสดงผลคำดวงนั้นๆ)
ความคิดเห็น
แสดงความคิดเห็น