[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% หมายถึงสัญญาณเป็น "สูง" ตลอดเวลา
  • Trulli
  • ความถี่ของ 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 โดยละเอียด
  1. การส่ง output ในช่วงข้อมูลที่แตกต่างกันตั้งแต่จุดเริ่มต้นไปจนถึงค่าสูงสุด 0 -> nmax กล่าวคือ การเทียบบัญญัติไตรยางศ์ต่อแรงดันที่ส่ง output
  2. การส่งหรืออ่านค่า 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 ที่ตำแหน่งขาใดบ้าง การต่อสายผิดจะทำให้ค่าที่ผลลัพท์ที่ออกมาผิดพลาด

logic

- จากรูปด้านบนแสดงตำแหน่งขา 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 (ดวงไหนปรากฏให้แสดงผลคำดวงนั้นๆ)




ความคิดเห็น

โพสต์ยอดนิยมจากบล็อกนี้

ใบงาน รายวิชาโปรแกรมโครงสร้าง(ซัมเมอร์)

[16/07/67] ใบงานรายวิชาไมโครโปรเซสเซอร์และ ไมโครคอนโทรลเลอร์ สัปดาห์ที่ 9