วันพฤหัสบดีที่ 4 กันยายน พ.ศ. 2557

การทดลองที่ 3.2

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

วัตถุประสงค์
     1. ศึกษาการทำงานของ 7-Sigment Display เพื่อแสดงตัวเลข
     2. ฝึกการใช้งานบอร์ด Arduino ที่ต่อกับ 7-Sigment Display
     3. ฝึกการเขียนภาษา C/C++ ในโปรแกรม Arduino เพื่อสั่งการทำงานของ 7-Sigment 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


      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 ของวงจรตามลำดับ



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


**โค้ดสำหรับขั้นตอนการทดลองที่ 6
const byte mins[] = {B0111111, B0000110, B1011011, B1001111, B1100110, B1101101, B1111101, B0000111, B1111111, B1100111};
const byte SEVEN_SEG [7] = {3, 4, 5, 6, 7, 8, 9};
int i=0;
void setup() {
  for (int i = 0; i < 7; i++) {
    pinMode (SEVEN_SEG[i], OUTPUT);
    digitalWrite (SEVEN_SEG[i], HIGH );
  }
}
void loop() {
  byte b = mins[i];
  delay(1000);
  for (int j = 0; j < 8; j++) {
    digitalWrite(SEVEN_SEG[j], b & 1);
    b >>= 1;
  }
  i++;
  if (i == 10)i = 0;
}

**โค้ดสำหรับขั้นตอนการทดลองที่ 8
const byte mins[] = {B0111111, B0000110, B1011011, B1001111, B1100110, B1101101, B1111101, B0000111, B1111111, B1101111};
const byte SEVEN_SEG [7] = {3, 4, 5, 6, 7, 8, 9};
int i = 0;
const byte PB_1 = 2;

void setup() {
  pinMode (PB_1, INPUT);
  for (int i = 0; i < 7; i++) {
    pinMode (SEVEN_SEG[i], OUTPUT);
    digitalWrite (SEVEN_SEG[i], HIGH );
  }
}
void loop() {
    byte b = mins[i];
    delay(1000);
    for (int j = 0; j < 8; j++) {
      digitalWrite(SEVEN_SEG[j],b&1);
      b >>= 1;
    }
    i++;
    if (i == 10)i = 0;
   digitalWrite(10, ! (digitalRead(PB_1)));
   if(digitalRead(PB_1)==HIGH)
   {
       for (int i = 0; i < 7; i++)
       {
            pinMode (SEVEN_SEG[i], OUTPUT);
            digitalWrite (SEVEN_SEG[i], LOW );
      }
   }
}

คำถามท้ายการทดลอง
      1. วงจรทรานซิสเตอร์แบบ NPN ในวงจรนี้ใช้เพื่อวัตถุประสงค์ใด จงอธิบายหลักการทำงาน
ตอบ : ทรานซิสเตอร์นั้นจะประกอบด้วยได โอดจำนวน 2 ตัว ได้แก่ เบส - คอลเลคเตอร์ไดโอด และเบส-อิมิตเตอร์ไดโอด โดยเมื่อเป็นทรานซิสเตอร์ชนิด NPN ไดโอดทั้งสองจะต่อกันแบบหลังชนหลัง
     - รอยต่อเบส-อิมิตเตอร์ เป็นเหมือน ไดโอด.
     - กระแสเบส IB ไหลเฉพาะเมื่อแรงดัน VBE ระหว่างเบส-อิมิตเตอร์เท่ากับ 0.7V หรือมากกว่า
     - กระแสเบส IB น้อยๆควบคุมกระแสคอลเล็คเตอร์ IC ที่สูง
     - IC = hFE ? IB (เว้นแต่ทรานซิสเตอร์ต่อ(on)เต็มที่และอิ่มตัว)
     - hFE คือเกนการขยายกระแส (เป็นเกนกระแส DC) ค่าปรกติสำหรับ hFE คือ 100 (ไม่มีหน่วยเพราะ เป็นอัตราส่วน)
     - ความต้านทานระหว่างคอลเล็คเตอร์-อิมิตเตอร์ RCE ถูกควบคุมโดยกระแส IB โดย:
        IB = 0 RCE = ค่าอนันต์ ทรานซิสเตอร์ตัด(off)
        IB น้อย RCE ลด ทรานซิสเตอร์ต่อ (on)บางส่วน
        IB เพิ่ม RCE = 0 ทรานซิสเตอร์ต่อ(on)เต็มที่ (อิ่มตัว'saturated')

      2. ถ้าจะใช้ 7-Segment Display สองหลักพร้อมกัน เช่น เพื่อแสดงผลเป็นตัวเลข “00” ถึง “99”
โดยเพิ่มขึ้นทีละหนึ่ง ทุกๆ 1 วินาที (1000 มิลลิวินาที) แล้ววนกลับไปที่ “00” ใหม่ได้ จะต้อง
ออกแบบวงจร และเขียนโค้ด Arduino ควบคุมอย่างไร
ตอบ : โค้ด Arduino
const byte mins[] = {
  B0111111, B0000110, B1011011, B1001111, B1100110, B1101101, B1111101, B0000111, B1111111, B1100111};
const byte SEVEN_SEG1 [7] = {
  3, 4, 5, 6, 7, 8, 9};
const byte SEVEN_SEG2 [7] = {
  10, 11, 12, 13, A0,A1 };
int i=0;
int k=0;
void setup() {
  for (int i = 0; i < 7; i++) {
    pinMode (SEVEN_SEG1[i], OUTPUT);
    digitalWrite (SEVEN_SEG1[i], HIGH );
    pinMode (SEVEN_SEG2[i], OUTPUT);
    digitalWrite (SEVEN_SEG1[i], HIGH );
  }
}
void loop() {
  byte b = mins[i];
  byte c = mins[k];
  delay(1000);
  for (int j = 0 ; j < 8 ; j++) {
    digitalWrite(SEVEN_SEG1[j], b & 1);
    digitalWrite(SEVEN_SEG2[j], c & 1);
    b >>= 1;
    c >>= 1;
  }
  i++;
  k++;
  if (i == 10 && k ==10)i = 0,k = 0;
}

วงจรที่ออกแบบ




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

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