วันพุธที่ 20 สิงหาคม พ.ศ. 2557

การทดลองที่ 1.3 การตรวจวัดสัญญาณดิจิทัล-เอาต์พุตจากบอร์ด Arduino

การทดลองที่ 1.3 การตรวจวัดสัญญาณดิจิทัล-เอาต์พุตจากบอร์ด Arduino

จุดประสงค์
1. ศึกษาการใช้งานออสซิลโลสโคป เครื่องกำเนิดสัญญาณและบอร์ด Arduino
2. ศึกษารูปแบบลักษณะของสัญญาณดิจิทัล
3. วิเคราะห์การทำงานของบอร์ด Arduino โดยใช้โค้ดตัวอย่าง
4. วิเคราะห์การทำงานของคำสั่ง AnalogWrite() และคำสั่งจาก Servo Library

วัสดุ-อุปกรณ์
1. บอร์ด Arduino (พร้อมสายUSB)                      1 อัน
บอร์ด Arduino ที่ใช้เป็นบอร์ด DuinoLite ของห้องแล็ป ESL. 
มหาวิทยาลัยเทคโนโลยีพระจอมเกล้าพระนครเหนือ

2. สายไฟสําหรับต่อวงจร          1 ชุด
3. ออสซิลโลสโคปแบบดิจิทัล(พร้อมสายprobe)  1 เครื่อง

4. เครื่องกําเนิดสัญญาณ           1 เครื่อง


ขั้นตอนการทดลอง
1.Compile และ Uploadโค้ดตัวอย่างที่ 1.3.1ไปยังบอร์ด Arduino จากนั้นใช้ออสซิลโลสโคปวัดสัญญาณเอาต์พุตที่ได้ (รูปคลื่นแบบสี่เหลี่ยม) แล้วบันทึกภาพ (ให้ระบุ ความถี่ และ Duty Cycle ของสัญญาณที่วัดได้จริง)
Compile และ Uploadโค้ดไปยังบอร์ด Arduino
สามารถดูวิธีการเริ่มต้นใช้งานบอร์ด Arduino ได้ที่นี่

วัดสัญญาณเอาต์พุตด้วยออสซิลโลสโคป

ภาพที่ได้จะเป็นรูปคลื่นสี่เหลี่ยม และทำการบันทึกภาพ

ภาพขั้นตอนที่ 1 โดยรวม

2.ทำขั้นตอนที่ 1 ซ้ำ สัหรับโค้ตตัวอย่างที่ 1.3.2-1.3.4 ตามลำดับ

3.ใช้เครื่องกำเนิดสัญญาณ สร้างคลื่นแบบ PWM (รูปคลื่นแบบ Pulse) ที่มีความถี่ 50Hz มีค่า Duty Cycle 7.5% และมีระดับแรงดันต่ำและสูงในช่วง 0V และ 5V และให้ใช้ออสซิลโลสโคปตรวจดูรูปคลื่นสัญญาณที่ได้และบันทึกภาพที่ปรากฏ (เปรียบเทียบผลกับการสร้างสัญญาณเอาต์พุตด้วยบอร์ด Arduino)
ตั้งเครื่องกำเนิดสัญญาณให้มีรูปคลื่นแบบ Pulse, ความถี่ 50 Hz, 
ระดับแรงดันต่ำ = 0V, ระดับแรงดันสูง = 5V และมี Duty Cycle 50%

ใช้ออสซิลโลสโคปตรวจดูรูปคลื่นสัญญาณที่ได้และบันทึกภาพที่ปรากฏ

ผลการทดลอง
โค้ดที่ 1.3.1: โค้ด Arduino เพื่อสร้างสัญญาณเอาต์พุตที่ขา D5 (แบบที่ 1)
const byte LED_PIN = 5; // ใช ้ขาหมายเลข D 5 เพ ื่ อสร้ างส ั ญญ าณด ิ จิ ทั ล
void setup() {
     pinMode( LED_PIN, OUTPUT );  // ใช ้ขา D5 เป ็ นเอาต ์ พุ ต
}
void loop() {
   digitalWrite( LED_PIN, HIGH ); // ให ้เอาต ์ พุ ตท ี ่ ขา D5 เป ็ น High
   delay( 10 ); // รอเวลาประมาณ 10 ม ิ ลลิ วิ นาท ี
   digitalWrite( LED_PIN, LOW );  // ให ้เอาต ์ พุ ตท ี่ ขา D5 เป ็ น Low
   delay( 10 ); // รอเวลาประมาณ 10 ม ิ ลลิ วิ นาท ี
} 
ผลที่ได้จากโค้ดที่ 1.3.1
ภาพจากออสซิลโลสโคปเมื่อวัดที่ขา D5 เทียบกับ GND ของบอร์ด Arduino ที่Uploadโค้ดที่1.3.1

คาบ ( T ) = 4 ช่อง × 5 ms = 20 ms
ความถี่ ( f ) = 1/20ms = 50 Hz
Duty Cycle = [(2 ช่อง × 5 ms)/(4ช่อง × 5 ms)] × 100% = 50%

โค้ดที่ 1.3.2: โค้ด Arduino เพื่อสร้างสัญญาณเอาต์พุตที่ขา D5 (แบบที่ 2)
const byte LED_PIN = 5;
void setup() {
   pinMode( LED_PIN, OUTPUT );
}
void loop() {
   digitalWrite( LED_PIN, HIGH );
   digitalWrite( LED_PIN, LOW );
ผลที่ได้จากโค้ดที่ 1.3.2 
ภาพจากออสซิลโลสโคปเมื่อวัดที่ขา D5 เทียบกับ GND ของบอร์ด Arduino ที่Uploadโค้ดที่1.3.2

คาบ ( T ) = 5 ช่อง × 2 µs = 10 µs
ความถี่ ( f ) = 1/10µs = 100 kHz
Duty Cycle = [(2.4 ช่อง × 2 µs)/(5ช่อง × 2 µs)] × 100% = 48%

โค้ดที่ 1.3.3: โค้ด Arduino เพื่อสร้างสัญญาณเอาต์พุตที่ขา D5 (แบบที่ 3)
const byte LED_PIN = 5; / / Digit al Pin 5 ( D 5 )
void setup() {
  pinMode( LED_PIN, OUTPUT );  // ให ้ขาดิ จ ิ ทั ล D5 เป ็ นเอาต ์ พุ ต
  analogWrite( LED_PIN, 191 );  // สร ้ างสั ญญาณ PWM ท ี่ ขา D5
}
void loop() {
  // empty ( ไม ่ มี ค ํ าสั่ งใดๆ ในฟ ั งก ์ ชั น loop)
}
ผลที่ได้จากโค้ดที่ 1.3.3 
ภาพจากออสซิลโลสโคปเมื่อวัดที่ขา D5 เทียบกับ GND ของบอร์ด Arduino ที่Uploadโค้ดที่1.3.3

คาบ T = 5 ช่อง × 200 µs = 1 ms
ความถี่ ( f ) = 1/1ms = 1 kHz
Duty Cycle = [(3.8 ช่อง × 200 µs)/(5ช่อง × 200 µs)] × 100% = 76%

โค้ดที่ 1.3.4: โค้ด Arduino เพื่อสร้างสัญญาณเอาต์พุตที่ขา D5 (แบบที่ 4)
#include <Servo.h>
Servo servo;
int minPulse = 600;   // minimum servo position, in us
int maxPulse = 2400;  // maximum servo position, in us
void setup() {
  servo.attach( 5, minPulse, maxPulse ); // use D5 for PWM output (servo)
  servo.write( 90 ); // set rotation angle (value between 0 to 180 degree)
}
void loop() {
  // empty
}  
ผลที่ได้จากโค้ดที่ 1.3.4  
ภาพจากออสซิลโลสโคปเมื่อวัดที่ขา D5 เทียบกับ GND ของบอร์ด Arduino ที่Uploadโค้ดที่1.3.4

คาบ ( T ) = 10 ช่อง × 2 ms = 20 ms
ความถี่ ( f ) = 1/20ms = 50 Hz
Duty Cycle = [(0.8 ช่อง × 2 ms)/(10ช่อง × 5 ms)] × 100% = 8%

สัญญาณที่เกิดจากเครื่องกำเนิดสัญญาณ
ภาพจากออสซิลโลสโคปเมื่อวัดสัญญาณจากเครื่องกำเนิดสัญญาณ

คาบ ( T ) = 10 ช่อง × 2 ms = 20 ms
ความถี่ ( f ) = 1/20ms = 50 Hz
Duty Cycle = [(0.75 ช่อง × 2 ms)/(10ช่อง × 5 ms)] × 100% = 7.5%

คำถามท้ายการทดลอง
1. จงอธิบายความแตกต่างของสัญญาณเอาต์พุต (ขา D5) ของบอร์ด Arduino ที่ได้จากโค้ดตัวอย่างใน แต่ละกรณี (ให้เปรียบเทียบค่า Duty Cycle และความถี่ของสัญญาณเอาต์พุตที่ได้ในแต่ละกรณี)
โค้ดที่ 1.3.1             ความถี่ 50 Hz              Duty Cycle = 50%
โค้ดที่ 1.3.2             ความถี่ 100 kHz          Duty Cycle = 48%
โค้ดที่ 1.3.3             ความถี่ 1 kHz              Duty Cycle = 76%
โค้ดที่ 1.3.4             ความถี่ 50 Hz              Duty Cycle = 8%

2.มีขาใดบ้างของบอร์ด Arduino ในการทดลอง นอกจากขา D5 ที่สามารถใช้สร้างสัญญาณ PWM ด้วย คําสั่ง analogWrite()
สำหรับบอร์ด arduino ส่วนใหญ่ที่มีไมโครคอนโทรเลอร์เอบร์ ATmega168 หรือ ATmega328 เช่นเดียวกับ DuinoLite ของแล็ป ESL. สามารถใช้คำสั่งนี้ได้บนขา D3, D6, D9, D10, D11 และขาฝั่งแอนะล็อก

3.ถ้าต้องการจะสร้างสัญญาณแบบ PWM ที่มีค่า Duty Cycle 20% และ 80% ที่ขา D5 และ D10 ตามลําดับ โดยใช้คําสั่ง analogWrite() จะต้องเขียนโค้ด Arduino อย่างไร (เขียนโค้ดสําหรับ Arduino Sketch ให้ครบถ้วน สาธิตและตรวจสอบความถูกต้องโดยใช้ออสซิลโลสโคปหรือเครอื่ง วิเคราะห์สัญญาณดิจิทัล)

ภาพโค้ดที่ใช้สร้างสัญญาณแบบ PWM ที่มีค่า Duty Cycle 20% และ 80% ที่ขา D5 และ D10 
ตามลําดับ สำหรับโปรแกรม Arduino Sketch

ภาพ Upload โค้ดลงบนบอร์ด Arduino และใช้สายไฟต่อจากport D5, D10 และ GND 
เพื่อต่อกับสายโพรบของออสซิลโลสโคป

อ่านค่าจากออสซิลโลสโคปและบันทึกรูปสัญญาณ

ภาพโดยรวม

ภาพสัญญาณที่ออกจากขา D5 ของบอร์ด Arduino 

ภาพสัญญาณที่ออกจากขา D10 ของบอร์ด Arduino 

4.สัญญาณเอาต์พุตที่ได้จากการใช้คําสั่งของ Servo Library มีความถี่เท่าไหร
50 Hz

อ้างอิง: เอกสารการทดลองที่ 1.3 การตรวจวัดสัญญาณดิจิทัล-เอาต์พุตจากบอร์ด Arduino 
โดย ดร.เรวัต ศิริโภคาภิรมย์ ห้องปฏิบัติการระบบสมองกลฝังตัว(ESL.) มจพ.

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

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