So-net無料ブログ作成

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