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

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

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

 ฝึกต่อวงจรโดยใช้อุปกรณ์ 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Ω หรือ 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 ค้างไว้ แต่ถ้าไม่กด
จะต้องไม่แสดงผลตัวเลขใดๆ (ไม่ติด)


รูปที่ 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 diaplay 
const byte SEVEN_SEG[7] = {3,4,5,6,7,8,10};
byte num[] = {
  B0111111,
  B0001100,
  B1011011,
  B1001111,
  B1100110,
  B1101101,
  B1111101,
  B0000111,
  B1111111,
  B1101111};
int a=0;
void setup() {
  for(int i=0;i<7;i++){
    pinMode(SEVEN_SEG[i],OUTPUT);
    digitalWrite(SEVEN_SEG[i],HIGH);
  }
}


void loop() {
}

    if(a>9){a=0;}
      byte b=num[a];
       for(int i=0;i<7;i++){
        digitalWrite(SEVEN_SEG[i],b & 1);
        b>>=1;
      }
    b++;
    delay(1000);

}



โค้ด 7 segment display & ทรานซิสเตอร์


const byte PB = 2;
const byte SEVEN_SEG[7] = {3,4,5,6,7,8,10};

byte num[] = {
  B0111111,
  B0001100,
  B1011011,
  B1001111,
  B1100110,
  B1101101,
  B1111101,
  B0000111,
  B1111111,
  B1101111};
void setup() {
  for(int i=0;i<7;i++){
    pinMode(SEVEN_SEG[i],OUTPUT);
    digitalWrite(SEVEN_SEG[i],HIGH);
  }

int a=0;
void loop() {
  int SW = digitalRead(PB);
  delay(100);
  if(SW==LOW){
    if(a>9){a=0;}
      byte b=num[a];
      for(int i=0;i<7;i++){
      digitalWrite(SEVEN_SEG[i],b & 1);
      b>>=1;
    }
    a++;
    delay(1000);
  }
  else{
   a=0;
   byte b=num[a];
   for(int k=0;k<7;k++){
      digitalWrite(SEVEN_SEG[k],LOW);
      b>>=1;
    }
  }
}




คำถามท้ายการทดลอง
1. วงจรทรานซิสเตอร์แบบ NPN ในวงจรนี้ใช้เพื่อวัตถุประสงค์ใด จงอธิบายหลักการทำงาน
ทรานซิสเตอร์ ที่มีขา Base, Collector และ Emitter กระแสขนาดเล็ก ที่ ขา base (ที่ไหลระหว่าง base กับ emitter) สามารถควบคุม หรือ สวิตช์ กระแสที่มีขนาดใหญ่มากที่ไหลระหว่าง collector กับ emitter 
ประจุไฟฟ้าจะไหลระหว่าง emitter กับ collector ขึ้นอยู่กับ กระแสใน base. เนื่องจากการเชื่อมต่อระหว่าง base และ emitter ภายใน ทำตัวเหมือนไดโอด, แรงดันไฟฟ้าจะตกคร่อมระหว่าง base และ emitter เมื่อมีกระแส base ไหลผ่าน ปริมาณของแรงดันนี้จะขึ้นอยู่กับวัสดุที่ใช้ทำทรานซิสเตอร์นั้น


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

โค้ด
const byte SEVEN_SEG_1[7] = {0,1,2,3,4,5,6};
const byte SEVEN_SEG_2[7] = {7,8,9,10,11,12,13};
byte num[] = {
  B0111111,
  B0001100,
  B1011011,
  B1001111,
  B1100110,
  B1101101,
  B1111101,
  B0000111,
  B1111111,
  B1101111};
int a=0;
void setup() {
  for(int i=0;i<7;i++){
    pinMode(SEVEN_SEG_1[i],OUTPUT);
    digitalWrite(SEVEN_SEG_1[i],HIGH);
    digitalWrite(SEVEN_SEG_2[i],HIGH);
  }
}

void loop() {
    if(a>9){a=0;}
      byte t=num[a];
       for(int i=0;i<7;i++){
        digitalWrite(SEVEN_SEG_1[i],t & 1);
        digitalWrite(SEVEN_SEG_2[i],t & 1);
        t>>=1;
      }
    a++;
    delay(1000);
}




การทดลองที่ 3.1 การต่อวงจรปุ่มกดและไดโอดเปล่งแสงสำหรับ Arduino

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

  • ฝึกต่อวงจรปุ่มกดและไดโอดเปล่งแสง (LED) และเชื่อมต่อกับขาอินพุต/เอาต์พุต-ดิจิทัลของบอร์ดArduino
  • ฝึกเขียนโปรแกรมภาษา C/C++ เพื่อกำหนดพฤติกรรมการทำงานของบอร์ด Arduino ตามโจทย์ที่กำหนดให้

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

  • แผงต่อวงจร (เบรดบอร์ด) 1 อัน
  • บอร์ด Arduino (ใช้แรงดันลอจิก +5V) 1 บอร์ด
  • ปุ่มกดแบบสี่ขา 2 ตัว
  • ไดโอดเปล่งแสงขนาด 5 มม. 4 ตัว
  • ตัวต้านทาน 10kΩ 2 ตัว
  • ตัวต้านทาน 330Ω หรือ 470Ω 4 ตัว
  • สายไฟสำหรับต่อวงจร 1 ชุด

ขั้นตอนการทดลอง
1. ยังไม่ต้องเชื่อมต่อ +5V และ Gnd จากบอร์ด Arduino ไปยังเบรดบอร์ดเพื่อจ่ายเป็นแรงดันไฟเลี้ยง
VCC และ GND
2. ต่อวงจรปุ่มกดพร้อมตัวต้านทานแบบ Pull-up 10kΩ จำนวนสองชุด (PB1 และ PB2) บนเบรดบอร์ด
แล้วนำไปต่อกับขา D2 และ D3 ของบอร์ด Arduino ตามลำดับ โดยใช้ลวดสายไฟสำหรับต่อวงจร
(ดูตามผังวงจรในรูปที่ 3.1.1)

3. ต่อวงจรโดยใช้ไดโอดเปล่งแสง (LED) พร้อมตัวต้านทานแบบอนุกรม 330Ω หรือ 470Ω จำนวน
4 ชุด (LED1, LED2, LED3, LED4) บนเบรดบอร์ด แล้วนำไปต่อกับขา D4, D5, D6, D7, D8 ของ
บอร์ด Arduino ตามลำดับ โดยใช้ลวดสายไฟสำหรับต่อวงจร (ดูตามผังวงจรในรูปที่ 3.1.1)
4. เขียนโค้ดตามตัวอย่างโดยใช้ Arduino IDE แล้วทำขั้นตอนคอมไพล์และอัพโหลดโปรแกรมไปยังบอร์ด
Arduino
5. ตรวจสอบความถูกต้องของวงจรบนเบรดบอร์ดอีกครั้ง จากนั้นจึงเชื่อมต่อ +5V และ Gnd จากบอร์ด
Arduino ไปยังเบรดบอร์ดเพื่อใช้เป็นแรงดันไฟเลี้ยง (VCC และ GND) ให้ระวังการต่อสลับขั้วสายไฟ
และ ระวังการต่อถึงกันทางไฟฟ้าของสายไฟทั้งสองเส้น
6. แก้ไขโค้ดให้แสดงพฤติกรรมการทำงานตามข้อกำหนดต่อไปนี้ ตรวจสอบและสาธิตความถูกต้องใน
การทำงาน โดยใช้ฮาร์ดแวร์จริง
6.1 เมื่อเริ่มต้นทำงาน จะมี LED เพียงตัวเดียวที่อยู่ในสถานะ “ติด” (LED1) และที่เหลืออีก 3 ตัว
(LED2, LED3, LED4) อยู่ในสถานะ “ดับ”
6.2 ถ้ากดปุ่ม PB1 แล้วปล่อยในแต่ละครั้ง จะทำให้ตำแหน่งของ LED ที่ “ติด” เลื่อนไปทางขวาทีละ
หนึ่งตำแหน่ง หรือวนกลับมาเริ่มต้นใหม่ทางซ้ายสุด (LED1 -> LED2 -> LED3 -> LED4 -> …)
6.3 ถ้ากดปุ่ม PB2 แล้วปล่อยในแต่ละครั้ง จะทำให้ตำแหน่งของ LED ที่ “ติด” เลื่อนไปทางซ้ายทีละ
หนึ่งตำแหน่ง หรือวนกลับมาเริ่มต้นใหม่ทางขวาสุด (LED1 -> LED4 -> LED3 -> LED2 -> …)
7. แก้ไขโค้ดให้แสดงพฤติกรรมการทำงานตามข้อกำหนดต่อไปนี้ ตรวจสอบและสาธิตความถูกต้องใน
การทำงาน
7.1 ใช้ LED ทั้ง 4 ตัว แสดงเลขในฐานสอง จำนวน 4 หลัก (4-bit binary number) ซึ่งรับสัญญาณ
เอาต์พุตมาจากบอร์ด Arduino และกำหนดให้บิตที่มีค่า 0 หมายถึง LED “ดับ” และ บิตที่มีค่า
เป็น 1 หมายถึง LED “ติด”และเมื่อเริ่มต้นทำงาน ให้แสดงค่าเป็น 0
7.2 เมื่อกดปุ่ม PB1 แล้วปล่อยแต่ละครั้ง จะทำให้ค่าเพิ่มขึ้นทีละหนึ่ง จาก 0000, 0001, 0010, …,
1111 ตามลำดับ แล้ววนกลับไปเริ่มต้นที่ 0000 ใหม่ได้
7.3 แต่ถ้ากดปุ่ม PB2 จะทำให้ได้ค่าเป็น 0000 ทันที (หมายถึง การรีเซตค่าเป็นศูนย์)

โค้ดในข้อย่อย 6
const byte PB_1 = 2;
const byte PB_2 = 3;
const byte LEDS[4] = {4, 5, 6, 7};

void setup() {
  for (int i = 0; i < 4; i++) {
    pinMode(LEDS[i], OUTPUT);
    //digitalWrite(LEDS[i], (i == 0) ? HIGH : LOW);
  }
}
int a=0;
void loop() {
  int SW_1 = digitalRead(PB_1);
  int SW_2 = digitalRead(PB_2);
  delay(100);
  if (SW_1 == LOW) {
    digitalWrite(LEDS[a], HIGH);
    if (a >= 3){
      a = 0;
    }
    else {
      a++;
    }
  }
    if (SW_2 == LOW) {
    digitalWrite(LEDS[a], HIGH);
    if (a <= 0){
      a = 3;
    }
    else {
      a--;
    }
  }
  for (int b = 0; b < 4; b++) {
    digitalWrite(LEDS[b], LOW);
  }
  digitalWrite(LEDS[a], HIGH);
}



การทำงานเมื่อกดสวิตซ์ LED 

โค้ดในข้อย่อย 7

const byte PB_1 = 2; const byte PB_2 = 3; const byte LEDS[4] = {4, 5, 6, 7};
byte count = 0;
void setup() { pinMode( PB_1, INPUT ); pinMode( PB_2, INPUT ); for (int i = 0; i < 4; i++) { pinMode( LEDS[i], OUTPUT ); digitalWrite( LEDS[i], (i == 0) ? HIGH : LOW ); } }
void loop() { check(); disp(); }
void check() { if (isButton(PB_1)) count = count + 1; if (isButton(PB_2)) count = 0; }

void disp() { byte t = count; for (int i = 0; i < 4; i++) { digitalWrite(LEDS[i], t & 1); t >>= 1; } }
bool isButton(byte pinNumber) { byte t = 5; while ((digitalRead(pinNumber) == LOW) && --t){ delay(1); } if (t == 0) { while (digitalRead(pinNumber) == LOW); return true; } return false; }


รูปแบบวงจร



วันพฤหัสบดีที่ 28 สิงหาคม พ.ศ. 2557

การทดลองที่ 2.2 การสร้างลอจิกเกตพื้นฐานโดยใช้ไอซี 74HCT00

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


  •  ฝึกต่อวงจรโดยใช้ไอซีลอจิก 74HCT00 บนเบรดบอร์ด
  • สร้างลอจิกเกตพื้นฐาน เช่น เกต OR AND และ NOR หรือตามฟังก์ชันบูลีนที่กำหนดให้ โดยใช้ลอจิกเกต NAND ที่มีอยู่ในไอซี 74HCT00
  • ต่อวงจรปุ่มกดเพื่อใช้เป็นอินพุต และต่อวงจรไดโอดเปล่งแสงพร้อมตัวต้านทานเพื่อใช้เป็นเอาต์พุตสำหรับลอจิกเกต
รายการอุปกรณ์
แผงต่อวงจร (เบรดบอร์ด) 1 อัน
ไอซี 74HCT00 1 ตัว

ปุ่มกดแบบสี่ขา 2 ตัว

ไดโอดเปล่งแสงขนาด 5 มม. 1 ตัว

ตัวต้านทาน 10kΩ 2 ตัว

ตัวต้านทาน 330Ω หรือ 470Ω 1 ตัว

สายไฟสำหรับต่อวงจร 1 ชุด
แหล่งจ่ายควบคุมแรงดัน 1 ชุด

    ขั้นตอนการทดลอง
    1. ออกแบบและวาดผังวงจร สำหรับสร้างลอจิกเกตที่มีอินพุตสองขาและเอาต์พุตหนึ่งขา โดยใช้ไอซี
    74HCT00 เพียงตัวเดียวเท่านั้น โดยแบ่งเป็นสามกรณี ได้แก่ AND OR และ NOR พร้อมวงจรปุ่มกด
    ที่มีตัวต้านทาน 10kΩ แบบ Pull-Up จำนวน 2 ชุด (SW1 และ SW2) สำหรับขาอินพุตทั้งสองของ
    ลอจิกเกต และวงจรไดโอดเปล่งแสง (LED1) พร้อมตัวต้านทาน 330Ω หรือ 470Ω เพื่อใช้แสดง
    สถานะสำหรับเอาต์พุต
    2. ต่อวงจรบนเบรดบอร์ดตามที่ได้ออกแบบไว้ เพื่อสร้างลอจิกเกต AND และมีวงจรปุ่มกด SW1 และ
    SW2 เพื่อใช้เป็นอินพุต และวงจรไดโอดเปล่งแสง LED1 เพื่อใช้แสดงสถานะสำหรับเอาต์พุต
    3. สร้างอินพุตทั้งสองขาของลอจิกเกต ให้ครบ 4 กรณี แล้วสังเกตผลที่ได้ บันทึกผลลงในตารางที่ 2.1.1
    รูปแบบการต่อวงจร

    4. ยกเลิกการต่อวงจรบนเบรดบอร์ด
    5. ต่อวงจรบนเบรดบอร์ดตามที่ได้ออกแบบไว้ เพื่อสร้างลอจิกเกต OR และมีวงจรปุ่มกด SW1 และ
    SW2 เพื่อใช้เป็นอินพุต และวงจรไดโอดเปล่งแสง LED1 เพื่อใช้แสดงสถานะสำหรับเอาต์พุต
    รูปแบบการต่อวงจร



    6. สร้างอินพุตทั้งสองขาของลอจิกเกต ให้ครบ 4 กรณี แล้วสังเกตผลที่ได้ บันทึกผลลงในตารางที่ 2.1.2
    7. ยกเลิกการต่อวงจรบนเบรดบอร์ด
    8. ต่อวงจรบนเบรดบอร์ดตามที่ได้ออกแบบไว้ เพื่อสร้างลอจิกเกต NOR และมีวงจรปุ่มกด SW1 และ
    SW2 เพื่อใช้เป็นอินพุต และวงจรไดโอดเปล่งแสง LED1 เพื่อใช้แสดงสถานะสำหรับเอาต์พุต
    รูปแบบการต่อวงจร
    9. สร้างอินพุตทั้งสองขาของลอจิกเกต ให้ครบ 4 กรณี แล้วสังเกตผลที่ได้ บันทึกผลลงในตารางที่ 2.1.3


    คำถามท้ายการทดลอง
    1. จากผลการทดลองต่อวงจรสำหรับสร้างลอจิกเกต AND OR และ NOR ตามลำดับ เป็นไปตามตาราง
    ค่าความจริงสำหรับลอจิกเกตดังกล่าวหรือไม่ จงอธิบาย
    ตอบ เป็นไปตามตารางค่าความจริงสำหรับลอจิกเกต ในการทดลองต่อวงจรแบบ Pull-up เมื่อเวลากดจะได้ลอจิกเป็น 0 ไม่กดจะได้ลอจิกเป็น 1 
    -ลอจิกเกต AND ตามตาราง ไม่กด(1) ไม่กด(1) ไดโอตเปล่งแสงติด(1) ซึ่งตรงกับตารางค่าความจริง
    -ลอจิกเกต OR    ตามตาราง  กด(0)     กด(0)     ไดโอตเปล่งแสงดับ(0) ซึ่งตรงกับตารางค่าความจริง
    -ลอจิกเกต NOR ตามตาราง  กด(0)     กด(0)     ไดโอตเปล่งแสงติด(1) ซึ่งตรงกับตารางค่าความจริง

    2. เมื่อต่อวงจรปุ่มกดที่มีตัวต้านทาน 10kΩ แบบ Pull-Down (แทน Pull-Up) เพื่อสร้างสัญญาณอินพุต
    ให้ลอจิกเกต จะให้ผลแตกต่างจากที่ได้ทดลองไปหรือไม่ จงอธิบาย 
    ตอบ ผลที่ได้จะตรงข้ามกันในส่วนที่เป็นของ สวิตช์ตัวที่ 1 กด สวิตซ์ตัวที่ 2 กด และสวิตช์ตัวที่ 1 ไม่กด สวิตซ์ตัวที่ 2 ไม่กด จะสลับกัน เพราะว่า การต่อแบบ Pull-Up เมื่อกดสวิตซ์ (SW1,SW2) จะได้ลอจิกเป็น 0 ไม่กดลอจิกจะเป็น 1 ซึ่งจะตรงข้ามกัน การต่อแบบ Pull-Down เมื่อกดสวิตซ์ (SW1,SW2) จะได้ลอจิกเป็น 1 ไม่กดลอจิกจะเป็น 0

    3. ถ้าจะสร้างวงจรตรรกะตามฟังก์ชันบูลีน 0 = AC' + BCโดยใช้ไอซี 74HCT00 เท่านั้น
    จะต้องออกแบบอย่างไร (ให้วาดรูปผังวงจร)
    ตอบ