เมนู

วันอังคารที่ 12 กรกฎาคม พ.ศ. 2559

Pinguino กับ LCD Adaptor Plate I2C


               บทความครั้งนี้ผมจะเขียนถึงการใช้งาน 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  สลับกันหรือเปล่า ? ก็ถูกนี่ งั้นโค้ดต้องผิดแน่นอนเลย!!!!!


               นั่นคือประสบการณ์ครั้งแรกของผมกับ 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:  }  

1 ความคิดเห็น:

  1. รบกวนสอบถามหน่อยครับว่า board pinguino 8 หาฅื้อได้ที่ไหนครับ

    ตอบลบ