วัตถุประสงค์
- ฝึกทักษะในการต่อบอร์ด Arduino
- ฝึกการใช้ออสซิลโลสโคป เพื่อตรวจดูรูปคลื่นสัญญาณและวิเคราะห์การทำงานของบอร์ด Arduino โดยใช้โค้ดตัวอย่าง
- เข้าใจการใช้คำสั่ง analogWrite ใน Arduino
- บอร์ด Arduino 1 อัน
- สายไฟต่อวงจร 1 ชุด
- ออสซิลโลสโคปแบบดิจิทัล 1 เครื่อง
- เครื่องกำเนิดสัญญาณ 1 เครื่อง
1. คอมไพล์โค้ดตัวอย่างที่ 1.2.1 แล้วอัพโหลดไปยังบอร์ด Arduino จากนั้นใช้ออสซิลโลสโคปวัดสัญญษณ output ที่ได้(รูปคลื่นแบบสี่เหลี่ยม) แล้วบันทึกภาพ (ให้ระบุ ความถี่ และค่า Duty Cycle ของสัญญาณตามที่วัดได้จริง)
Duty Cycle(%) = 100%*(ความกว้างของคลื่นในช่วงที่เป็น High / คาบสัญญาณ)
2. ทำขั้นตอนที่ 1 ซ้ำ สำหรับโค้ดตัวอย่างที่ 1.3.2 - 1.3.4 ตามลำดับ
3. ใช้เครื่องกำเนิดสัญญาณ สร้างคลื่นแบบ PWM (รูปคลื่นแบบ Pulse) ความถี่ 50 Hz มีค่า Duty Cycle = 7.5% และมีระดับแรงดันต่ำและสูงในช่วง 0V และ 5V แล้วใช้ออสซิลโลสโคปตรวจดูรูปคลื่นสัญญาณที่ได้และบันทึกภาพที่ปรากฏ (เปรียบเทียบผลการสร้างสัญญาณเอาต์พุตด้วยบอร์ด Arduino)
ผลการทดลอง
โค้ดที่ 1.3.1: โค้ด Arduino เพื่อสร้างสัญญาณเอาต์พุตที่ขา D5 (แบบที่1)
const byte LED_PIN=5; //ใช้ขาหมายเลข D5 เพื่อสร้างสัญญาณดิจิทัล
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 มิลลิวินาที
}
T = 4*5ms = 20ms
f = 1/T = 1/20ms = 50 Hz
Duty Cycle = 100%*(10ms/20ms) = 50%
------------------------------------------->O<-------------------------------------------
โค้ดที่ 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);
}
T = 2*5us = 10us
f = 1/T = 1/10us = 100 kHz
Duty Cycle = 100%*(4.6us/10us) = 46%
-------------------------------------------@-@-------------------------------------------
โค้ดที่ 1.3.3: โค้ด Arduino
const byte LED_PIN=5; //ใช้ขาหมายเลข D5 เพื่อสร้างสัญญาณดิจิทัล
void setup(){
pinMode(LED_PIN,OUTPUT); //ใช้ขา D5 เป็นเอาต์พุต
analogWrite(LED_PIN,191);
void loop(){
}
T = 2*500us = 1ms
f = 1/T = 1/1ms = 1 kHz
Duty Cycle = 100%*(725us/1ms) = 72.5%
------------------------------------------- =.= ---------------------------------------
โค้ดที่ 1.3.4: โค้ด Arduino
#include<Servo.h>
Servo servo;
int minPulse=600;
int maxPulse=2400;
void setup(){
servo.attach(5,minPulse,maxPulse);
servo.write(90);
} void loop(){
}
T = 4*5ms = 20ms
f = 1/T = 1/20ms = 50 Hz
Duty Cycle = 100%*(1.6/20) = 8%
-------------------------------------------*O*-------------------------------------------
คำถามท้ายการทดลอง
1. จงอธิบายความแตกต่างของสัญญาณเอาต์พุต (ขาD5) ของบอร์ด Arduino ที่ได้จากโค้ดตัวอย่างในแต่ละกรณี (ให้เปรียบเทียบค่า Duty Cycle และความถี่ของสัญญาณเอาต์พุตที่ได้ในแต่ละกรณี)
ตอบ คำสั่ง delay ใน Arduino จะทำให้ความค่าความถี่เปลี่ยนไป คือเมื่อมีคำสั่ง delay (1.3.1)ค่าความถี่จะน้อยลงกว่าโค้ดที่ไม่มีคำสั่ง(1.3.2) เนื่องจากความเร็วในการส่งสัญญาณ ส่วนค่า Duty Cycle จะใกล้เคียงกัน
โค้ด 1.3.1 : f = 50 Hz Duty Cycle = 50%
โค้ด 1.3.1 : f = 100 kHz Duty Cycle = 46%
analogWrite() จะรับตัวแปลสองค่า คือ ตัวเอาต์พุต และ ค่า analog
ค่า analog เทียบได้กับค่า Duty Cycle คือ ใน Duty Cycle 100% เท่ากับ ค่าใน analogWrite 255
โค้ด 1.3.3 : f = 1 kHz Duty Cycle = 72.5%
โค้ด 1.3.4 : f = 50 Hz Duty Cycle = 8%
2. มีขาใดบ้างในบอร์ด Arduino ในการทดลอง นอกจากขา D5 ที่สามารถใช้สร้างสัญญาณ PWM ด้วยคำสั่ง analogWrite()
ตอบ บนบอร์ด Arduino (ATmega168 หรือ ATmega32) มีการทำงานฟังก์ชันบนขา 5,6,9,10 และ 11
แต่ว่าถ้าเป็นขา 5 กับ 6 มันจะมีhigher-than-expected duty cycles บน Arduino Mega จะมีการทำงานบนขา 2-13 และ 44-46 ส่วนในบอร์ที่เก่ากว่ามีแค่ ATmega8 เท่านั้นที่สนับสนุน analogWrite() บนขา 9,10,11
3. ถ้าต้องการสร้างสัญญาณ PWM ที่มีค่า Duty Cycle 20% และ 80% ที่ขา D5 และ D10 ตามลำดับ โดยใช้คำสั่ง analogWrite() จะต้องเขียนโค้ด Arduino อย่างไร (เขียนโค้ดสำหรับ Arduino Sketch ให้ครบถ้วน สาธิตและตรวจสอบความถูกต้องโดยใช้ออสซิลโลสโคปหรือเครื่องวิเคราะห์สัญญาณดิจิทัล)
ตอบ ค่า Duty Cycle 100% = ค่าใน analogWrite() 255
จะได้ว่า ที่ D5 Duty Cycle 20% = analogwrite() 255*20/100 = 51
จะได้ว่า ที่ D10 Duty Cycle 80% = analogwrite() 255*80/100 = 204
โค้ด Arduino Sketch
const byte LED_PIN=5; //ใช้ขาหมายเลข D5 เพื่อสร้างสัญญาณดิจิทัล
const byte LED_PIN_2=10; //ใช้ขาหมายเลข D10 เพื่อสร้างสัญญาณดิจิทัล
void setup(){
pinMode(LED_PIN,OUTPUT); //ใช้ขา D5 เป็นเอาต์พุต
analogWrite(LED_PIN,51);
pinMode(LED_PIN,OUTPUT); //ใช้ขา D10 เป็นเอาต์พุต
analogWrite(LED_PIN_2,204);
void loop(){
}
สาธิตและตรวจสอบความถูกต้อง
4.สัญญาณเอาต์พุตที่ได้จากการใช้คำสั่งของ Servo Library มีความถี่เท่าใด
ตอบ 50 Hz





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