SSブログ

小型OLEDをArduinoで動かしてみた! [Arduino]

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


OLED with Arduino Pro Mini.png


接続の様子はこちら。


Arduino Pro Mini with OLED.JPG


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


InitOLED.png


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

#include <Wire.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ディスプレイ付き

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

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



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

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

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




タグ:Arduino 128x64 OLED
nice!(35)  コメント(2)  トラックバック(0) 

nice! 35

コメント 2

まいく

誘惑に負けそうですが。。
保留です。
by まいく (2015-11-04 23:54) 

ys_oota

まいくさん、コメントありがとうございます!ぜひ試してみてください!
by ys_oota (2015-11-06 00:27) 

コメントを書く

お名前:
URL:
コメント:
画像認証:
下の画像に表示されている文字を入力してください。

トラックバック 0

この広告は前回の更新から一定期間経過したブログに表示されています。更新すると自動で解除されます。