การทดลองที่ 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 ชุด
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 ของวงจร
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;
}
วงจรที่ออกแบบ
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;
}
วงจรที่ออกแบบ
ไม่มีความคิดเห็น:
แสดงความคิดเห็น