วันศุกร์ที่ 5 กันยายน พ.ศ. 2557

การทดลองที่ 3.2 การใช้อุปกรณ์ 7-Segment Display เพื่อแสดงตัวเลข BCD

วัตถุประสงค์

1. ฝึกต่อวงจรโดยใช้อุปกรณ์ 7-Segment Display บนเบรดบอร์ด และใช้งานร่วมกับบอร์ด Arduino
2. เขียนโปรแกรม Arduino เพื่อแสดงตัวเลข โดยใช้อุปกรณ์ 7-Segment Display

รายการอุปกรณ์

- แผงต่อวงจร (เบรดบอร์ด)                       1 อัน
- บอร์ด Arduino (ใช้แรงดันลอจิก +5V)     1 บอร์ด
- อุปกรณ์ 7-Segment Display                      1 ตัว
- ปุ่มกดแบบสี่ขา                                        1 ตัว
- ตัวต้านทาน 330Ω หรือ 470Ω                 7 ตัว
- ตัวต้านทาน 1kΩ                                     1 ตัว
- ตัวต้านทาน 10kΩ                                   1 ตัว
- ทรานซิสเตอร์ NPN เบอร์ PN2222A      1 ตัว
- สายไฟสําหรับต่อวงจร                            1 ชุด

ขั้นตอนการทดลอง

1. ศึกษาการใช้งาน และตำแหน่งของขาต่างๆ ของอุปกรณ์ 7-Segment Display (ใช้แบบ Common-
Cathode) จากเอกสาร (ดาต้าชีทของผู้ผลิต) วาดรูปอุปกรณ์ ระบุขาต่างๆ และการกำหนดสถานะ
LOW หรือ HIGH ที่ขาเหล่านั้น เพื่อให้สามารถแสดงตัวเลขในแต่ละกรณีได้ระหว่าง 0 ถึง 9

 ที่มา : http://www.microtivity.com/p/IS211/7-segment-led-display-2-digit-red-static-common-cathode-pack-of-2

2. ต่อตัวต้านทาน 330Ω หรือ 470Ω จำนวน 7 ตัว แบบอนุกรมกับขา a, b, c, d, e, f, g แต่ละขาของ
อุปกรณ์ 7-Segment Display ตามผังวงจรในรูปที่ 3.2.1
credit : เอกสารประกอบการเรียน Logic Design of Digital System ,ดร. เรวัต  ศิริโภคาภิรมย์


3. ต่อขา CC (Common Cathode) ไปยัง Gnd ของวงจร
4. เชื่อมต่อขา D3, D4, D5, D6, D7, D8, D9 ของบอร์ด Arduino ไปยังขา a, b, c, d, e, f, g ของ
อุปกรณ์ 7-Segment Display (ผ่านตัวต้านทาน 330Ω หรือ 470Ω ที่ต่ออนุกรมอยู่สำหรับแต่ละขา)
5. เขียนโค้ดตามตัวอย่างโดยใช้ Arduino IDE แล้วทำขั้นตอนคอมไพล์และอัพโหลดโปรแกรมไปยังบอร์ด Arduino
credit : เอกสารประกอบการเรียน Logic Design of Digital System ,ดร. เรวัต  ศิริโภคาภิรมย์


8. ตรวจสอบความถูกต้องของวงจรบนเบรดบอร์ดก่อน เมื่อถูกต้องแล้ว จึงเชื่อมต่อ +5V และ Gnd
จากบอร์ด Arduino ไปยังเบรดบอร์ด เพื่อใช้เป็นแรงดันไฟเลี้ยง (VCC และ GND) และไม่ต้องใช้
แหล่งจ่ายควบคุมแรงดันจากภายนอก ให้ระวังการต่อสลับขั้วสายไฟ และระวังการต่อถึงกันทางไฟฟ้า
ของสายไฟทั้งสองเส้น
6. แก้ไขโค้ดสำหรับ Arduino ให้สามารถแสดงตัวเลขตั้งแต่ 0 ถึง 9 แล้ววนซ้ำ โดยเว้นระยะเวลาในการ
เปลี่ยนเป็นตัวเลขถัดไปประมาณ 1 วินาที
7. แก้ไขวงจร โดยต่อวงจรตามผังวงจรในรูปที่ 3.2.3 ให้สังเกตว่า มีการต่อวงจรปุ่มกดแบบ Pull-up
เพื่อใช้เป็นอินพุต-ดิจิทัลให้บอร์ด Arduino และมีการต่อวงจรทรานซิสเตอร์แบบ NPN เพื่อใช้ควบคุม
การไหลของกระแสจากขา CC ของ 7-Segment Display ผ่านตัวทรานซิสเตอร์ NPN จากขา
Collector (C) ไปยังขา Emitter (E) และ GND ของวงจรตามลำดับ
credit : เอกสารประกอบการเรียน Logic Design of Digital System ,ดร. เรวัต  ศิริโภคาภิรมย์


8. แก้ไขโค้ดสำหรับ Arduino เพื่อให้แสดงตัวเลขตั้งแต่ 0 ถึง 9 แล้ววนซ้ำ โดยเว้นระยะเวลาในการ
เปลี่ยนเป็นตัวเลขถัดไปประมาณ 1 วินาที แต่จะแสดงผลก็ต่อเมื่อกดปุ่ม PB1 ค้างไว้ แต่ถ้าไม่กด
จะต้องไม่แสดงผลตัวเลขใดๆ (ไม่ติด)


ผลการทดลอง

Example Code Arduino






Code Arduino : 0-9 Digit ( 1 sec )







Code Arduino : Pressed SW to count digit 0-9 






คำถามท้ายการทดลอง

1. วงจรทรานซิสเตอร์แบบ NPN ในวงจรนี้ใช้เพื่อวัตถุประสงค์ใด จงอธิบายหลักการทำงาน

- ทรานซิสเตอร์มีหน้าที่ ในการควบคุมการไหลของแรงดันซึ่งเป็นการควบคุมการติด/ดับของ 7-Segment Display ในวงจรนี้ โดยเมื่อทำการกดปุ่มจะทำให้เกิดแรงดันขึ้นที่ ขา  B จึงทำให้ กระแสจะไหลจาก C ไป E ได้ ทำให้วงจรทำงานได้ แต่เมื่อไม่กดปุ่มขา B ไม่รับแรงดัน ทำให้ กระแสจากขา C ไหลผ่านไปไม่ได้ 


2. ถ้าจะใช้ 7-Segment Display สองหลักพร้อมกัน เช่น เพื่อแสดงผลเป็นตัวเลข “00” ถึง “99”
โดยเพิ่มขึ้นทีละหนึ่ง ทุกๆ 1 วินาที (1000 มิลลิวินาที) แล้ววนกลับไปที่ “00” ใหม่ได้ จะต้อง
ออกแบบวงจร และเขียนโค้ด Arduino ควบคุมอย่างไร


Code Arduino :
const byte SEVEN_SEG[7] = {0,1,2,3,4,5,6}; 
const byte SEVEN_SEG2[7] = {7,8,9,10,11,12,13}; 
const byte DIGIT_7SEG[] ={
 B00111111, //0
 B00000110, //1
 B01011011, //2
 B01001111, //3
 B01100110, //4
 B01101101, //5
 B01111100, //6
 B00000111, //7
 B01111111, //8
 B01101111  //9
 };
byte count = 0; 

void setup() { 
  for (int i=0; i < 7; i++) { 
    pinMode( SEVEN_SEG2[i], OUTPUT ); 
    digitalWrite( SEVEN_SEG2[i], HIGH ); 
  }  
  for (int i=0; i < 7; i++) { 
    pinMode( SEVEN_SEG[i], OUTPUT ); 
    digitalWrite( SEVEN_SEG[i], HIGH ); 
  }



void loop() { 
    displayDigit(0, count%10); 
    displayDigit(1, (count-(count%10))/10); 
    count = (count+1) % 100; 
    delay(1000); 


void displayDigit(int switch_digi, byte value) { 
  if ( 0 <= value && value < 10 ) { 
    byte value = DIGIT_7SEG[ count ]; 
    if(switch_digi == 0){ 
      for (int i=0; i<8; i++) {  
        digitalWrite(SEVEN_SEG[i], (value & 1) );
        value>>= 1; 
      } 
    }else{ 
      for (int i=0; i<8; i++) {  
        digitalWrite(SEVEN_SEG2[i], (value & 1) );
        value>>= 1; 
      } 
    }
  } 
}




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

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