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

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

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

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

- ฝึกต่อวงจรโดยใช้อุปกรณ์ 7-Segment Display บนเบรดบอร์ด และใช้งานร่วมกับบอร์ด Arduino
- เขียนโปรแกรม 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
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? ที่ต่ออนุกรมอยู่)
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 ค้างไว้ แต่ถ้าไม่กด จะ        ต้องไม่แสดงผลตัวเลขใดๆ (ไม่ติด)







รูปที่ 3.2.1: ผังวงจรสําหรับเชื่อมต่อบอร์ด Arduino  (ตัวอย่างนี้ใช้ 7-Segment Display แบบ Common-Cathode)



รูปที่ 3.2.2: อุปกรณ์ 7-Segment Display แบบหนึ่งหลัก (ซ้าย) และแบบสองหลัก (ขวา)

รูปที่ 3.2.3: ผังวงจรสําหรับเชื่อมต่อบอร์ด Arduino  (ควบคุมการทํางาน 7-Segment Display ได้ด้วยทรานซิสเตอร์ NPN)








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

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

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






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

โค้ดที่ใช้ในการเขียน

const byte SEVEN_SEG_I[7] = {1, 2, 3, 4, 5, 6, 7};
const byte SEVEN_SEG_II[7] = {8, 9, 10, 11, 12, 13, 14};
byte nCount = 0;
const byte DIGIT_7SEG[] = {
  B00111111, //0
  B00000110, //1
  B01011011, //2
  B01001111, //3
  B01100110, //4
  B01101101, //5
  B01111100, //6
  B00000111, //7
  B01111111, //8
  B01101111  //9
};

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

void loop() {
  delay(1000);
  displayNumber(0, nCount%10); 
  displayNumber(1, (nCount-(nCount%10))/10); 
  nCount = (nCount+1) % 100; 
}

void displayNumber(int num, byte value ) {
  if ( 0 <= value && value < 10 ) {
    byte value = DIGIT_7SEG[ value];
    if (num == 0) {
      for (int i = 0; i <  8; i++) {
        digitalWrite( SEVEN_SEG_I[i], (value & 1) );
        value >>= 1;
      }
    } else {
      for (int i = 0; i <  8; i++) {
        digitalWrite( SEVEN_SEG_II[i], (value & 1) );
        value >>= 1;
      }
    }
  }

}












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

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