วันพฤหัสบดีที่ 30 พฤศจิกายน พ.ศ. 2560

การเขียนโปรแกรมเบื้องต้นกับ Arduino (การส่งค่าสัญญาณ PWM)

ไม่มีความคิดเห็น

PWM(Pulse Width Modulation) คือ อะไร

PWM คือเทคนิดการส่งสัญญาณแบบสวิต หรือ ส่งค่าดิจิตอล 0-1 โดยให้สัญญาณความถี่คงที่ การควบคุมระยะเวลาสัญญาณสูงและสัญญาณต่ำ ที่ต่างกัน ก็จะทำให้ค่าแรงดันเฉลี่ยของสัญญาณสวิต ต่างกันด้วย อย่างเช่น ดูภาพประกอบ
pwm
  • ถ้าอยากให้ Vout ออกมา 0 โวลต์ เราก็ให้ระยะเวลาสัญญาณ LOW เต็มคาบเวลา
  • ถ้าอยากให้ Vout ออกมา 25% เราก็ให้สัญญาณ HIGH 25 % และ สัญญาณ LOW 75%
  • และ ถ้าอยากให้ Vout ออกมา 50% เราให้ระยะเวลาของสัญญาณ HIGH และ LOW เท่ากัน ก็จะได้ค่าเป็น 2.5 โวลต์
  • เช่นเดียวกัน ถ้าเราอยากให้ Vout ออกมา 75% เราให้ระยะสัญญาณ HIGH เป็น 75%  และ สัญญาณ LOW 25%
  • ซึ่งสุดท้าย ถ้าเราอยากให้ Vout ออกมา 5 โวลต์ เราเปิดสัญญาณ HIGH เต็มคาบเวลา
สำหรับโมดุล PWM ของ Arduino มีความละเอียด 8 bit หรือ ปรับได้ 255 ระดับ ดังนั้นค่าสัญญาณ 0 โวลต์ถึง 5 โวลต์ จะถูกแสดงเป็นสัญญาณแบบดิจิตอล จะได้ 0 ถึง 255 ซึ่งเราสามารถเทียบสัดส่วนคำนวนจากเลขจริง เป็น เลขทางดิจิตอลได้

<Lab 1> การหรี่ไฟ (Fade LED)

การหรี่ไฟ LED เราเทคนิดของ PWM เพื่อควบคุมการจ่ายไฟ โดยเราจะใช้คำสั่ง analogWrite(pin ,[0 – 255] ) โดยบอร์ด FunBasic จะต่อ LED ใช้งานในขา 6,9,10,11 นะครับ
// สำหรับบอร์ด Arduino ช่อง PWM บนบอร์ดสามารถใช้ช่อง 3,5,6,9,10,11
// บน Funbasic I/O Shiled ใช้ได้ช่อง 6,9,10,11
int ledPin = 6;
void setup() {
  // put your setup code here, to run once:
  pinMode(ledPin, OUTPUT); // Set ledPin to an output
}
void loop() {
  // put your main code here, to run repeatedly:
  // ตั้งค่าให้ Value = 0 ไฟจะออกประมาณ 0 โวลต์ ทำให้ LED ดับ
  analogWrite(ledPin, 0); // Sets voltage to 0V (0/255 * 5V). LED is off.
  delay(1000); // Wait a second
  // ตั้งค่าให้ Value = 64 ไฟจะออกประมาณ 1.25 โวลต์ ทำให้ LED สว่างเล็กน้อย
  analogWrite(ledPin, 64); // Sets voltage to ~1.25V (64/255 * 5V). Pretty dim.
  delay(1000); // Wait a second
  // ตั้งค่าให้ Value = 128 ไฟจะออกประมาณ 2.5 โวลต์ ทำให้ LED สว่างปานกลาง
  analogWrite(ledPin, 128); // Set voltage to ~2.5V. Half-bright.
  delay(1000); // Wait a second
  // ตั้งค่าให้ Value = 192 ไฟจะออกประมาณ 3.75 โวลต์ ทำให้ LED สว่างเกือบจะสุด
  analogWrite(ledPin, 192); // Set voltage to ~3.75V. Getting brighter!
  delay(1000); // Wait a second
  // ตั้งค่าให้ Value = 255 ไฟจะออกประมาณ 5 โวลต์ ทำให้ LED สว่างสุด
  analogWrite(ledPin, 255); // Set voltage to 5V. Fully on (turn down for what!?).
  delay(1000); // Wait a second
}
จากโค๊ด เราสามารถทดลองเล่นเปลี่ยน LED ไป หรี่ที่ดวงอื่นได้ โดยการเปลี่ยนค่าในตัวแปร ledPin นะครับ ทดลองเล่นดูครับ

<Lab 2> การหรี่ไฟแบบนุ่มนวล (Smooth Fade LED)

จะเห็นได้ว่า ในการทดลองครั้งแรก LED เราจะค่อยๆ หรี่ลงมาเป็น step ที่จริงเราสามารถ ประยุกต์ใช้ for-loop มาช่วยทำได้ มาลองกันดู
// สำหรับบอร์ด Arduino ช่อง PWM บนบอร์ดสามารถใช้ช่อง 3,5,6,9,10,11
// บน Funbasic I/O Shield ใช้ได้ช่อง 6,9,10,11
int ledPin = 6;    // LED connected to digital pin 6
void setup() {
  // nothing happens in setup
}
void loop() {
  // fade in from min to max in increments of 5 points:
  // เราใช้ for-loop เพื่อ เพิ่มค่าที่ล่ะ 5
  for (int fadeValue = 0 ; fadeValue <= 255; fadeValue += 5) {
    // sets the value (range from 0 to 255):
    analogWrite(ledPin, fadeValue);
    // wait for 30 milliseconds to see the dimming effect
    delay(30);
  }
  // fade out from max to min in increments of 5 points:
  // เราใช้ for-loop เพื่อ ลดค่าที่ล่ะ 5 
  for (int fadeValue = 255 ; fadeValue >= 0; fadeValue -= 5) {
    // sets the value (range from 0 to 255):
    analogWrite(ledPin, fadeValue);
    // wait for 30 milliseconds to see the dimming effect
    delay(30);
  }
}
สิ่งที่สามารถนำ PWM หรือ การใช้งาน analogWrite() ไปประยุกต์ได้ เช่น ความเร็วมอเตอร์ ความสว่างของไฟ ระดับความร้อน เป็นต้น ถ้ามีส่วนใดบทความ หรือ มีความคิดเห็นประการใด ติชมได้ครับ


ไม่มีความคิดเห็น :

แสดงความคิดเห็น