วันพฤหัสบดีที่ 16 กุมภาพันธ์ พ.ศ. 2560


การทดลองใช้งานโมดูล OLED Display ขนาด 128x64 พิกเซล

OLED (Organic Light-Emitting Diode) display เป็นจอแสดงผลกราฟิกประเภทหนึ่งที่สร้างจากวัสดุ "สารกึ่งตัวนำอินทรีย์" (Organic Semiconductor) มีลักษณะเป็นชั้นบางๆ อยู่ระหว่างขั้วบวก (Anode) และขั้วลบ (Cathode) และสามารถเปล่งแสงได้เมื่อมีกระแสไฟฟ้าไหลผ่าน เรียกกระบวนการนี้ว่า อิเล็คโทรลูมิเนเซนส์ (Electroluminescence) จอภาพ OLED มีข้อดีซึ่งแตกต่างจากจอแสดงผล LCD (Liquid Crystal Display) ทั่วไปคือ ไม่ต้องมีวงจรที่สร้างแสง Backlight ดังนั้นจึงมีความหนาน้อยกว่าและเบากว่า ใช้กำลังไฟฟ้าต่ำ นอกจากนั้นจะไม่มีการเปล่งแสงในบริเวณที่ต้องการให้เป็นสีดำ ในปัจจุบันอุปกรณ์อย่างเช่น โทรทัศน์, สมาร์ทโฟน (Smartphones), แท็บเล็ต (Tablets) ได้เริ่มเปลี่ยนไปใช้จอภาพแบบ OLED กันมากขึ้น   บทความนี้กล่าวถึง การทดลองใช้งานโมดูลจอแสดงผลกราฟิกแบบ OLED ขนาดเล็ก ซึ่งมีขนาด 128x64 พิกเซล ให้แสงเพียงสีเดียว (Monochrome) โดยทดลองเขียนโค้ดและใช้งานร่วมกับบอร์ด Arduino และใช้วิธีเชื่อมต่อแบบบัส I2C และ SPI
คำสำคัญ / Keywords: OLED Graphic Display, Arduino, SPI, I2C

โมดูล OLED

โมดูล OLED ที่ได้เลือกมาทดลองใช้งาน สามารถแสดงผลได้แบบสีเดียว (Monochrome) มีขนาดจอภาพ 0.96" ความละเอียด 128x64 พิกเซล ซึ่งถือว่ามีขนาดเล็ก และใช้แรงดันไฟเลี้ยง +3.3V แม้ว่าจะมีขนาดเล็กแต่ก็เหมาะสำหรับนำไปใช้กับระบบ embedded systems ที่ต้องการส่วนแสดงผลกราฟิกขนาดเล็ก มีพื้นที่จำกัด เป็นต้น   ภายในโมดูลมีชิป SSD1306 เป็นตัวควบคุมการทำงาน สามารถเชื่อมต่อกับโมดูลโดยใช้บัส SPI หรือ I2C ถ้าต้องการแสดงข้อความ จะต้องมีข้อมูลสำหรับสร้างตัวอักษร (FONT) แต่ละตัวซึ่งมีลักษณะเป็นแบบ Bitmap เก็บไว้ในหน่วยความจำของไมโครคอนโทรลเลอร์ เช่น เก็บไว้ในหน่วยความจำสำหรับโปรแกรมที่เรียกว่า Program Memory (เป็นแบบ Flash Memory) เพื่อประหยัดการใช้พื้นที่ใน SRAM ของไมโครคอนโทรลเลอร์
การจัดการหน่วยความจำภายในของ SSD1306 ที่เรียกว่า Graphic Display Data RAM (GDDRAM) สำหรับขนาด 128x64 พิกเซล แบ่งเป็น Column และ Page ซึ่งมีทั้งหมด 128 คอลัมน์ (หมายเลข 0..127) และมีทั้งหมด 8 เพจ (หมายเลข 0..7) แต่ละเพจ จะประกอบด้วย 8 บรรทัด ดังนั้นจึงมี 8x8 = 64 บรรทัด (rows)   การแสดงผลของจอภาพขึ้นอยู่กับค่าบิต (0 หรือ 1) สำหรับแต่ละพิกเซลที่ได้เขียนข้อมูลลงในหน่วยความจำ GDDRAM
การสื่อสารข้อมูลกับชิป SSD1306 ทำได้โดยผ่านบัส SPI หรือ I2C โดยต้องส่งคำสั่ง (Command) เพื่อกำหนดค่าต่างๆในการทำงาน (ศึกษารายละเอียดได้จาก Datasheet ของผู้ผลิต) เช่น คำสั่ง turn on/off display คำสั่งเลือกรูปแบบ memory addressing mode คำสั่งกำหนดค่า Start Address และ End Address สำหรับ Column และ Page เป็นต้น และการเขียนข้อมูล (Data) เป็นการเขียนข้อมูลลงใน GDDRAM


รูปแสดงตัวอย่าง 0.96" 128x64 OLED Display Module แบบ I2C (ด้านหน้า)


รูปแสดงตัวอย่าง 0.96" 128x64 OLED Display Module แบบ I2C (ด้านหลัง)
หมายเลขที่อยู่ (7-bit device address) ของโมดูลนี้คือ 0x3C


รูปแสดงตัวอย่าง 0.96" 128x64 OLED Display Module แบบ SPI (ด้านหน้า)


รูปแสดงตัวอย่าง 0.96" 128x64 OLED Display Module แบบ SPI (ด้านหลัง)


ขาของโมดูล OLED ในกรณีที่ใช้ I2C
  • VCC เป็นขาสำหรับแรงดันไฟเลี้ยง +3.3V
  • GND เป็นขา Ground
  • SCL เป็นขา I/O สำหรับสัญญาณ SCL (serial clock) สำหรับ I2C
  • SDA เป็นขา I/O สำหรับสัญญาณ SDA (serial data) สำหรับ I2C

ขาของโมดูล OLED ในกรณีที่ใช้ SPI
  • GND เป็นขา Ground
  • VCC เป็นขาสำหรับแรงดันไฟเลี้ยง +3.3V
  • D0 เป็นขาอินพุตที่ต่อกับ SCK ของบัส SPI
  • D1 เป็นขาอินพุตที่ต่อกับ MOSI ของบัส SPI
  • RST เป็นขาอินพุต Reset (Active-Low) สำหรับรีเซตการทำงานของโมดูล
  • DC เป็นขาอินพุต D/C (Data / Command) เพื่อใช้ระบุว่าเป็นการส่งคำสั่งหรือข้อมูลไปยังโมดูล
  • CS เป็นขาอินพุต Chip Select สำหรับ SPI

Arduino Sketch

เพื่อศึกษาการเขียนโค้ดและให้ง่ายต่อการเขียนโค้ดสำหรับใช้งานโมดูล OLED ดังกล่าว (สำหรับขนาด 128x64 เท่านั้น) จึงได้จัดทำเป็นไลบรารี่ (C++ class) ไว้ใช้สำหรับ Arduino (โดยได้ศึกษาจากเอกสาร datasheet โค้ดตัวอย่างและไลบรารี่ของ Adafruit) แบ่งเป็นสองคลาสคือ OLED_SSD1306_I2C และ OLED_SSD1306_SPI ซึ่งมีความแตกต่างกันตรงที่ขาสัญญาณ I/O ที่ใช้ และรูปแบบการส่งคำสั่งและข้อมูล (I2C หรือ SPI) ของโมดูล OLED
โค้ดสำหรับ OLED ที่ได้เขียนไว้นี้ ใช้หน่วยความจำ SRAM เพื่อเก็บข้อมูลพิกเซลและใช้งานเป็น Display Buffer ซึ่งมีขนาด 128 x 64 / 8 = 1024 ไบต์ และจะต้องมีส่งข้อมูลทั้งหมดใน Display Buffer ไปยังโมดูล OLED เพื่ออัพเดทหน้าจอ ดังนั้นจึงเป็นข้อควรระวัง: สำหรับกรณีที่มีการนำไปใช้งานร่วมกับโค้ดอื่นๆ ที่ต้องใช้พื้นที่ใน SRAM ค่อนข้างมากเมื่อเทียบกับความจุ SRAM ทั้งหมดของไมโครคอนโทรลเลอร์

Sourcecode: OLED_SSD1306_I2C_Demo.zip และ OLED_SSD1306_SPI_Demo.zip
//////////////////////////////////////////////////////////////////////////
// Author: RSP @ Embedded System Lab (ESL), KMUTNB, Thailand
// File: OLED_SSD1306_I2C_Demo.ino
// Arduino IDE: version 1.0.5
// Target Board: Arduino Pro Mini (3.3V), iBoard-EX (32U4, 3.3V)
// Last Modified: 2014-07-13
// Note:
//   This Arduino sketch demonstrates how to use the OLED_SSD1306_I2C class.
//////////////////////////////////////////////////////////////////////////

#include <Wire.h>
#include "OLED_SSD1306_I2C.h"

using namespace esl;

#define I2C_ADDR  (0x3C)

OLED_SSD1306_I2C oled( I2C_ADDR );

char sbuf[20];
uint32_t timestamp;


void setup() {  
  // initialize the I2C (Wire) first
  Wire.begin( I2C_ADDR );
  TWBR = 12; // use 400kHz instead of 100kHz

  oled.init(); // initialize the OLED
    
  timestamp = millis();
}

uint32_t value = 1000;

void loop() {
  if ( millis() - timestamp >= 100 ) { 
    oled.clearBuffer();
    oled.useNormalFont();
    oled.drawText( 4, 8, "Meter ID:" );
    oled.drawText( 4, 24, "Electric Energy (kWh)" );
    oled.useBoldFont();
    oled.drawText( 64, 8, "123456" );
    sprintf( sbuf, "%05u.%03u", (uint16_t)(value/1000), (uint16_t)(value%1000) );
    oled.drawText( 22, 46, sbuf );
    oled.drawRect( 10, 36, OLED_SSD1306_I2C::LCD_WIDTH-10, OLED_SSD1306_I2C::LCD_HEIGHT-1 );
    oled.update();
    value += 1;
    timestamp += 100;
  }
}

//////////////////////////////////////////////////////////////////////////

ในการทดลองใช้งานโมดูล OLED ได้ใช้บอร์ด Arduino Pro Mini (328P, 3.3V / 8MHz) และบอร์ด iBoard-Ex (Leonardo, ATmega32u4, 16MHz/3.3V) ซึ่งทั้งสองบอร์ดทำงานที่แรงดันไฟเลี้ยง +3.3V สามารถนำไปต่อกับโมดูล OLED ได้โดยตรง


รูปแสดงการต่อวงจรใช้งานโมดูล OLED (SPI) ร่วมกับ Arduino Pro Mini (3.3V)
แสดงหน้าจอเป็นข้อความที่ใช้ตัวอักษร (Font) แบบตัวปรกติ (Normal) และตัวหนา (Bold)


รูปแสดงการต่อวงจรใช้งานโมดูล OLED (SPI) ร่วมกับ Arduino Pro Mini (3.3V)
แสดงหน้าจอเป็นรูปกราฟิกจาก Bitmap และมีข้อความด้วย


รูปแสดงการวัดอุณหภูมิโดยใช้ไอซี DS18B20 และแสดงค่าอุณหภูมิบนจอ OLED


รูปแสดงการต่อวงจรใช้งานโมดูล OLED (I2C) ร่วมกับ iBoard-Ex

นาย สุธรรม แสงทรง


แหล่งข้อมูลอ้างอิงและศึกษาเพิ่มเติม

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

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