DOT1616(OLEDドット絵表示モジュール)

製品仕様

・有機EL(OLED)SSD1331を搭載、最大64×64ドット、256色表示が可能

・ATtiny85マイコンを搭載、16×16ドットのドット絵を内蔵メモリに複数保持可能

・表面は厚さ2mmのアクリルパネルを使用

・microUSBケーブルによる給電

・モジュールサイズは30.7mm×27.3mm×8.0mm 

基板イメージ

回路図

・ATtiny85マイコンを搭載したUSB開発ボードはDigispark互換品を使用。

・USB給電ラインにダイオードを追加。VF=1.1V(0.3V+0.8V)分を降下させて、モジュール内の電源電圧を4V(3.9V程度)に変更。

・市販のOLEDモジュールのピン配置と合わせる為、信号ラインをカット&ジャンパー処理。

・市販のOLEDモジュールはそのまま使用。I/O電圧は実測max3.7Vで定格(VCC+0.5V)の範囲内であることを確認。

サンプルソース

  /* ATtiny85 Graphics Display v2

   David Johnson-Davies - www.technoblogy.com - 8th May 2018
   ATtiny85 @ 8 MHz (internal oscillator; BOD disabled)
  
   CC BY 4.0
   Licensed under a Creative Commons Attribution 4.0 International license:
   http://creativecommons.org/licenses/by/4.0/
*/

// OLED SSD1331 64x64 256 color display ****************************************

// Pins

int const clk = 1;
int const data = 2;
int const dc = 4;
int const cs = 0;
int const rst = 3;

// Initialisation sequence for OLED module
int const InitLen = 37;
const unsigned char Init[InitLen] PROGMEM = {
  0xAE, //SSD1331_CMD_DISPLAYOFF
  0xA0, //SSD1331_CMD_SETREMAP
  0x32,
  0xA1, //SSD1331_CMD_STARTLINE
  0x00,
  0xA2, //SSD1331_CMD_DISPLAYOFFSET
  0x00,
  0xA4, //SSD1331_CMD_NORMALDISPLAY
  0xA8, //SSD1331_CMD_SETMULTIPLEX
  0x3F,
  0xAD, //SSD1331_CMD_SETMASTER
  0x8E,
  0xB0, //SSD1331_CMD_POWERMODE
  0x0B,
  0xB1, //SSD1331_CMD_PRECHARGE
  0x74,
  0xB3, //SSD1331_CMD_CLOCKDIV
  0xF0,
  0x8A, //SSD1331_CMD_PRECHARGEA
  0x80,
  0x8B, //SSD1331_CMD_PRECHARGEB
  0x80,
  0x8C, //SSD1331_CMD_PRECHARGEA
  0x80,
  0xBB, //SSD1331_CMD_PRECHARGELEVEL
  0x3E,
  0xBE, //SSD1331_CMD_VCOMH
  0x3E,
  0x87, //SSD1331_CMD_MASTERCURRENT
  0x0F,
  0x81, //SSD1331_CMD_CONTRASTA
  0xFF,
  0x82, //SSD1331_CMD_CONTRASTB
  0xFF,
  0x83, //SSD1331_CMD_CONTRASTC
  0xFF,
  0xAF  //SSD1331_CMD_DISPLAYON
};

// Write a data byte to the display
void Data(uint8_t d) { 
  uint8_t changes = d ^ (d>>1);
  PORTB = PORTB & ~(1<<data);
  for (uint8_t bit = 0x80; bit; bit >>= 1) {
    PINB = 1<<clk; // clk low
    if (changes & bit) PINB = 1<<data;
    PINB = 1<<clk; // clk high
  }
}

// Write a command byte to the display
void Command(uint8_t c) {
  PINB = 1<<dc; // dc low
  Data(c);
  PINB = 1<<dc; // dc high
}

void InitDisplay () {
  digitalWrite(rst, LOW);
  delay(100);
  digitalWrite(rst, HIGH);
  delay(100);

  PINB = 1<<cs; // cs low
  for (uint8_t c=0; c<InitLen; c++) Command(pgm_read_byte(&Init[c]));

  Command(0x25); //Clear Window
  Command(0x00); //Column Start
  Command(0x00); //Row Start
  Command(0x5F); //Column End
  Command(0x3F); //Row End
  delay(100);

  Command(0x15); //
  Command(0x10); //Column Start
  Command(0x4F); //Column End
  Command(0x75); //
  Command(0x00); //Row Start
  Command(0x3F); //Row End

  PINB = 1<<cs; // cs high
}

// Graphics **********************************************

// Character set for text - stored in program memory
const uint8_t Char1[16][16] PROGMEM = {
{ 0x00,0x00,0x00,0x00,0x00,0x20,0x20,0x20,0x20,0x20,0x20,0x00,0x00,0x00,0x00,0x00 },
{ 0x00,0x00,0x20,0x00,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x00,0x20,0x00,0x00 },
{ 0x00,0x20,0x29,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x00 },
{ 0x00,0x20,0x29,0x20,0x20,0x20,0x20,0xD9,0xD9,0x20,0x20,0x20,0x20,0x20,0x20,0x00 },
{ 0x00,0x20,0x29,0x20,0x20,0x20,0xD9,0xD9,0xD9,0xD9,0x20,0x20,0x20,0x20,0x20,0x00 },
{ 0x29,0x29,0x29,0x20,0x20,0xD9,0x00,0xD9,0xD9,0x00,0xD9,0x20,0x20,0x20,0x20,0x00 },
{ 0x00,0x29,0x29,0x00,0xD9,0xD9,0x00,0xD9,0xD9,0x00,0xD9,0xD9,0x00,0x20,0x00,0x00 },
{ 0x29,0xD9,0x29,0x00,0x20,0xD9,0xD9,0xD9,0xD9,0xD9,0xD9,0x20,0x00,0x00,0x00,0x00 },
{ 0xD9,0xD9,0x29,0x00,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0x00,0x00,0x00,0x00 },
{ 0xD9,0xD9,0x29,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0x00,0x00 },
{ 0x00,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0x00 },
{ 0x00,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0x00 },
{ 0x00,0x00,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0x00,0xD9,0xD9,0x00 },
{ 0x00,0x00,0x00,0x00,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0x00,0x00,0x00 },
{ 0x00,0x00,0x00,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0x00,0x00,0x00 },
{ 0x00,0x00,0x00,0x00,0xD9,0xD9,0xD9,0xD9,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 }
};

const uint8_t Char2[16][16] PROGMEM = {
{ 0x00,0x00,0x00,0x29,0x00,0x20,0x20,0x20,0x20,0x20,0x20,0x00,0x00,0x00,0x00,0x00 },
{ 0x00,0x00,0x20,0x29,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x00,0x20,0x00,0x00 },
{ 0x00,0x20,0x20,0x29,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x00 },
{ 0x00,0x29,0x29,0x29,0x20,0x20,0x20,0xD9,0xD9,0x20,0x20,0x20,0x20,0x20,0x20,0x00 },
{ 0x00,0x20,0x29,0x29,0x20,0x20,0xD9,0xD9,0xD9,0xD9,0x20,0x20,0x20,0x20,0x20,0x00 },
{ 0x00,0x29,0xD9,0x29,0x20,0xD9,0x00,0xD9,0xD9,0x00,0xD9,0x20,0x20,0x20,0x20,0x00 },
{ 0x00,0xD9,0xD9,0x29,0xD9,0xD9,0x00,0xD9,0xD9,0x00,0xD9,0xD9,0x00,0x20,0x00,0x00 },
{ 0x00,0xD9,0xD9,0x29,0x20,0xD9,0xD9,0xD9,0xD9,0xD9,0xD9,0x20,0x00,0x00,0x00,0x00 },
{ 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0x00,0x00,0x00,0x00 },
{ 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0x00,0x00,0x00 },
{ 0x00,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0x00,0x00 },
{ 0x00,0x00,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0x00,0x00 },
{ 0x00,0x00,0x00,0x00,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0x00,0xD9,0x00,0x00 },
{ 0x00,0x00,0x00,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0x00,0x00,0x00,0x00 },
{ 0x00,0x00,0x00,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0x00,0x00,0x00 },
{ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xD9,0xD9,0xD9,0xD9,0x00,0x00,0x00,0x00 }
};


// Setup **********************************************
 
void setup() {
  // Define pins
  pinMode(dc, OUTPUT); digitalWrite(dc,HIGH);
  pinMode(clk, OUTPUT); digitalWrite(clk,HIGH);
  pinMode(data, OUTPUT);
  pinMode(cs, OUTPUT); digitalWrite(cs,HIGH);
  pinMode(rst, OUTPUT); digitalWrite(rst,HIGH);
  InitDisplay();
}

// Applications **********************************************

void loop () {

  PINB = 1<<cs; // cs low
  for (uint8_t y=0; y<64; y++) {
      for (uint8_t x=0; x<64; x++) Data(pgm_read_byte(&Char1[y/4][x/4]));
  }
  PINB = 1<<cs; // cs high
  delay(300);

  PINB = 1<<cs; // cs low
  for (uint8_t y=0; y<64; y++) {
      for (uint8_t x=0; x<64; x++) Data(pgm_read_byte(&Char2[y/4][x/4]));
  }
  PINB = 1<<cs; // cs high
  delay(300);

}

 

上記のサンプルソースによる表示


Arduino開発環境

・ATtiny85マイコンを搭載したUSB開発ボードはDigispark互換品です。
  Digispark(ATtiny85)のArduino開発環境によるプログラムの書き換えが可能です。
・環境構築手順は以下の通りです。
 1.Arduinoソフトウェアをインストール
 2.Digistump AVR Boardsパッケージをインストール
 3.DigiUSBドライバをインストール
・詳しくはDigistumpのwikiページを参照下さい。
 http://digistump.com/wiki/digispark/tutorials/connecting

 

プログラム書込手順

 1.USBケーブルを抜いておきます。
 2.「マイコンボードに書き込む」のボタンを押します。

 3.「Plug in device now... (will timeout in 60 seconds)の表示を確認します。

 4.USBケーブルを挿します。

 5.ボードへの書き込みが完了しました、の表示を確認します。 

 6.書き込み後5秒ほど待つとDOT1616のOLEDに画像が表示されます。

 

作品

 ハッシュタグ #DOT1616 で検索!