บทที่ 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
-
เปิดโปรแกรม Arduino IDE ขึ้นมา เลือกบอร์ดเป็นชนิด Arduino Uno, Nano หรือ ESP32 จากนั้นทำการ ดาวน์โหลดไลบรารี่ TM1638 คลิกที่ Sketch -> Include Library -> Manage Libraries ดังตัวอย่างรูปด้านล่าง ทำการติดตั้งให้เรียบร้อย (ไลบรารี่นี้สามารถใช้ได้กับ Arduino Uno, Nano และ ESP32) -
เปิด Example sketch โดยทำการเปิดตัวอย่างโปรแกรมที่มีชื่อว่า Simple โดยคลิกที่ File -> Examples -> TM1638lite->demo

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

-
จากนั้นทำการ upload โปรแกรมเข้าไปยัง Arduino แล้วดูผลที่ได้จากตัวโมดูล TM1638
-
ทดลองกดปุ่มสวิตช์บนตัวโมดูล 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) จะติดสว่าง
แบบฝึกหัดสำหรับทบทวนความเข้าใจและประยุกต์ใช้งานจริง
-
จากโปรแกรมตัวอย่างที่เราได้ทำการทดลองมาข้างต้น ให้ทำการเขียนโปรแกรมใหม่ โดยเมื่อกดสวิตช์ S1 ให้ LED1 ติดสว่าง และให้ 7-segment ตัวที่ 1 แสดงค่า 1 และเมื่อปล่อยสวิตช์ก็ให้ LED และ 7-segment ดับ และถ้ากดสวิตช์ S2 ให้ LED2 ติดสว่าง และให้ 7-segment ตัวที่ 2 แสดงค่า 2 และเมื่อปล่อยสวิตช์ก็ให้ LED และ 7-segment ดับ ทำแบบเดียวกันจนไปถึงสวิตช์ S4
-
จากความรู้เรื่อง DS3231 Real Time Clock ให้แสดงค่าเวลาและวันเดือนปี ออกทาง 7-segment บนโมดูล TM1638 โดยใช้สวิตช์ S1 เป็นตัวสลับการแสดงระหว่างเวลากับวันเดือนปี
-
จากโจทย์ข้อที่2 ด้านบน ให้ต่อยอดโปรแกรม โดยใช้สวิตช์ S2 เป็น “ตัวตั้งเวลา” S3 ปรับค่า “ตัวเลขขึ้น” S4 ปรับค่า “ตัวเลขลง” และ S5 เป็น “สวิตช์ตกลง”




Leave a Reply