การใช้งาน 7 Segment กับ Arduino ตอนที่ 1 7 Segment หลักเดียว
สวัสดีครับ ก่อนหน้านี้กลุ่ม Arduino Thailand ก็ได้มีคนมาสอบถามเรื่องการใช้งาน Arduino ร่วมกับ 7 Segment อยู่บ้าง แต่ว่าการตอบลงในกลุ่มแบบละเอียดก็คงจะไม่ค่อยสะดวกเท่าไหร่ บางครั้งที่ตอบไปผู้ถามก็เข้าใจบ้าง ไม่เข้าใจบ้าง ดังนั้นในบทความนี้จึงจะเน้นความ "ง่าย" อยู่เหนือทุกสิ่งครับ
7 Segment คืออะไร
7 Segment คือหน้าจอแสดงผลตัวเลข - ตัวอักษร (ได้บางตัว) ที่มีหน้าจอทำมาจากการจัดวางหลอด LED ในแนวยาว เมื่อทำให้หลอด LED แต่ละดวงติดพร้อมกัน ก็จะทำให้แสดงออกมาเป็นตัวเลขทรงเหลี่ยมได้
1. รูปร่างหน้าตาของ 7 Segment 1 หลัก (ขอบคุณรูปภาพจากเว็บไซต์ tandyonline.co.uk)
2. รูปแสดง 7 Segment ที่แสดงผลออกมาเป็นตัวเลขต่างๆ (ขอบคุณรูปภาพจาก maruen.tistory.com)
3. แสดงขาของ 7 Segment (ขอบคุณรูปภาพจาก projectcircuitpack.yolasite.com)
การแบ่งแยก 7 Segment
แบ่งตามขา Common
- Common Anode - ขาคอมม่อนจะต้องต่ออยู่กับขั่วบวก แล้วขาอื่นๆ ต่ออยู่กับกราว์ด จึงจะทำให้ส่วนนั้นๆติดสว่าง
- Common Cathode - ขาคอมม่อนจะต้องต่ออยู่กับขั่วลบ แล้วขาอื่นๆ ต่ออยู่กับขั้วบวก จึงจะทำให้ส่วนนั้นๆติดสว่าง
แบ่งตามขนาด
7 Segment มีด้วยกันหลายขนาด ขนาดที่เป็นมาตรฐานใช้งานทั่วไปคือขนาด 0.56 นิ้ว มีขนาดเล็กกว่า หรือใหญ่กว่าให้เลือกใช้งานด้วย
แบ่งตามจำนวนตัวเลข
ใน 7 Segment อาจจะมีตัวเลขแสดงผลหลายๆตัวติดอยู่ด้วยกัน ทำให้การต่อวงจรง่ายมากยิ่งขึ้น
แบ่งตามสี
- สีแดง
- สีเขียว
- สีอื่นๆ - ผสมสีเพื่อให้สีไม่เหมือนกันในแต่ละจุดได้
การสั่งงาน 7 Segment
7 Segment มีขาหลักๆอยู่ด้วยกันทั้งหมด 9 ขา คือ a b c d e f g dot และ common ในกรณีที่มีตัวเลขจำนวนหลักมากขึ้น ก็จะมีขา Common เพิ่มมากขึ้น เป็น com1 สำหรับควบคุมการแสดงผลหลักที่ 1 , com2 ควบคุมการแสดงผลหลักที่ 2 , com(n) ควบคุมการแสดงผลหลักที่ n
จากรูปที่ 2 จะเห็นว่าในแต่ละแถบยาว จะมีตัวอักษรกำกับอยู่ ซึ่งเป็นชื่อของขาที่ใช้ควบคุมแถบนั้น ตัวอย่างเช่น หากต้องการให้แสดงผลตัวเลข 1 จะต้องให้แถบ b และ c ติดสว่าง จึงจะได้เป็นรูปเลข 1 ที่สมบูรณ์ และหากต้องการให้ติดเลข 3 จะต้องให้แถบ a b c d และ g ติดสว่าง จึงจะทำให้แสดงเลข 3 ที่สมบูรณ์
การจะทำให้แถบแต่ละแถบติดสว่างได้ จะต้องทราบก่อนว่า 7 Segment นั้นเป็นคอมม้อนอะไร เมื่อทราบแล้วจะทำให้สามารถควบคุมการติดดับของแต่ละแถบได้ แบบเดียวกับการควบคุม LED โดยที่หากเป็นคอมม้อน Anode จะต้องต่อขาคอมม้นเข้ากับขั้วบวกของแหล่งจ่ายไฟ (5V) และหากต้องการให้แถบใดติดสว่าง จะต้องให้ขาของแถบนั้นต้องลงกราว์ด (เป็นลอจิก LOW หรือที่เรียกว่า ลอจิกศูนย์)
แต่ถ้าหากเป็นคอมม้อน Cathode จะต้องต่อขาคอมม้อนเข้ากับกราว์ด แล้วต่อขาของแถบที่ต้องการแสดงผลเข้าที่ขั้วบวกของแหล่งจ่าย (เป็นลอจิก HIGH หรือที่เรียกว่าลอจิกหนึ่ง)
ต่อวงจรใช้งานกับ Arduino
เพื่อความง่ายในการต่อวงจร และไม่ยุ่งยากในการเขียนโปรแแกรม ทำให้ในบทความนี้ผมเลือกที่จะใช้ขา 0 ถึงขา 6 ในการต่อร่วมกับ 7 Segment โดยเรียงให้ a - g ต่อเข้าที่ขา 0 - 7
กรณี Comon Anode
กรณี Comon Cathode
การเขียนโปรแกรม Arduino
ในการเขียนโปรแกรมจะอาศัยรีจิสเตอร์ DDRD และ PORTD ในการสั่งงาน ซึ่งจะง่ายกว่าการใช้งาน pinMode() และ digitalWrite() มาก เนื่องจากการเซ็คค่าเข้าไปในรีจิสเตอร์ PORTD จะทำให้สามารถสั่งขาตั้งแต่ขา 0 ถึงขา 7 ได้พร้อมๆกัน
ตามวงจรได้ต่อขา 0 - 6 ไว้กับขา a - g ดังนั้นหากต้องการแสดงเลข 1 จะต้องให้แถบ b และ c ติด ซึ่งจะต้องทำให้ขา b และ c เป็นลอจิก 0 ใน 7 Segment Comon Anode และขาอื่นๆเป็นลอจิก 1 หรือลอจิก 1 ใน 7 Segment Comon Cathode และขาอื่นๆเป็นลอจิก 0
เมื่อนำมาเรียงในเลขฐาน 2 จะได้เป็น
7 Segment Comon Anode
ขา g | ขา f | ขา e | ขา d | ขา c | ขา b | ขา a | เลขฐาน 2 |
1 | 1 | 1 | 1 | 0 | 0 | 1 | 0B11111001 |
7 Segment Comon Cathode
ขา g | ขา f | ขา e | ขา d | ขา c | ขา b | ขา a | เลขฐาน 2 |
0 | 0 | 0 | 0 | 1 | 1 | 0 | 0B00000110 |
แต่โดยปกติแล้วการนำเลขฐาน 2 ไปใส่ในโปรแกรมจะทำให้ซัพซ้อน และยาวมากเกินไป จึงนิยมทำเป็นเลขฐาน 16 มากกว่า ดังนั้นจึงได้
7 Segment Comon Anode : 0xF9
7 Segment Comon Cathode : 0x06
เมื่อนำไปเขียนโค้ดจะได้
void setup() {
DDRD = 0xFF; // เซ็ตให้ขา 0 - 7 เป็นเอาต์พุต
PORTD = 0xF9; // เซ็ตให้แสดงค่า 0xF9 ออกไป (แสดงเลข 1 ใน 7 Segment Comon Anode)
}
void loop() { }
หรือ
void setup() {
DDRD = 0xFF; // เซ็ตให้ขา 0 - 7 เป็นเอาต์พุต
PORTD = 0x06; // เซ็ตให้แสดงค่า 0xF9 ออกไป (แสดงเลข 1 ใน 7 Segment Comon Cathode)
}
void loop() { }
เมื่ออัพโหลดโค้ดลงไป ก็จะแสดงเลข 1 ออกทาง 7 Segment
หากต้องการแสดงเลขอื่นๆก็จะต้องทำแบบเดียวกัน คือ การพิจาณาแถบที่ต้องติด นำมาวางเป็นตาราง คิดเป็นเลขฐาน 2 แลัวแปลงเป็นเลขฐาน 16
แต่เพื่อความง่าย ผมได้คิดมาให้แล้ว และเอาลงอาร์เรย์ดังนี้
int num[] = { 0x3F, 0x06, 0x5B, 0x4F, 0x66, 0x6D, 0x7D, 0x07, 0x7F, 0x6F };
เวลาจะใช้งานก็ใช้คำสั่งเพียง PORTD = num[1]; ก็จะแสดงเลข 1 ออกมา และหากใช้เป็น PORTD = num[9]; ก็จะแสดงเลข 9 ออกมา ซึ่งโค้ดเต็มๆ คือ
int num[] = { 0x3F, 0x06, 0x5B, 0x4F, 0x66, 0x6D, 0x7D, 0x07, 0x7F, 0x6F };
void setup() {
DDRD = 0xFF;
PORTD = num[9];
}
void loop() { }
โค้ดด้านบนเป็นของ Common Cathode หากใช้แบบ Common Anode ก็ใส่เพียงเครื่องหมายกลับบิต (~) ไว้ด้านหน้าเท่านั้น
int num[] = { 0x3F, 0x06, 0x5B, 0x4F, 0x66, 0x6D, 0x7D, 0x07, 0x7F, 0x6F };
void setup() {
DDRD = 0xFF;
PORTD = ~num[9];
}
void loop() { }
เมื่ออัพโหลดโค้ดลงไป จะได้ผลออกมาดังรูปด้านล่างนี้
หมายเหตุ ในโปรแกรมจะไม่ใส่ตัวต้านทานเนื่องจากใส่ และไม่ใส่ผลที่ได้เป็นแบบเดียวกัน แต่เมื่อนำไปใส่ในวงจรจริงๆจำเป็นต้องใส่เพื่อป้องกันไม่ให้ 7 Segment มีกระแสไหลเกินแล้วพังเสียหายได้
//ที่มา www.ioxhop.com
ไม่มีความคิดเห็น:
แสดงความคิดเห็น