การทดลองที่ 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 ถึง 92. ต่อตัวต้านทาน 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;
}
}
}
}
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;
}
}
}
}
ไม่มีความคิดเห็น:
แสดงความคิดเห็น