Thursday, September 4, 2014

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

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

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

  • เพื่อให้เข้าใจวิธีการใช้งาน 7-Segment Display 
  • เพื่อให้สามารถทำการโปรแกรมบอร์ด 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Ω หรือ 470Ω ที่ต่ออนุกรมอยู่สำหรับแต่ละขา)
5. เขียนโค้ดตามตัวอย่างโดยใช้ Arduino IDE แล้วทำขั้นตอนคอมไพล์และอัพโหลดโปรแกรมไปยังบอร์ด Arduino ตรวจสอบความถูกต้องของวงจรบนเบรดบอร์ดก่อน เมื่อถูกต้องแล้ว จึงเชื่อมต่อ +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)

// 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

}

โค้ดที่ 3.2.1: โค้ดตัวอย่างสำหรับ Arduino

ผลการทดลอง

 ในการทดลองครั้งนี้ใช้อุปกรณ์ 7-Segment Display ชนิด Common-Cathode แบบสองหลัก ซึ่งมีวงจรภายในของอุปกรณ์เป็นดังนี้



ภาพวงจรภายในของ 7-Segment Display แบบสองหลัก  (รายระเอียด DATASHEET)


ผังวงจร

การต่อวงจรบนเบรดบอร์ด

ในข้อที่ 6 เขียนโค๊ดได้ดังนี้

const byte SEVEN_SEG[7] = {3,4,5,6,7,8,9};                        
int count=0;
const byte DIGIT_SEG[]={
 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( PB_1, INPUT);
    pinMode (SEVEN_SEG[i], OUTPUT);
    digitalWrite (SEVEN_SEG[i],HIGH);
  }
}

void loop(){
  if(count>9)count =0;
  if (0 <= count && count <10){
  byte value = DIGIT_SEG[count];
  for (int i=0; i<8; i++){
    digitalWrite (SEVEN_SEG[i],(value & 1));
    value >>=1;
  }
 }
 count++;
 delay(1000);
}

ในข้อ 7 เมื่อแก้ไขวงจรจะได้ดังนี้

ผังวงจร

การต่อวงจรบนเบรดบอร์ด

ในข้อ 8 เขียนโค๊ดได้ดังนี้

const byte PB_1=2;
const byte SEVEN_SEG[7] = {3,4,5,6,7,8,9};                        
int count=0;
const byte PWR = 10;
const byte DIGIT_SEG[]={
 B00111111, //0
 B00000110, //1
 B01011011, //2
 B01001111, //3
 B01100110, //4
 B01101101, //5
 B01111100, //6
 B00000111, //7
 B01111111, //8
 B01101111, //9
};

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

void loop(){
  while(digitalRead(PB_1)==0){
  delay(1000);
  if(count>9)count =0;
  if (0 <= count && count <10){
  byte value = DIGIT_SEG[count];
  for (int i=0; i<7; i++){
   digitalWrite (SEVEN_SEG[i],(value & 1));
   value >>=1;
  }
  count++;
 }
}
 count = 0;
 for (int i=0; i<7; i++){
    digitalWrite (SEVEN_SEG[i],LOW);
 }
}

รูปประกอบการทดลอง
รูประหว่างเริ่มต่อวงจรทดลอง

รูปการต่อวงจรเสร็จสมบูรณ์

รูปวงจรที่เพิ่มทรานซิสเตอร์และสวิตช์เข้าไป

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

1. วงจรทรานซิสเตอร์แบบ NPN ในวงจรนี้ใช้เพื่อวัตถุประสงค์ใด จงอธิบายหลักการทำงาน
  • เพื่อใช้เป็นสวิตช์ในการควบคุมการทำงานของ 7-Segment Display  หลักการทำงานของสวิตช์ตัวนี้คือ เมื่อเราจ่ายลอจิคของขา D10 เป็น HIGH จะเกิดแรงดันลอจิคตกคร่อมตัวต้านทาน R6 (1kΩ ) ก่อให้เกิดกระแสไฟฟ้าไหลเข้าขา Base ของทรานซิสเตอร์ ส่งผลให้กระแสไหลผ่านขา Collector และขา Emitter ได้ เมื่อทรานซิสเตอร์ทำงานจะทำให้วงจรของ 7-Segment Display ครบวงจร ตัวอุปกรณ์ดังกล่าวจึงสามารถทำงานได้

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

  • เขียนโค๊ดได้ดังนี้
const byte PB_1=2;
const byte SEVEN_SEG1[7] = {3,4,5,6,7,8,9};
const byte SEVEN_SEG2[7] = {10,11,12,13,A0,A1,A2};          
int count1=0;
int count2=0;

const byte DIGIT_SEG[]={
 B00111111, //0
 B00000110, //1
 B01011011, //2
 B01001111, //3
 B01100110, //4
 B01101101, //5
 B01111100, //6
 B00000111, //7
 B01111111, //8
 B01101111, //9
};

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

void loop(){

  delay(1000);
  if(count1>9){
    count2++;
    count1 = 0;
  }
  if(count2>9)count2=0;
  if (0 <= count1 && count1 <10){
    byte value_1 = DIGIT_SEG[count1];
    for (int i=0; i<7; i++){
    digitalWrite (SEVEN_SEG1[i],(value_1 & 1));
    value_1 >>=1;
    }
    count1++;
   }
  if (0 <= count2 && count2 <10){
    byte value_2 = DIGIT_SEG[count2];
    for (int i=0; i<7; i++){
    digitalWrite (SEVEN_SEG2[i],(value_2 & 1));
    value_2 >>=1;
    }
   }
 } 
  • มีวงจรการต่อดังนี้




No comments:

Post a Comment