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

ใบงานประจำสัปดาห์ที่ 14 รายวิชาไมโครคอนโทรลเลอร์และไมโครโปรเซสเซอร์


-ของเดิมมีการเปิดข้อสอบตามเวลาใช้ 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,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 หรือ หรือสัญลักษณ ~) และเขียนโปรแกรมเพื่อควบคุม led อย่างน้อย 1 ดวงให้หรี่ไฟติดเริ่มจากดับไปจนถึงสว่างที่สุด
  • 2 (ต่อ) กำหนดให้เขียนโปรแกรมเพื่อสั่งงาน led ทั้ง 4 ดวงด้วยสัญญาณ analog โดยเขียนให้แสดงไฟหรี่ทีละดวงจากการสุ่มตำแหน่งที่ไม่เป็นรูปแบบ และแสดงผลคำด้วยว่าสุ่มได้เลขใดให้แสดงผ่าน serial monitor ด้วยคำว่า "My random is ?" ค่า ? คือเลขที่สุ่มได้ การเขียนเรียกใช้งานการสุ่มค่าตัวเลขให้ทำการเรียกใช้งาน function: randomSeed ด้วยเพื่อป้องกันการแสดงผลรูปแบบเดิม (กำหนดให้มีการวนซ้ำ)
  • 3 (ต่อ) กำหนดให้เขียนปรับปรุงโปรแกรมจากข้อย่อยที่ 2 ให้มีความสมบูรณ์มากขึ้น *หากนักเรียนนักศึกษาสังเกตเราจะพบว่าการเรียกใช้งานฟังชั่นการสุ่มค่าตัวเลขนั้น มีโอกาสที่เราจะสามารถสุ่มได้ตัวเลขเดิม ฉนั้นจากปัญหาดังกล่าวจึงกำหนดให้นักเรียนนักศึกษาเขียนโปรแกรมเพิ่มความสามารถ โดยไม่ให้มีการแสดงผลซ้ำติดต่อกัน กล่าวคือการแสดงผลที่ต่อเนื่องกันจะต้องไม่ซ้ำกัน เช่น ครั้งแรกสุ่มได้เลข 4 ครั้งที่สองสุ่มได้ 4 ติดกันในลักษณะนี้ถือว่าซ้ำซ้อนกัน
  • 4 (ต่อ) กำหนดให้เมื่อมีการปรับปรุงโปรแกรมแล้วจงเขียนแสดงผลคำที่ serial monitor ด้วยว่านักเรียนนักศึกษาได้ทำการเปลี่ยนค่าตัวเลขที่ซ้ำจากเลขใดเป็นเลขใด ตัวอย่าง "my change is 4 to 5" เลขที่ซ้ำก่อนหน้าคือ 4 ส่วนเลขที่แก้ไขคือ 5
  • 5 จงเขียนโปรแกรมกำหนดให้แสดงผลการสุ่ม led ออกมา 1 ดวงปรากฏขึ้นและดับลง แล้วเขียนให้ไฟวิ่งแบบดาวตกจำนวน 4 ดวงจากทางขวาไปทางซ้ายหรือซ้ายไปขวา(เลือกทางใดทางหนึ่งใช้งาน) แต่ต้องไม่แสดงผล led ดวงที่ถูกสุ่มไปแล้ว กล่าวคือการแสดงผลไฟดาวตกด้วย led 4 ดวงแต่ข้ามดวงที่ถูกสุ่มไปแล้ว 1 ดวง (การแสดงผล led เป็นไฟหรี่หรือไม่เป็นไฟหรี่ก็ได้)
  • 6 (ต่อ) จงเขียนโปรแกรมเพิ่มเติมให้แสดงผลคำที่ serial monitor ว่ามีการสุ่มได้ led ดวงใดด้วยคำว่า " LED index : ? " (? = ค่าที่แปรผันไป)




ความคิดเห็น

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

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

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

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