บทที่ 20: การเขียนโปรแกรมติดต่อกับโมดูล TM1638

UTEN BOONLIAM Avatar
บทที่ 20 / 26

บทที่ 20: การเขียนโปรแกรมติดต่อกับโมดูล TM1638

ในการใช้งานไมโครคอนโทรลเลอร์ในการแสดงผลหรือรับสัญญาณอินพุตเข้ามา บางครั้งเราเจอปัญหาว่าขาสัญญาณของไมโครคอนโทรลเลอร์ที่จะนำไปใช้ไม่เพียงพอต่อความต้องการ เช่นต้องการรับค่าการกดสวิตช์จากผู้ใช้งาน 8 ตัว แสดงสถานะติดกับให้กับ LED 8 หลอด แสดงผลตัวเลขให้กับ 7 segment 8 หลัก ซึ่งถ้าใช้ขาสัญญาณของไมโครคอนโทรลเลอร์โดยตรงจะต้องใช้ถึง 32 ขา หรือมากกว่านั้น ดังนั้นจึงมีคนคิดค้นบอร์ดสำหรับแสดงผลและรับค่าสวิตช์โดยใช้สัญญาณเพียง 3 เส้นเท่านั้น

โมดูล TM1638 จะใช้ชิฟไอซีเบอร์ TM1368 ในการควบคุมอุปกรณ์ต่าง ๆที่อยู่บนบอร์ด โดยมีคุณสมบัติการทำงานดังนี้

  • มี 8 คีย์สวิตช์ สำหรับกด

  • มีหลอดแอลอีดี 8 ดวง

  • มี 7 segment 8 หลัก ชนิด common cathode

  • ใช้สายสัญญาณเพียง 3 เส้นคือ STB, CLK และ DIO สำหรับควบคุมและรับส่งข้อมูลระหว่างโมดูล TM1638 กับไมโครคอนโทรลเลอร์ โดยสามารถเชื่อมต่อเข้ากับไมโครคอนโทรลเลอร์โดยตรง

สำหรับบอร์ด Arduino Learning Kit มี โมดูล TM1638 ติดตั้งไว้อยู่บนบอร์ดเรียบร้อยแล้ว และมี DIP Switch เป็นตัวเลือกเปิด-ปิดสัญญาณที่จะต่อเข้ากับขาไมโครคอนโทรลเลอร์ ซึ่งในการใช้งานจะต้องเปิด DIP Switch เสียก่อน โดยขาที่ใช้ต่อเข้ากับโมดูลดูได้จากตารางด้านล่าง

STB CLK DIO
Arduino Uno 8 12 13
Arduino Nano 13 A0 A1
ESP32(ESP-WROM-32) 19 8 5

ตารางที่ 20. 1 ขาที่ต่อใช้งาน

ขั้นตอนเขียนโปรแกรมติดต่อกับโมดูล TM1638

  1. เปิดโปรแกรม Arduino IDE ขึ้นมา เลือกบอร์ดเป็นชนิด Arduino Uno, Nano หรือ ESP32 จากนั้นทำการ ดาวน์โหลดไลบรารี่ TM1638 คลิกที่ Sketch -> Include Library -> Manage Libraries ดังตัวอย่างรูปด้านล่าง ทำการติดตั้งให้เรียบร้อย (ไลบรารี่นี้สามารถใช้ได้กับ Arduino Uno, Nano และ ESP32)

  2. เปิด Example sketch โดยทำการเปิดตัวอย่างโปรแกรมที่มีชื่อว่า Simple โดยคลิกที่ File -> Examples -> TM1638lite->demo

  1. เมื่อเปิด Example sketch เรียบร้อยแล้วที่บรรทัดที่ 5 ของโค้ด ให้แก้ไขขาสัญญาณในการเชื่อมต่อ โดยดูจากตารางขาสัญญาณด้านบน

  1. จากนั้นทำการ upload โปรแกรมเข้าไปยัง Arduino แล้วดูผลที่ได้จากตัวโมดูล TM1638

  2. ทดลองกดปุ่มสวิตช์บนตัวโมดูล TM1638 แล้วดูการเปลี่ยนแปลง

อธิบายการทำงานของโค้ด

  • เริ่มต้นที่บรรทัดที่ 1-2 ทำการ include library ของ TM1638 มาใช้งานแล้วทำการประกาศออปเจ็ค tm ขึ้นมาใช้งานแล้วกำหนดขาที่ใช้ติดต่อกับโมดูล TM1638

  • บรรทัดที่ 9 ทำการรีเซ็ตให้กับโมดูล TM1638

  • บรรทัดที่ 11 ให้แสดงข้อความคำว่า “Eh” บนหน้าจอ 7 Segment โดยจะเริ่มที่ตำแหน่งตัวที่ 1 ก่อน โดยใช้คำสั่ง displayText

  • บรรทัดที่ 12 ให้ LED ตำแหน่ง 0 (LED1) ติด โดยใช้คำสั่ง setLED

  • บรรทัดที่ 17 – 18 ให้แสดงตัวอักษร ‘u’ ที่ตำแหน่ง 7-segment ตัวที่ 7 และ แสดงตัวอักษร ‘p’ ที่ตำแหน่ง 7-segment ตัวที่ 8 ซึ่งใช้คำสั่ง displayASCII

  • บรรทัดที่ 19 ให้ LED ตำแหน่ง 7 (LED8) ติด โดยใช้คำสั่ง setLED

  • บรรทัดที่ 23-30 ให้แสดงตัวเลขแสดงเป็นเลขฐาน 16 บน 7-segment ไล่ไปตั้งแต่ตำแหน่ง 1 ถึงตำแหน่งที่ 8 ซึ่งจากการทดลองจะเห็นได้ว่า ค่า 10 จะแสดงตัว ‘a’ ค่า 11 จะแสดงตัว ‘b’

  • บรรทัดที่ 33 ให้แสดงข้อความคำว่า “buttons” บนหน้าจอ 7-segment

  • บรรทัดที่ 37 ในฟังก์ชัน loop ประกาศตัวแปร buttons จากนั้นนำตัวแปรดังกล่าวไปรับค่าคีย์สวิตช์ โดยใช้คำสั่ง readButtons โดยค่าที่ได้จากการกดสวิตช์แต่ละตำแหน่งมีค่าดังนี้

ตำแหน่งสวิตช์ ค่าที่ได้หลังจากการกดสวิตช์
S1 1
S2 2
S3 4
S4 8
S5 16
S6 32
S7 64
S8 128

ตารางที่ 20. 2 ค่าที่ได้จากการกดสวิตช์

  • บรรทัดที่ 38 เป็นการเรียกใช้ฟังก์ชัน doLEDs โดยส่งพารามิเตอร์ buttons ที่ได้จากการกดปุ่มสวิตช์ ไปให้กับฟังก์ชัน

  • บรรทัดที่ 42 – 47 คือฟังก์ชัน doLEDs จะรับค่าจากตัวแปร buttons ที่ส่งมาจากฟังก์ชัน loop จากนั้นนำมาเข้า for-loop เพื่อตรวจสอบและสั่งงานให้กับ LED แต่ละดวงติดสว่าง โดยใช้เทคนิคการ shift resister ให้กับตัวแปรไบนารี่ โดยเลื่อนไปทางขวา ยกตัวอย่างเช่น ถ้ากดสวิตช์ S4 ค่าที่ได้คือ 8 ซึ่งแปลงเป็นเลขฐานสองคือ 00001000 เมื่อเข้า for-loop แล้ว ค่าดังกล่าวจะถูกนำไป AND กับค่า 1 (0000 0001)

$$\frac{0000\ 1000}{0000\ 0001}\& = 0000\ 0000$$

ผลที่ได้คือ 0 ซึ่งก็คือ LED ตำแหน่ง 0 (LED1) ไม่ติด และเมื่อค่าของ position ไปถึงเลข 3 ค่าที่ได้จากการเลื่อนรีจีสเตอร์จะเป็น 0000 0001 แล้วเมื่อนำมา AND กับค่า 1 (0000 0001) ผลลัพธ์ที่ได้คือ

$$\frac{0000\ 0001}{0000\ 0001}\& = 0000\ 0001$$

ผลที่ได้คือ 1 ซึ่งก็คือ LED ตำแหน่ง3 (LED4) จะติดสว่าง

แบบฝึกหัดสำหรับทบทวนความเข้าใจและประยุกต์ใช้งานจริง

  1. จากโปรแกรมตัวอย่างที่เราได้ทำการทดลองมาข้างต้น ให้ทำการเขียนโปรแกรมใหม่ โดยเมื่อกดสวิตช์ S1 ให้ LED1 ติดสว่าง และให้ 7-segment ตัวที่ 1 แสดงค่า 1 และเมื่อปล่อยสวิตช์ก็ให้ LED และ 7-segment ดับ และถ้ากดสวิตช์ S2 ให้ LED2 ติดสว่าง และให้ 7-segment ตัวที่ 2 แสดงค่า 2 และเมื่อปล่อยสวิตช์ก็ให้ LED และ 7-segment ดับ ทำแบบเดียวกันจนไปถึงสวิตช์ S4

 

 

 

  1. จากความรู้เรื่อง DS3231 Real Time Clock ให้แสดงค่าเวลาและวันเดือนปี ออกทาง 7-segment บนโมดูล TM1638 โดยใช้สวิตช์ S1 เป็นตัวสลับการแสดงระหว่างเวลากับวันเดือนปี

 

 

 

  1. จากโจทย์ข้อที่2 ด้านบน ให้ต่อยอดโปรแกรม โดยใช้สวิตช์ S2 เป็น “ตัวตั้งเวลา” S3 ปรับค่า “ตัวเลขขึ้น” S4 ปรับค่า “ตัวเลขลง” และ S5 เป็น “สวิตช์ตกลง”

 

 

 

Leave a Reply

Your email address will not be published. Required fields are marked *