วันจันทร์ที่ 23 กรกฎาคม พ.ศ. 2561

การใช้งาน 7 Segment กับ Arduino

การใช้งาน 7 Segment กับ Arduino Segment หลักเดียว

เมื่อ 2 ปีที่ผ่านมา

โดย เจ้าของร้าน

สวัสดีครับ ก่อนหน้านี้กลุ่ม 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เลขฐาน 211110010B11111001

7 Segment Comon Cathode

ขา gขา fขา eขา dขา cขา bขา aเลขฐาน 200001100B00000110

แต่โดยปกติแล้วการนำเลขฐาน 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 มีกระแสไหลเกินแล้วพังเสียหายได้

ไม่มีความคิดเห็น:

แสดงความคิดเห็น