・有機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);
}
・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 で検索!