SSブログ

OLEDにArduinoで顔文字を表示させてみた! [Arduino]

前回ダウンロードしてきた LcdAssistant を使って OLED に顔文字を表示させてみたいと思います。


LCDAssistant.png


最初にビットマップを作成します。Windows付属のペイントツールを使って顔文字画像を作成しました。画素数は128x64ピクセルです。作った画像はモノクロビットマップで保存します。


making_nyaha.png


LCDAssistant を立ち上げて、作成したビットマップを読み込みます。


loading_nyaha.png


読み込んだらそのままセーブします。ファイル名は nyaha.txt でも nyaha.cpp でも何でもかまいません。私はVIに読み込ませるために、nyaha.cpp で保存しました。


saving_nyaha.png


このテーブルをそのままArduinoのスケッチに取り込みました。


#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 apart.  
  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();

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


//------------------------------------------------------------------------------
// File generated by LCD Assistant
// http://en.radzio.dxp.pl/bitmap_converter/
//------------------------------------------------------------------------------

const unsigned char nyaha [] = {
// ここに作成したデータをコピーします。長いので省略。悪しからず・・・。
};


void drawNyaha() {

  int i,j,k,n;
  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) {
        n = i*128+j*16+k;
        Wire.write(nyaha[n]);
      }
      Wire.endTransmission();
    }
  }
}


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

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

  Serial.println("Reset OLED");
  resetOLED();
  
  Serial.println("\nInit OLED");
  initOLED();
  clearScreen();
  delay(2);
  drawNyaha();
}

void loop() {
  // do nothing
}



実際に動かしてみました!


Nyaha on OLED driven by Arduino.JPG


おお~、あっけなく動きました。あとはどう発展させようかなぁ・・・。
σ(´ーωー`)
















タグ:OLED Arduino 128x64
nice!(38)  コメント(0)  トラックバック(0) 
共通テーマ:趣味・カルチャー

nice! 38

コメント 0

コメントを書く

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

トラックバック 0

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