表示器 (WS0010)

2013/05/20


◆ グラフィック有機ELモジュール

ストロベリーリナックスさんで取り扱っている 100x16 のグラフィック有機ELモジュールを使ってみます.

有機ELディスプレイ (OLED) は自家発光するので文字が鮮明に見え、応答速度が速いので残像が機になりません。 また、3.3V、5V どちらでも動作するので、 Arduino に限らず mbed、stbee と幅広く扱えます。

コマンドは HD44780 互換のキャラクタ液晶モードがあり、既存のライブラリで一応の表示ができます。

拡張コマンドでグラフィック液晶として動作するので漢字表示もできます。

有機ELディスプレイは焼き付きを起こすので注意が必要ですが、モノクロ・グラフィックの場合はどうなんだろう?

コントローラ WS0010
解像度 100 x 16 dot
動作電圧 3.3V ~ 5.0V

  1.VDD     → 3.3 - 5.0V
  2.Vss     → GND
  3.NC      →
  4.RS      → Data / Command  → D2
  5.R/W     → Read / Write    → D3
  6.E       → Enable          → D4
  7.DB0     → DB0
  8.DB1     → DB1
  9.DB2     → DB2
 10.DB3     → DB3
 11.DB4     → DB4             → D5
 12.DB5     → DB5             → D6
 13.DB6     → DB6             → D7
 14.DB7     → DB7             → D8


◆ 制御コマンド

キャラクタ液晶のように 4ビットモードをサポートしているので、DB5 ~ DB8 を配線します。

Instruction DC RS Command byte  
7 6 5 4 3 2 1 0
Clear Display 0 0 0 0 0 0 0 0 0 1 6.2ms
Return Home 0 0 0 0 0 0 0 0 1 0  
Entry Mode Set 0 0 0 0 0 0 0 1 I/D S  
I/D   0 = Increment
      1 = Decrement

S     0 = Shift to Right
      1 = Shift to Left
 
Display On/Off Control 0 0 0 0 0 0 1 D C B  
D     0 = Display off
      1 = Display on

C     0 = Cursor off
      1 = Cursor on

B     0 = Blink off
      1 = Blink on
 
Cursor / Display Shift 0 0 0 0 0 1 S/C R/L 0 0  
S/C,R/L  00 = Shift Cursor Left
         01 = Shift Cursor Right
         10 = Shift Display Left
         11 = Shift Display Right
 
Mode/Power 0 0 0 0 0 1 G/C PWR 1 1  
G/C   0 = Character Mode
      1 = Graphic Mode

PWR   0 = internal power is turned On
      1 = internal power is turned Off
 
Function Set 0 0 0 0 1 DL N F FT  
DL    0 = 4-bits Mode
      1 = 8-bits Mode

N     0 = 1-Line
      1 = 2-Line

F     0 = 5 x  8 Font
      1 = 5 x 10 Font

FT    00 = English_Japanese Character Font Table
 
Set CGRAM Address 0 0 0 1 Address  
Set DDRAM Address 0 0 1 Address  
Read Busy Flag 0 1 BF Address Counter  
Write Data 1 0 Data  
Read Data 1 1 Data  

◆ 初期化手順

Power On
  wait 500ms

Function Set
  RS = 0, RW = 0, 0x02    4-bit Mode
  RS = 0, RW = 0, 0x02
  RS = 0, RW = 0, 0x08    2Line, 5x8Font, Eng_Jpn Set

Display On/Off Control
  RS = 0, RW = 0, 0x0C    Display on, Cursor off

Display Clear
  RS = 0, RW = 0, 0x01

Entry Mode Set
  RS = 0, RW = 0, 0x04

◆ サンプル・スケッチ

いつものように、コマンド/データ転送関数と初期化関数の他にいくつかの関数を作成し、動作を確認する。

//
// Div 002-01 有機ELディスプレイ
//

#define pin_RS 2  // Data/Command
#define pin_RW 3  // Read/Write
#define pin_E 4   // Enable
#define pin_DB4 5 // DB4
#define pin_DB5 6 // DB5
#define pin_DB6 7 // DB6
#define pin_DB7 8 // DB7

void setup() {
  pinMode(pin_RS,  OUTPUT);
  pinMode(pin_RW,  OUTPUT);
  pinMode(pin_E,   OUTPUT);
  pinMode(pin_DB4, OUTPUT);
  pinMode(pin_DB5, OUTPUT);
  pinMode(pin_DB6, OUTPUT);
  pinMode(pin_DB7, OUTPUT);

  oledInitialize();
}

void loop() {
  oledCLS();
  oledLOCATE(0,0);
  oledPRINT("Hello");
  oledLOCATE(3,1);
  oledPRINT("Hello");

  while(1);
}

// ラッチ
void eLatch(void) {
  digitalWrite(pin_E, LOW);
  delayMicroseconds(1);
  digitalWrite(pin_E, HIGH);
  delayMicroseconds(1);
  digitalWrite(pin_E, LOW);
  delay(1);
}

// ポートセット
void writeBus(boolean rs, boolean rw, byte b) {
  digitalWrite(pin_RS, rs);
  digitalWrite(pin_RW, rw);
  (b & 0x1) ? digitalWrite(pin_DB4,HIGH): digitalWrite(pin_DB4, LOW);
  (b & 0x2) ? digitalWrite(pin_DB5,HIGH): digitalWrite(pin_DB5, LOW);
  (b & 0x4) ? digitalWrite(pin_DB6,HIGH): digitalWrite(pin_DB6, LOW);
  (b & 0x8) ? digitalWrite(pin_DB7,HIGH): digitalWrite(pin_DB7, LOW);
  eLatch();
}

// 初期化
void oledInitialize(void) {
  delay(500);
  writeBus(0, 0, 0x0);
  writeBus(0, 0, 0x0);
  writeBus(0, 0, 0x0);
  writeBus(0, 0, 0x0);
  writeBus(0, 0, 0x0);

  writeBus(0, 0, 0x2); // Set 4-bits mode
  writeBus(0, 0, 0x2); // Function set
  writeBus(0, 0, 0x8); // 2line, E_J font 5x8

  writeBus(0, 0, 0x0); 
  writeBus(0, 0, 0xc); // display on/cursor off/blink off 

  writeBus(0, 0, 0x0);
  writeBus(0, 0, 0x1); // display clear
  delay(10);

  writeBus(0, 0, 0x0);
  writeBus(0, 0, 0x6); // Entry mode

  writeBus(0, 0, 0x1); 
  writeBus(0, 0, 0x4); // display shift / charactor mode
}

// カーソルセット
void oledLOCATE(byte row, byte col) {
  if (col == 0) {
    col = 0x80 + row;
  } else {
    col = 0xc0 + row;
  }
  writeBus(0, 0,col >> 4);
  writeBus(0, 0,col & 0xF);
}

// CLS
void oledCLS(void) {
  writeBus(0, 0, 0x0);
  writeBus(0, 0, 0x2);
  writeBus(0, 0, 0x0);
  writeBus(0, 0, 0x1);
  delay(10);
}

// 1文字表示
void oledChar(char c) {
  writeBus(1, 0, c >> 4);
  writeBus(1, 0, c & 0xF);
}

// 文字列表示
void oledPRINT(char *c) {
  while (*c) oledChar(*c++);
}

機会があったらグラフィックモードでのサンプルも書いておきます。