วันอังคารที่ 26 สิงหาคม พ.ศ. 2557

การทดลองที่ 2.2 การส้รางลอจิเกตพื้นฐานโดยใช้ไอซี 74HCT00

การทดลองที่ 2.2 การส้รางลอจิเกตพื้นฐานโดยใช้ไอซี 74HCT00

วัตถุประสงค์
1. ฝึกต่อวงจรโดยใช้ไอซีลอจิก 74HCT00 บนเบรดบอร์ด
2. สร้างลอจิกเกตพื้นฐาน เช่น เกต OR AND และ NOR หรือตามฟังก์ชั่นบูลีนที่กำหนดให้ โดยใช้ลอจิกเกต NAND ที่มีอยู่ในไอซี 74HCT00
3. ต่อวงจรปุ่มกดเพื่อใช้เป็นอินพุต และต่อวงจรไดโอดเปล่งแสงพร้อมตัวต้านทานเพื่อใช้เป็นเอาต์พุต

รายการอุปกรณ์
1. แผงต่อวงจร (เบรดบอร์ด)              1 อัน
2. ไอซี 74HCT00                          1 ตัว (สามารถศึกษา Data Sheet ได้ที่นี่)
3. ปุ่มกดแบบสี่ขา                             2 ตัว
4. ไดโอดเปล่งแสงขนาด 5 มม.            1 ตัว
5. ตัวต้านทาน 10 kΩ                       2 ตัว
6. ตัวต้านทาน 330 Ω หรือ 470 Ω     1 ตัว
7. สายไฟสำหรับต่อวงจร                    1 ชุด
8. แหล่งจ่ายควบคุมแรงดัน                 1 ชุด

ขั้นตอนการทดลอง
1. ออกแบบและวาดผังวงจร สาํหรับสร้างลอจิกเกตที่มีอินพุตสองขาและเอาต์พุตหนึ่งขา โดยใช้ไอซี 74HCT00 เพียงตัวเดียวเท่านั้น โดยแบ่งเป็นสามกรณี ไดแ้ก่ AND OR และ NOR พร้อมวงจรปุ่มกด ที่มีตัวต้านทาน 10kΩ แบบ Pull-Up จํานวน 2 ชุด (SW1 และ SW2) สําหรับขาอินพุตทั้งสองของ ลอจิกเกต และวงจรไดโอดเปล่งแสง (LED1) พร้อมตัวต้านทาน 330Ω หรือ 470Ω เพื่อใช้แสดง สถานะสําหรับเอาต์พุต

2. ต่อวงจรบนเบรดบอร์ดตามที่ได้ออกแบบไว้ เพื่อสร้างลอจิกเกต AND และมีวงจรปุ่มกด SW1 และ SW2 เพื่อใช้เป็นอินพุต และวงจรไดโอดเปล่งแสง LED1 เพื่อใช้แสดงสถานะสําหรับเอาต์พุต

3. สร้างอินพุตทั้งสองขาของลอจิกเกต ให้ครบ 4 กรณี แล้วสงัเกตผลที่ได้ บันทึกผลลงในตารางที่ 2.1.1

4. ยกเลิกการต่อวงจรบนเบรดบอร์ด

5. ต่อวงจรบนเบรดบอร์ดตามที่ได้ออกแบบไว้ เพื่อสร้างลอจิกเกต OR และมีวงจรปุ่มกด SW1 และ SW2 เพื่อใช้เป็นอินพุต และวงจรไดโอดเปล่งแสง LED1 เพื่อใช้แสดงสถานะสําหรับเอาต์พุต

6. สร้างอินพุตทั้งสองขาของลอจิกเกต ให้ครบ 4 กรณี แล้วสงัเกตผลที่ได้ บันทึกผลลงในตารางที่ 2.1.2

7. ยกเลิกการต่อวงจรบนเบรดบอร์ด

8. ต่อวงจรบนเบรดบอร์ดตามที่ได้ออกแบบไว้ เพื่อสร้างลอจิกเกต NOR และมีวงจรปุ่มกด SW1 และ SW2 เพื่อใช้เป็นอินพุต และวงจรไดโอดเปล่งแสง LED1 เพื่อใช้แสดงสถานะสําหรับเอาต์พุต

9. สร้างอินพุตทั้งสองขาของลอจิกเกต ให้ครบ 4 กรณี แล้วสังเกตผลที่ได้ บันทึกผลลงในตารางที่ 2.1.3

ผลการทดลอง
วงจรลอจิกเกต AND
ออกแบบวงจรด้วยโปรแกรม Fritzing

วงจรลอจิกเกต AND Schematic View

วงจรลอจิกเกต AND Breadboard View

วงจรที่ต่อบนเบรดบอร์ด

ตารางผลการทดลองสำหรับวงจรลอจิกเกต AND

ปุ่มกด SW1

ปุ่มกด SW2

สถานะของไดโอดเปล่งแสง (ติด/ดับ)

ไม่กด (1) ไม่กด (1) ติด
กด (0) ไม่กด (1) ดับ
ไม่กด (1) กด (0) ดับ
กด (0) กด (0) ดับ


ไม่กดทั้ง 2 สวิตซ์

กดสวิตซ์ SW1

กดสวิตซ์ SW2

กดทั้งสวิตซ์ SW1 และ SW2

วงจรลอจิกเกต OR
ออกแบบวงจรด้วยโปรแกรม Fritzing

วงจรลอจิกเกต AND Schematic View

วงจรลอจิกเกต AND Breadboard View

วงจรที่ต่อบนเบรดบอร์ด


ตารางผลการทดลองสำหรับวงจรลอจิกเกต OR

ปุ่มกด SW1

ปุ่มกด SW2

สถานะของไดโอดเปล่งแสง (ติด/ดับ)

ไม่กด (1) ไม่กด (1) ติด
กด (0) ไม่กด (1) ติด
ไม่กด (1) กด (0) ติด
กด (0) กด (0) ดับ


ไม่กดทั้ง 2 สวิตซ์

กดสวิตซ์ SW1

กดสวิตซ์ SW2

กดทั้งสวิตซ์ SW1 และ SW2

วงจรลอจิกเกต NOR
ออกแบบวงจรด้วยโปรแกรม Fritzing

วงจรลอจิกเกต AND Schematic View

วงจรลอจิกเกต AND Breadboard View

วงจรที่ต่อบนเบรดบอร์ด


ตารางผลการทดลองสำหรับวงจรลอจิกเกต NOR

ปุ่มกด SW1

ปุ่มกด SW2

สถานะของไดโอดเปล่งแสง (ติด/ดับ)

ไม่กด (1) ไม่กด (1) ดับ
กด (0) ไม่กด (1) ดับ
ไม่กด (1) กด (0) ดับ
กด (0) กด (0) ติด


ไม่กดทั้ง 2 สวิตซ์


กดสวิตซ์ SW1


กดสวิตซ์ SW2


กดทั้งสวิตซ์ SW1 และ SW2

คำถามท้ายการทดลอง
1. จากผลการทดลองต่อวงจรสําหรับสร้างลอจกิเกต AND OR และ NOR ตามลําดับ เป็นไปตามตาราง ค่าความจริงสําหรับลอจิกเกตดังกล่าวหรือไม่ จงอธิบาย
เป็นไปตามตารางค่าความจริงของลอจิกเกตดังกล่าว เพราะ เมื่อกำหนดให้สวิตซ์ที่ไม่ได้กดมีค่าความจริงเป็น 1 สวิตซ์ที่กดมีค่าความจริงเป็น 0 และให้สถานะไฟติดมีค่าความจริงคือ 1 ไฟดับคือ 0 แล้ว ค่าความจริงในตารางผลการทดลองวงจรลอจิกเกตทั้ง 3 ชนิด จะมีค่าตรงกับคุณสมบัติของลอจิกเกตแต่ละชนิด ดังนี้

ลอจิกเกต AND

SW1

SW2

AND

1 1 1
1 0 0
0 1 0
0 0 0

ลอจิกเกต OR

SW1

SW2

OR

1 1 1
1 0 1
0 1 1
0 0 0

ลอจิกเกต NOR

SW1

SW2

NOR

1 1 0
1 0 0
0 1 0
0 0 1


2. เมื่อต่อวงจรปุ่มกดที่มีตัวต้านทาน 10kΩ แบบ Pull-Down (แทน Pull-Up) เพื่อสร้างสัญญาณอินพุต ให้ลอจิกเกต จะให้ผลแตกต่างจากที่ได้ทดลองไปหรือไม่ จงอธิบาย
การต่อวงจรปุ่มกดแบบ Pull-Down จะให้ผลการทดลองแตกต่างกับการต่อแบบ Pull-Up เนื่องจากในวงจร Pull-Up นั้นเมื่อยังไม่ได้กดสวิตซ์ก็ยังมีกระแสไหลอยู่ในวงจร เมื่อวัดแรงดันที่ขา Output เทียบกับ GND จะได้แรงดันเป็นค่า High ซึ่งมีค่าลอจิกเป็น "1" แต่เมื่อกดสวิตซ์จะทำให้กระแสไหลลง GND ทำให้ค่าแรงดันที่วัดเป็นค่า Low ซึ่งมีค่าลอจิกเป็น "0"
ในทางกลับกัน วงจรแบบ Pull-Down เมื่อยังไม่กดสวิตซ์จะยังไม่มีกระแสไหลในวงจร ค่าแรงดันระหว่างขา Output เทียบกับ GND จึงเป็นค่า Low ซึ่งมีลอจิกเป็น "0" และเมื่อกดสวิตซ์กระแสจะไหลเข้าวงจรทำให้มีแรงดันที่ขา Output ซึ่งมีลอจิก "1"
สรุปแล้ว สถานะในการกดสวิตซ์เพื่อสร้างสัญญาณอินพุตในวงจร Pull-Up และ Pull-Down จะมีสถานะตรงกันข้ามคือ Pull-Up กดคือ"0" ไม่กดคือ"1" Pull-Down กดคือ"1" ไม่กดคือ"0" ซึ่งเอาต์พุตที่ได้จากลอจิกเกตก็จะขึ้นอยู่กับสัญญาณอินพุต เช่น ลอจิกเกต AND หากกดทั้ง 2 สวิตซ์ ถ้าเป็นวงจร Pull-Up จะเป็น 1 AND 1 ซึ่งได้ 0 ส่วนวงจร Pull-Down จะเป็น 0 AND 0 ซึ่งได้ 1 
รูปภาพจากอินเตอร์เน็ต : http://www.devreyapimi.com/wp-content/uploads/2011/10/pull-up-pull-down.jpg


3. ถ้าจะสร้างวงจรตรรกะตามฟังก์ชนับูลีน O = AC' + BC  โดยใช้ไอซี 74HCT00 เท่านั้น จะต้องออกแบบอย่างไร (ให้วาดรูปผังวงจร)

วงจรลอจิกตามฟังก์ชันบูลีนดังกล่าว Schematic View

วงจรลอจิกตามฟังก์ชันบูลีนดังกล่าว AND Breadboard View

อ้างอิง: เอกสารการทดลองที่ 2.2 การส้รางลอจิเกตพื้นฐานโดยใช้ไอซี 74HCT00
โดย ดร.เรวัต ศิริโภคาภิรมย์ ห้องปฏิบัติการระบบสมองกลฝังตัว(ESL.) มจพ.

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

วิธีการใช้งานบอร์ด Arduino

เมื่อต่อสาย USB จากบอร์ด Arduino แล้วให้ทำการ Update Driver โดยทำได้ดังนี้
1. Click ขวาที่ My Computer เลือก Manage

2. จะปรากฎหน้า Computer Management เลือก Device Manage ทางแท็บด้านซ้าย

3. ไปที่ Other devices คลิ๊กขวาที่ FT323R USB UART เลือก Update Driver Software...

4. หากมีโปรแกรม Arduino Sketch บนเครื่องอยู่แล้วให้เลือก Browse my computer for driver software

5. กด Browse... แล้วเลือก C:\ -> Program Files -> Arduino -> driver จากนั้น Click OK

6. Click Next จากนั้นรอจนกว่าจะเสร็จ

7. ชื่อจะเปลี่ยนเป็น USB Serial Port ให้ทำการ Click ขวาเลือก Update Driver Software... และทำซ้ำอีกครั้ง

8. ทำซ้ำจนกระทั่งขึ้นว่า Windows has successfully updated your driver software จะขึ้น Port ใหม่ใน Ports (Com & LPT)

9. เข้าโปรแกรม Arduino Sketch ไปที่ Tools เลือก Board แล้วเลือกชนิดบอร์ดที่ใช้ ในที่นี้เป็นบอร์ด Arduino Mini

10. จากนั้นไปที่ Tools เลือก Processor แล้วเลือกชนิดไมโครคอนโทรเลอร์ของบอร์ด Arduino ในที่นี้เป็น ATmega168

11. ไปที่ Tools เลือก Port แล้วเลือก Port ให้ตรงกับ Port ที่ขึ้นใหม่เมื่อเราติดตั้ง driver เสร็จ ในที่นี้เป็น COM3

12. เสร็จสิ้นกระบวนการตั้งค่าโปรแกรม Arduino Sketch สามารถใช้งานได้

การทดลองที่ 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.) มจพ.