วันพุธที่ 3 กันยายน พ.ศ. 2557

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

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

        1. รู้และเข้าใจการทำงานของอุปกรณ์  7-Segment Display
        2.  ฝึกการต่อวงจรโดยใช้อุปกรณ์  7-Segment Display และให้ทำงานร่วมกับบอร์ด Arduino
        3.  ฝึกการใช้งานบอร์ด Arduino และเขียนโค้ดภาษา C/C++ เพื่อกำหนดคำสั่งในการทำงานของบอร์ด Arduin ให้ 7-Segment Display  แสดงตัวเลข     

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

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

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

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

         2. ต่อตัวต้านทาน 330Ω หรือ 470Ω จํานวน 7 ตัว แบบอนุกรมกับขา a, b, c, d, e, f, g แต่ละขาของ
อุปกรณ์ 7-Segment Display ตามผังวงจรในรูปที่ 3.2.1 


         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 

         6. ตรวจสอบความถูกต้องของวงจรบนเบรดบอร์ดก่อน เมื่อถูกต้องแล้ว จึงเชื่อมต่อ +5V และ Gnd 
จากบอร์ด Arduino ไปยังเบรดบอร์ด เพื่อใช้เป็นแรงดันไฟเลี้ยง (VCC และ GND) และไม่ต้องใช้แหล่งจ่ายควบคุมแรงดันจากภายนอก ให้ระวังการต่อสลับขั้วสายไฟ และระวังการต่อถึงกันทางไฟฟ้า
ของสายไฟทั้งสองเส้น

         7. แก้ไขโค้ดสําหรับ Arduino ให้สามารถแสดงตัวเลขตั้งแต่ 0 ถึง 9 แล้ววนซ้ำ โดยเว้นระยะเวลาในการเปลี่ยนเป็นตัวเลขถัดไปประมาณ 1 วินาที

         8. แก้ไขวงจร โดยต่อวงจรตามผังวงจรในรูปที่ 3.2.3 ให้สังเกตว่า มีการต่อวงจรปุ่มกดแบบ Pull-up 
เพื่อใช้เป็นอินพุต-ดิจิทัลให้บอร์ด Arduino และมีการต่อวงจรทรานซิสเตอร์แบบ NPN เพื่อใช้ควบคุมการไหลของกระแสจากขา CC ของ 7-Segment Display ผ่านตัวทรานซิสเตอร์ NPN จากขา Collector (C) ไปยังขา Emitter (E) และ GND ของวงจรตามลําดับ


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

ผลการทดลอง


        เชื่อมต่อขา D3, D4, D5, D6, D7, D8, D9 ของบอร์ด Arduino ไปยังขา a, b, c, d, e, f, g ของ
อุปกรณ์ 7-Segment Display ผ่านตัวต้านทาน 330Ω  ต่อขา CC (Common Cathode ( ขาที่ 14)) ไปยัง Gnd ของวงจร เขียนโค้ดตามตัวอย่างโดยใช้ Arduino IDE แล้วทําขั้นตอนคอมไพล์และอัพโหลดโปรแกรมไปยังบอร์ด Arduino โดยจะสังเกตพฤติกรรมการเกิดได้คือ 7-Segment Display จะยังไม่สว่าง


  EXAMPLE  CODE...
  // Add your code below for global variables, constants................................................................... 

  // Add your code below for global variables, constants.
  const byte SEVEN_SEG[7] = {3, 4, 5, 6, 7, 8, 9};
  
  void setup() {
     for (int i = 0; i < 7; i++) {
     pinMode(SEVEN_SEG[i], OUTPUT);
     digitalWrite(SEVEN_SEG[i], HIGH );
     }
  }

  void loop() {
       // Write your code below
  }




        แก้ไขโค้ดสําหรับ Arduino ทำให้ 7-Segment Display สามารถแสดงตัวเลขตั้งแต่ 0 ถึง 9 แล้ววนซ้ำ โดยเว้นระยะเวลาในการเปลี่ยนเป็นตัวเลขถัดไปประมาณ 1 วินาที



CODE...

   ................................................................................................................................................. 
  const byte SEVEN_SEG[7] = {3, 4, 5, 6, 7, 8, 9};
  const byte ZeroToNine[10][7] = {{1,1,1,1,1,1,0},{0,1,1,0,0,0,0},

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

  void loop() {
     for (int i = 0; i < 10; i++) {     delay(1000);
     for (int k = 0; k< 7; k++) {
       digitalWrite(SEVEN_SEG[k], ZeroToNine[i][k] );
     }
  }



           แก้ไขวงจร โดยต่อวงจรตามผังวงจรในรูปที่ 3.2.3 ให้สังเกตว่า มีการต่อวงจรปุ่มกดแบบ Pull-up เพื่อใช้เป็นอินพุต-ดิจิทัลให้บอร์ด Arduino และมีการต่อวงจรทรานซิสเตอร์แบบ NPN เพื่อใช้ควบคุมการไหลของกระแสจากขา CC ของ 7-Segment Display ผ่านตัวทรานซิสเตอร์ NPN จากขา Collector (C) ไปยังขา Emitter (E) และ GND ของวงจรตามลําดับ จากนั้นแก้ไขโค้ดสําหรับ Arduino เพื่อให้แสดงตัวเลขตั้งแต่ 0 ถึง 9 แล้ววนซ้ำ โดยเว้นระยะเวลาในการเปลี่ยนเป็นตัวเลขถัดไปประมาณ 1 วินาทีแต่จะแสดงผลกต่อเมื่อกดปุ่ม PB1 ค้างไว้แต่ถ้าไม่กดจะต้องไม่แสดงผลตัวเลขใดๆ (ไม่ติด)




CODE....

  ................................................................................................................................................. 
  const byte SEVEN_SEG[7] = {3, 4, 5, 6, 7, 8, 9};
  const byte ZeroToNine[10][7] = {{1, 1, 1, 1, 1, 1, 0}, {0, 1, 1, 0, 0, 0, 0},
     {1, 1, 0, 1, 1, 0, 1}, {1, 1, 1, 1, 0, 0, 1}, {0, 1, 1, 0, 0, 1, 1}, {1, 0, 1, 1, 0, 1, 1},
     {1, 0, 1, 1, 1, 1, 1}, {1, 1, 1, 0, 0, 0, 0}, {1, 1, 1, 1, 1, 1, 1}, {1, 1, 1, 1, 0, 1, 1}}; ;

  const byte PB_1 = 2;
  const byte npn = 10;
  
  void setup() {
     pinMode(PB_1, INPUT);
     pinMode(npn, OUTPUT);
     for (int i = 0; i < 7; i++){
      pinMode(SEVEN_SEG[i], OUTPUT);
     }
   }

  void loop() {
     for (int i = 0; i < 10; i++) {     delay(1000);
     for (int k = 0; k< 7; k++) {
       if (digitalRead(PB_1) == LOW){
        digitalWrite(npn, HIGH );
        digitalWrite(SEVEN_SEG[k], ZeroToNine[i][k] );
      }else digitalWrite(npn, LOW );
    }
   }
  }

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

         1. วงจรทรานซิสเตอร์แบบ NPN ในวงจรนี้ใช้เพื่อวัตถุประสงค์ใด จงอธิบายหลักการทํางาน
=  นำทรานซิสเตอร์แบบ NPN มาใช้เพื่อกำหนดทิศทางการไหลของกระแสไฟ มีการทำงานคล้ายๆ สวิตทางอิเล็กทรอนิกส์สำหรับสั่งให้ทำงานและไม่ทำงาน เมื่อมีการกดปุ่ม  เราจะกำหนดให้ D10 มีสถานะเป็น HIGH ทำให้มีกระแสไฟป้อนเข้าขา B ของทรานซิสเตอร์และไหลเข้าไปในวงจรเปรียบเสมือนมีการเปิดสวิต แต่ถ้าเราไม่ได้กดปุ่ม D10 ก็จะมีสถานะเป็น LOW ทำให้ไม่มีกระแสไฟไหลเข้าไปในวงจร เปรียบเสมือนได้ปิดสวิตเอาไว้

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


   ................................................................................................................................................. 
const byte SEVEN_SEG[7] = {2, 3, 4, 5, 6, 7, 8};
const byte SEVEN_SEG2[7] = { 9, 10, 11, 12, 13, 44, 45};
const byte ZeroToNine[10][7] = {{1, 1, 1, 1, 1, 1, 0}, {0, 1, 1, 0, 0, 0, 0},
  {1, 1, 0, 1, 1, 0, 1}, {1, 1, 1, 1, 0, 0, 1}, {0, 1, 1, 0, 0, 1, 1}, {1, 0, 1, 1, 0, 1, 1},
  {1, 0, 1, 1, 1, 1, 1}, {1, 1, 1, 0, 0, 0, 0}, {1, 1, 1, 1, 1, 1, 1}, {1, 1, 1, 1, 0, 1, 1}
};

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

int count = 0;

void loop() {

  if (count <= 99) {
    for (int i = 0; i < 10; i++) {
      for (int l = 0; l < 7; l++) {
        digitalWrite(SEVEN_SEG[l], ZeroToNine[i][l] );
      }

      for (int j = 0; j < 10; j++) {
        for (int k = 0; k < 7; k++) {
          ;
          digitalWrite(SEVEN_SEG2[k], ZeroToNine[j][k] );
        }
        count++;
        delay(1000);
      }
    }
  } else count = 0;

}



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

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