小型OLEDをいよいよArduinoで制御してみます。うまくOLEDを駆動できるか分かりませんが、配線は前回と同じ状態で試してみます。





接続の様子はこちら。





OLEDモジュールの初期化は、データシートに推奨設定がありました。販売店のサイトからダウンロードしたPIC用のサンプルプログラムも同じように設定されていました。





OLEDモジュールの仕様書とPICのサンプルプログラムを参照しながら、Arduinoのスケッチを記述してみました。表示部分(demo(), demo2())は私の独自のプログラムで、demo()はラインの点滅、demo2()は市松模様を点滅させます。


#include &ltWire.h>

const int OLED_ADDR = 0x3C;
const int RESET_pin = 8;

void WriteCommand(byte cmd) {
Wire.write(0x80);
Wire.write(cmd);
}

void resetOLED() {
digitalWrite(RESET_pin, HIGH);
delay(1);
digitalWrite(RESET_pin, LOW);
delay(2); // reset 2msec
digitalWrite(RESET_pin, HIGH);
}

void initOLED() {
Wire.beginTransmission(OLED_ADDR);
WriteCommand(0xAE); // Set Display Off
WriteCommand(0xD5); // display divide ratio/osc. freq. mode
WriteCommand(0x00);
WriteCommand(0xA8);
WriteCommand(0x3F); // Multiplex ratio mode
WriteCommand(0xD3); // Set Display Offset
WriteCommand(0x00);
WriteCommand(0x40); // Set Display Start Line
WriteCommand(0x8D); // Set Display Offset
WriteCommand(0x14);
WriteCommand(0xA0); // Segment Remap
WriteCommand(0xC8); // Set COM Output Scan Direction
WriteCommand(0xDA); // Common pads hardware: alternative
WriteCommand(0x12);
Wire.endTransmission();

// Wire library is limited to the transmission up to 32bytes
// That's why the init sequence is splited.
Wire.beginTransmission(OLED_ADDR);
WriteCommand(0x81); // contrast control
WriteCommand(0x7F);
WriteCommand(0xD9); // Set pre-charge period
WriteCommand(0xF1);
WriteCommand(0xDB); // VCOM deselect level mode
WriteCommand(0x40); // set Vvcomh = 0.83*Vcc
WriteCommand(0xA4); // Set Entire Display On/Off
WriteCommand(0xA6); // Set Normal Display
WriteCommand(0xAF); // Set Display On
Wire.endTransmission();
}

void clearScreen() {
int i, j, k;
for (i = 0; i < 8; ++i) {
Wire.beginTransmission(OLED_ADDR);
WriteCommand(0xB0 + i);
WriteCommand(0x10);
WriteCommand(0x00);
Wire.endTransmission();

// Need to consider the Wire library limitation of sending data up to 32 bytes.
for (j = 0; j < 8; ++j) {
Wire.beginTransmission(OLED_ADDR);
Wire.write(0x40);
for (k = 0; k < 16; ++k) {
Wire.write(0x00);
}
Wire.endTransmission();
}
}
}


byte on_off = 0;

void demo() {
byte i, j, k;
byte data;

on_off %= 2;
for(i = 0; i < 8; ++i){
if (i % 2) data = 0xFF;
else data = 0x00;
if (on_off) data = ~data;

Wire.beginTransmission(OLED_ADDR);
WriteCommand(0xB0 + i);
WriteCommand(0x10);
WriteCommand(0x00);
Wire.endTransmission();

for (j = 0; j < 8; ++j) {
Wire.beginTransmission(OLED_ADDR);
Wire.write(0x40);
for (k = 0; k < 16; ++k) {
Wire.write(data);
}
Wire.endTransmission();
}
}
delay(500);
++on_off;
}


void demo2() {
byte i, j, k;
byte data;

on_off %= 2;
for (i = 0; i < 8; ++i) {
if (i % 2) data = 0x00;
else data = 0xFF;
if (on_off) data = ~data;

Wire.beginTransmission(OLED_ADDR);
WriteCommand(0xB0 + i);
WriteCommand(0x10);
WriteCommand(0x00);
Wire.endTransmission();

for (j = 0; j < 16; ++j) {
Wire.beginTransmission(OLED_ADDR);
Wire.write(0x40);
for (k = 0; k < 8; ++k) {
if (j % 2) {
Wire.write(data);
} else {
Wire.write(~data);
}
}
Wire.endTransmission();
}
}
delay(500);
++on_off;
}

void setup() {
pinMode(RESET_pin, OUTPUT);

Wire.begin();
Serial.begin(115200);

Serial.println("Reset OLED");
resetOLED();

Serial.println("\nInit OLED");
initOLED();
clearScreen();
}

byte rotator = 0;
byte sw = 0;
void loop() {
rotator %= 8;
if (rotator == 0) sw = ~sw;

if (sw) demo();
else demo2();

++rotator;
}



ArduinoのWireライブラリは一度に32バイトしか送れませんので、それに注意してスケッチを組みました。それでは実際の動きを見てみましょう!





無事に動きました!実際はいろいろと試行錯誤をしたんですが、思ったよりもすんなりと動いてくれました。いや~動くと思っていなかったので感無量です。

でも、これから始める方はこちらの製品を買ったほうがよいと思います。私の買ったOLED基板はハンダに手間がかかり、接触不良でハマったので・・・。







恐らくOLEDモジュールは同じだと思うので、うまくすれば、このスケッチがそのまま動くと思います。(もし違ってたらゴメンナサイ)

これでArduinoに表示デバイスをつなげることができました。より一層アプリケーションが広がりそうです!
(^^)/~









MicroView - チップサイズ Arduino OLEDディスプレイ付き

  • 出版社/メーカー: SparkFun
  • メディア: エレクトロニクス



OLEDディスプレイ搭載 PIC32MX250F128B CPUボード K102 (OLED ディスプレイ)

  • 出版社/メーカー: Yutaka Trading
  • メディア: エレクトロニクス