บทความครั้งนี้ผมจะเขียนถึงการใช้งาน
LCD
Adaptor Plate I2C หรือบางทีก็เรียกว่า I2C Convertor Module
for LCD1602/2004 ซึ่งรูปร่างหน้าตาของมันก็จะอยู่ในรูปที่ 1 เจ้าตัวนี้นั้นถูกออกแบบมาเพื่อให้สามารถใช้สายสัญญานเพียงสองเส้นก็สามารถสื่อสารและแสดงข้อความบนจอ
LCD ขนาด 16x2 หรือ 20x4 ได้แล้ว จากเดิมที่ต้องใช้อย่างน้อย 6 เส้นถึงจะสื่อสารกันได้ อีกทั้งราคาที่ถูกมากจึงได้รับความนิยมสูง โดยตัว
I2C converter นี้จะมีอยู่หลายเวอร์ชัน
ซึ่งแต่ละเวอร์ชันก็จะมี I2C address ไม่เหมือนกัน
ข้อมูลเพิ่มเติมสามารถหาอ่านได้จากที่นี่ครับ ค่อนข้างละเอียดดีทีเดียว
รูปที่ 1 LCD Adaptor Plate I2C |
จากการดูและเปรียบเทียบแล้วตัวที่ผมมีอยู่นั้นมี
หมายเลข I2C
address เป็น 0x27 เมื่อรู้ดังนี้แล้วก็เริ่ม wiring
สายจาก I2C convertor ไปที่ตัวบอร์ด Pinguino
8 ซึ่งก็จะมีเพียงแค่ 4 เส้นเท่านั้น คือ Vdd, Gnd, SCL, SDA
ซึ่งก็จะมี
label พิมพ์ติดไว้อยู่แล้วทั้งบน I2C convertor และ Pinguino
8 โดยเมื่อต่อเสร็จแล้วก็จะได้ตามรูปที่ 2 ครับ
รูปที่ 2 เชื่อมต่อกับ Pinguino 8 |
และในส่วนของโค้ดที่จะเขียนนั้นง่ายและสั้นมากครับโดยเราเพียงต้อง
initialize
เจ้า I2C convertor ว่าต่ออยู่กับจอ LCD
ขนาดเท่าไหร่ 16x2 หรือ 20x4 และกำหนดหมายเลข address ให้ตรงกับของ I2C
convertor เท่านั้นเองซึ่งตัวที่ผมใช้คือ 0x27 โดยโค้ดจะเป็นดังนี้ครับ
1: lcdi2c.init(16,2,0x27);
2: lcdi2c.backlight();
3: lcdi2c.printf("Hello Thailand");
ในบรรทัดแรกเป็นการ
initialize
อย่างที่ได้อธิบายด้านบน ส่วนบรรทัดถัดมาเป็นการสั่งให้ไฟ back
light สว่างขึ้นมา และบรรทัดสุดท้ายก็ให้ส่งข้อความ Hello
Thailand ออกมาแสดงครับ เมื่อเราสั่งคอมไพล์และโปรแกรมลงตัวไมโครคอนโทรลเลอร์แล้วก็จะจะจะ……..อ้าว! ทำไมไม่มีอะไรเกิดขึ้นเลย ต่อสาย SCL กับ SCA สลับกันหรือเปล่า
? ก็ถูกนี่ งั้นโค้ดต้องผิดแน่นอนเลย!!!!!
ผมจึงแก้ไขใหม่ให้ตรงกับตัว I2C convertor for LCD ที่ผมมีอยู่โดยแก้เป็นของใหม่ดังนี้ครับ
นั่นคือประสบการณ์ครั้งแรกของผมกับ
Pinguino
กับ I2C converter for LCD ครับ
ผมใช้เวลาอยู่หลายวันหาข้อมูลจากอินเตอร์เน็ทก็หาไม่ค่อยได้ สุดท้ายผมหาเจอ
schematic หรือ ใน Arduino forum นี่แหละจำไม่ค่อยได้แล้วครับ
ประกอบกับนั่งอ่าน library ของ Pinguino เองจนพบว่าในไฟล์ที่ชื่อ lcdi2c.h ที่อยู่ในโฟล์เดอร์
‘C:\pinguino-11\p8\include\pinguino\libraries’ นั้น define
ขาที่ต่อกับ PCF8574 ไม่ตรงกันโดยของเดิมจะเป็น
1: #define LCD_BL PCF8574_data.bits.bit0 // P0
2: #define LCD_RS PCF8574_data.bits.bit1 // P1
3: #define LCD_RW PCF8574_data.bits.bit2 // P2
4: #define LCD_EN PCF8574_data.bits.bit3 // P3
ผมจึงแก้ไขใหม่ให้ตรงกับตัว I2C convertor for LCD ที่ผมมีอยู่โดยแก้เป็นของใหม่ดังนี้ครับ
1: #define LCD_BL PCF8574_data.bits.bit3 // P0
2: #define LCD_RS PCF8574_data.bits.bit0 // P1
3: #define LCD_RW PCF8574_data.bits.bit1 // P2
4: #define LCD_EN PCF8574_data.bits.bit2 // P3
หลังจาก save file แล้ว ทำการคอมไพล์ใหม่และโปรแกรมลงไมโครคอนโทรลเลอร์อีกครั้ง คราวนี้…..ทำงานได้แล้วครับ เย้ๆ ลองดูจากวิดีโอดูนะครับ ส่วนข้างล่างนี้เป็นโค้ดทั้งหมดนะครับ
1: /*-----------------------------------------------------
2: Author: --<Ekkachai Muangrodpai>
3: Board: Pinguino8 + I2C LCD board.
4: Date: 2016-03-20
5: Description:
6: - display message on LCD through I2C adaptor.
7: -----------------------------------------------------*/
8: /*
9: Note: must change the definition in 'lcdi2c.h' to match the hardware. Like following:
10: #define LCD_BL PCF8574_data.bits.bit3 // P0
11: #define LCD_RS PCF8574_data.bits.bit0 // P1
12: #define LCD_RW PCF8574_data.bits.bit1 // P2
13: #define LCD_EN PCF8574_data.bits.bit2 // P3
14: */
15: void setup() {
16: // put your setup code here, to run once:
17: lcdi2c.init(16,2,0x27);
18: lcdi2c.backlight();
19: lcdi2c.printf("Hello Thailand");
20: }
21: void loop() {
22: // put your main code here, to run repeatedly:
23: }
ของแถมครับ
จาก link
ข้างบนผมเห็นมีตัวอย่างของ Arduino ที่ใช้ Serial
รับค่า string จากคอมพิวเตอร์แล้วเอามาแสดงผลบนจอ
LCD ที่ต่อผ่าน I2C adaptor for LCD
ซึ่งน่าสนุกดีผมจึงลองเขียนด้วย Pinguino ดูบ้างโดยใช้ฟังก์ชันจากบทความนี้และจากบทความที่ผ่านมาเรื่อง
Pinguino สื่อสารผ่าน Com Port ก็ได้มาเป็นโค้ดที่แสดงข้างล่างต่อไปนี้ครับลองทดลองกันดูนะครับ
1: /*-----------------------------------------------------
2: Author: --<Ekkachai Muangrodpai>
3: Board: Pinguino8 + I2C convertor for LCD board + USB-to-Serial.
4: Date: 2016-07-11
5: Description:
6: - Get string from computor through terminal program, then display on LCD.
7: -----------------------------------------------------*/
8: int i;
9: void setup() {
10: Serial.begin(9600);
11: lcdi2c.init(16, 2, 0x27);
12: // ------- Quick 3 blinks of backlight -------------
13: for(i = 0; i< 3; i++)
14: {
15: lcdi2c.backlight();
16: delay(250);
17: lcdi2c.noBacklight();
18: delay(250);
19: }
20: lcdi2c.backlight(); // finish with backlight on
21: //-------- Write characters on the display ------------------
22: lcdi2c.setCursor(0,0);
23: lcdi2c.printf("Hello, World!....");
24: delay(1000);
25: lcdi2c.setCursor(0,1);
26: lcdi2c.printf("Hi Your Pinguino");
27: delay(1000);
28: // Wait and then tell user they can start the Serial Monitor and type in characters to
29: // Display. (Set Serial Monitor option to "No Line Ending")
30: lcdi2c.clear();
31: lcdi2c.setCursor(0,0); //Start at character 0 on line 1
32: lcdi2c.printf("Use Serial Mon");
33: lcdi2c.setCursor(0,1);
34: lcdi2c.printf("Type to display");
35: }
36: void loop() {
37: // when characters arrive over the serial port...
38: if (Serial.available()) {
39: delay(100); // wait a bit for the entire message to arrive
40: lcdi2c.clear();
41: // read all the available characters
42: while (Serial.available() > 0) {
43: lcdi2c.write(Serial.read()); // display each character to the LCD
44: }
45: }
46: }