Arduinoで遊ぶページ

Arduinoで遊んだ結果を残すページです。
garretlab
I2C接続有機LEDディスプレイ(OLED)

概要

SO2002AWYB-UC-WB-UというI2C接続の有機LEDキャラクタディスプレイを使った実験です。パラレル接続の有機ELキャラクタディスプレイの実験はこちらから。有機ELグラフィックディスプレイの実験はこちらから。

目的

SO2002AWYB-UC-WB-UというI2C接続の有機LEDディスプレイをArduinoから制御できるようにします。

パラレル接続の有機ELキャラクタディスプレイを、I2C接続で利用できるようにしたもののようです。ディスプレイ自身は同じようなので、インターフェイスの違いを中心に調査し、スケッチを作成していきます。

データシート

SO2002AWYB-UC-WB-Uのデータシートを参照して、どのようなものかを調べました。このデータシート以外にも、購入した製品に付属の日本語の説明書が付属していました。この説明書には電源電圧が5Vでも大丈夫と書いてありますが、3.3Vで使うのが正しいようなので、注意してください。このディスプレイを購入した秋月通商の店頭にも、説明書が間違っている旨の記載がありました。

概要

SO2002AWYB-UC-WB-Uの仕様の概要は以下の通りです。

項目 値など
入力電圧(絶対定格) 5.5V
入力電圧 3.6V
コントローラ US2066もしくは同等品

通常は3.6Vまでしかかけないほうがよさそうです。ということで、今回は、3.3Vで動作するArduino Dueで試してみました。Arduino Unoなど、5Vで動作するもので利用する場合は自己責任でお願いします。レベル変換を行うパーツなどがあるようです。

ピンは14本あります。意味と今回の実験のときに使ったArduinoのピン番号は以下の通りです。SCLとSDAin/SDAoutは、プルアップ抵抗を使って、VDDに接続する必要があります。

OLEDディスプレイのピン 意味 Arduinoのピン
1 VSS GND
2 VDD 3.3V
3 /CS GND
4 SA0 I2Cのアドレスを選択する。HIGHのとき0x3d、LOWのとき0x3cとなる。
5 NC -
6 NC -
7 SCL SCL(21)。要プルアップ。
8 SDAin SDA(20)。要プルアップ。
9 SDAout SDA(20)。要プルアップ。
10 NC -
11 NC -
12 NC -
13 NC -
14 NC -

コマンド自身は、パラレル接続の有機ELディスプレイと同じようです。ただし、当然のことながら、インターフェイスが異なります。

パラレル接続のときには、8ビットのデータビットに、レジスタ選択(RS)とRead/Writeを加えた10ビットで制御していましたが、I2C接続では、RSを表す1バイトの後に、データを表す1バイト(8ビット)を送信するようになっています。Read/Writeは、I2Cアドレスを選択する際に、一緒に送るようです。実際には、1回の送信で複数データを送信できますが、今回は簡略化のため、1回の送信で1つのデータだけを送信しました。

以下にフォーマットを示します。

赤色のところは、ArduinoのWireライブラリがよきに計らってくれます。Coは継続データがある場合に1です。今回は1バイトのデータしか扱わないことにしたので、0を設定しています。このデータを送るためのスケッチは以下の通りです。

uint8_t SO2002A_I2C::writeCommand(uint8_t rs, uint8_t data) {
  Wire.beginTransmission(i2cAddress);
  Wire.write(rs);
  Wire.write(data);
  return Wire.endTransmission();
}

以下に今回実装したAPIを示します。1から12は、LiquidCrystal と同じ動作なので、置き換えも簡単だと思います(初期化ルーチンを変更するだけだと思います)。

項番 API 意味
1 コンストラクタ オブジェクトを作成する。引数に、I2Cアドレスを指定する。
2 begin() ライブラリの初期化
3 clear() OLEDの表示を消し、カーソルを(0,0)に移動させる。
4 home() カーソルを(0,0)に移動させる。
5 setCursor() カーソル位置を指定する。
6 cursor()/noCursor() カーソルを表示する。
7 blink()/noBlink() カーソルを点滅させる。
8 display()/noDisplay() 表示を行う。
9 scrollDisplayLeft()/scrollDisplayRight() 表示されている文字を左右に1文字ずらす。
10 autoscroll()/noAutoscroll() 自動スクロールを行う。
11 leftToRight()/rightToLeft() 文字の表示方向を設定する。
12 createChar() ユーザ定義の文字を作成する。
13 singleHeightFont()/doubleHeightFont() フォントの高さを設定する。
14 selectCharacterRom() フォントセットを選択する。
15 setScrollQuantity() スクロール量を指定する。
16 setContrastControl() コントラストを調整する。
17 setFadeOutAndBlinking() フェードアウトとブリンク。

動作しているところ

影になってしまっていますが、動作しているところです。それでも、視認性はとてもいいです。パラレル接続より少ない信号線で動いています。SDAinとSDAout、/CSやSA0をディスプレイの側で固定的に接続するなどすれば、さらに減らすことができます。

ソース

SO2002A_I2Cというクラスを作成しました。Arduino Due以外でコンパイルしたときはエラーが出るようにしてあります。Arduino Due以外で使う場合は、SO2002A_I2C.hの最初のほうを自己責任でいじってください。

Githubのリポジトリはこちら

SO2002A_I2C.h

#ifndef SO2002A_I2C_H
#define SO2002A_I2C_H

#ifndef __SAM3X8E__ 
#error "Not Arduino Due"
#error "Remove this with care"
#endif

#include "Print.h"

/* 
 * Macros for users
 */
#define SO2002A_I2C_CHARACTER_ROM_A 0x00
#define SO2002A_I2C_CHARACTER_ROM_B 0x04
#define SO2002A_I2C_CHARACTER_ROM_C 0x08

#define SO2002A_I2C_DISABLE_FADE_OUT_AND_BLINKING 0b00000000
#define SO2002A_I2C_ENABLE_FADE_OUT_MODE          0b00100000
#define SO2002A_I2C_ENABLE_BLINKING_MODE          0b00110000

/*
 * Macros for internal Use
 */
#define SO2002A_I2C_COMMAND_CLEAR_DISPLAY              0b00000001
#define SO2002A_I2C_COMMAND_RETURN_HOME                0b00000010
#define SO2002A_I2C_COMMAND_ENTRY_MODE_SET             0b00000100
#define SO2002A_I2C_COMMAND_DISPLAY_ON_OFF             0b00001000
#define SO2002A_I2C_COMMAND_CURSOR_OR_DISPLAY_SHIFT    0b00010000
#define SO2002A_I2C_COMMAND_FUNCTION_SET               0b00100000
#define SO2002A_I2C_COMMAND_SET_CGRAM_ADDRESS          0b01000000
#define SO2002A_I2C_COMMAND_SET_DDRAM_ADDRESS          0b10000000
#define SO2002A_I2C_COMMAND_SET_SCROLL_QUANTITY        0b10000000
#define SO2002A_I2C_COMMAND_SET_CONTRAST_CONTROL       0b10000001
#define SO2002A_I2C_COMMAND_SET_FADE_OUT_AND_BLINKING  0b00100011

#define SO2002A_I2C_COMMAND_FUNCTION_SELECTION_B    0b01110010
#define SO2002A_I2C_COMMAND_OLED_ENABLE_SD          0b01111001
#define SO2002A_I2C_COMMAND_OLED_DISABLE_SD         0b01111000

#define SO2002A_I2C_ENTRY_MODE_SHIFT_ON               (~SO2002A_I2C_ENTRY_MODE_SHIFT_OFF)
#define SO2002A_I2C_ENTRY_MODE_SHIFT_OFF                0b00000001
#define SO2002A_I2C_ENTRY_MODE_DIRECTION_LEFT_TO_RIGHT 0b00000010
#define SO2002A_I2C_ENTRY_MODE_DIRECTION_RIGHT_TO_LEFT (~SO2002A_I2C_ENTRY_MODE_DIRECTION_LEFT_TO_RIGHT)

#define SO2002A_I2C_DISPLAY_MODE_BLINK_ON    0b00000001
#define SO2002A_I2C_DISPLAY_MODE_BLINK_OFF   (~SO2002A_I2C_DISPLAY_MODE_BLINK_ON)
#define SO2002A_I2C_DISPLAY_CURSOR_ON        0b00000010
#define SO2002A_I2C_DISPLAY_CURSOR_OFF       (~SO2002A_I2C_DISPLAY_CURSOR_ON)
#define SO2002A_I2C_DISPLAY_MODE_DISPLAY_ON  0b00000100
#define SO2002A_I2C_DISPLAY_MODE_DISPLAY_OFF (~SO2002A_I2C_DISPLAY_MODE_DISPLAY_ON)

#define SO2002A_I2C_FUNCTION_EXT_IS_ON         0b00000001
#define SO2002A_I2C_FUNCTION_EXT_IS_OFF        (~SO2002A_I2C_FUNCTION_EXT_IS_ON)
#define SO2002A_I2C_FUNCTION_EXT_RE_ON         0b00000010
#define SO2002A_I2C_FUNCTION_EXT_RE_OFF        (~SO2002A_I2C_FUNCTION_EXT_RE_ON)
#define SO2002A_I2C_FUNCTION_DOUBLE_HEIGHT_ON  0b00000100
#define SO2002A_I2C_FUNCTION_DOUBLE_HEIGHT_OFF (~SO2002A_I2C_FUNCTION_DOUBLE_HEIGHT_ON)
#define SO2002A_I2C_FUNCTION_2LINE_MODE_ON     0b00001000
#define SO2002A_I2C_FUNCTION_2LINE_MODE_OFF    (~SO2002A_I2C_FUNCTION_2LINE_MODE_ON)

#define SO2002A_I2C_SCROLLQUANTITY_MASK     0b00111111
#define SO2002A_I2C_FADE_OUT_INTERVAL_MASK  0b00001111

#define SO2002A_I2C_SHIFT_CONTROL_ON 0b00001000
#define SO2002A_I2C_SHIFT_RIGHT      0b00000100
#define SO2002A_I2C_SHIFT_LEFT       (~SO2002A_I2C_SHIFT_RIGHT)

#define SO2002A_I2C_COMMAND 0x00
#define SO2002A_I2C_DATA    0x40

class SO2002A_I2C : public Print {
public:
  SO2002A_I2C(uint8_t i2cAddress);
      
  void begin(uint8_t columns, uint8_t rows);
  void clear();
  void home();
  void setCursor(uint8_t x, uint8_t y);
  void cursor();
  void noCursor();
  void blink();
  void noBlink();
  void display();
  void noDisplay();
  void scrollDisplayLeft();
  void scrollDisplayRight();
  void autoscroll();
  void noAutoscroll();
  void leftToRight();
  void rightToLeft();
  void createChar(uint8_t location, uint8_t charmap[]);

  void singleHeightFont();
  void doubleHeightFont();
  void setScrollQuantity(uint8_t dot);
  void selectCharacterRom(uint8_t font);
  void setContrastControl(uint8_t contrast);
  void setFadeOutAndBlinking(uint8_t mode, uint8_t interval);
  
  virtual size_t write(uint8_t);
  
  using Print::write;
private:
  uint8_t columns;      // width
  uint8_t rows;         // height
  uint8_t i2cAddress;   // I2C address
  uint8_t entryMode;
  uint8_t displayMode;
  uint8_t functionMode;
  
  
  void setEntryMode();
  void setDisplayMode();
  void setFunctionMode();
  void setFunctionMode(uint8_t mode);
  void oledEnableSd();
  void oledDisableSd();
  void setCgramAddress(uint8_t address);
  void setDdramAddress(uint8_t address);
  uint8_t writeCommand(uint8_t rs, uint8_t data);
};

#endif /* SO2002A_I2C_H */

SO2002A_I2C.cpp

#include "SO2002A_I2C.h"
#include "Arduino.h"
#include "Wire.h"

SO2002A_I2C::SO2002A_I2C(uint8_t i2cAddress) {
  this->i2cAddress = i2cAddress;
}

// LiquidCrystal compatible functions
void SO2002A_I2C::begin(uint8_t columns, uint8_t rows) {
  this->columns = columns;
  this->rows = rows;

  entryMode =    0b00000010;
  displayMode =  0b00000000;
  functionMode = 0b00000000;

  Wire.begin();
  noDisplay();
  clear();
  display();
  
  setDisplayMode();
  setFunctionMode();
}

void SO2002A_I2C::clear() {
  writeCommand(SO2002A_I2C_COMMAND, SO2002A_I2C_COMMAND_CLEAR_DISPLAY);
  delayMicroseconds(1520);
}

void SO2002A_I2C::home() {
  writeCommand(SO2002A_I2C_COMMAND, SO2002A_I2C_COMMAND_RETURN_HOME);
  delayMicroseconds(1520);
}

void SO2002A_I2C::setCursor(uint8_t col, uint8_t row) {
  int row_begin[] = {0, 32};
  setDdramAddress(col + row_begin[row] );
}

void SO2002A_I2C::cursor() {
  displayMode |= SO2002A_I2C_DISPLAY_CURSOR_ON;
  setDisplayMode();
}

void SO2002A_I2C::noCursor() {
  displayMode &= SO2002A_I2C_DISPLAY_CURSOR_OFF;
  setDisplayMode();
}

void SO2002A_I2C::blink() {
  displayMode |= SO2002A_I2C_DISPLAY_MODE_BLINK_ON;
  setDisplayMode();
}

void SO2002A_I2C::noBlink() {
  displayMode &= SO2002A_I2C_DISPLAY_MODE_BLINK_OFF;
  setDisplayMode();
}

void SO2002A_I2C::display() {
  displayMode |= SO2002A_I2C_DISPLAY_MODE_DISPLAY_ON;
  setDisplayMode();
}

void SO2002A_I2C::noDisplay() {
  displayMode &= SO2002A_I2C_DISPLAY_MODE_DISPLAY_OFF;
  setDisplayMode();
}

void SO2002A_I2C::scrollDisplayLeft() {
  writeCommand(SO2002A_I2C_COMMAND, SO2002A_I2C_COMMAND_CURSOR_OR_DISPLAY_SHIFT | SO2002A_I2C_SHIFT_CONTROL_ON & SO2002A_I2C_SHIFT_LEFT);
  delayMicroseconds(37);
}

void SO2002A_I2C::scrollDisplayRight() {
  writeCommand(SO2002A_I2C_COMMAND, SO2002A_I2C_COMMAND_CURSOR_OR_DISPLAY_SHIFT | SO2002A_I2C_SHIFT_CONTROL_ON | SO2002A_I2C_SHIFT_RIGHT);
  delayMicroseconds(37);
}

void SO2002A_I2C::autoscroll() {
  entryMode |= SO2002A_I2C_ENTRY_MODE_SHIFT_OFF;
  setEntryMode();
}

void SO2002A_I2C::noAutoscroll() {
  entryMode &= SO2002A_I2C_ENTRY_MODE_SHIFT_ON;
  setEntryMode();
}

void SO2002A_I2C::leftToRight() {
  entryMode |= SO2002A_I2C_ENTRY_MODE_DIRECTION_LEFT_TO_RIGHT;
  setEntryMode();
}

void SO2002A_I2C::rightToLeft() {
  entryMode &= SO2002A_I2C_ENTRY_MODE_DIRECTION_RIGHT_TO_LEFT;
  setEntryMode();
}

void SO2002A_I2C::createChar(uint8_t location, uint8_t charmap[]) {
  location &= 0x7;
  writeCommand(SO2002A_I2C_COMMAND, SO2002A_I2C_COMMAND_SET_CGRAM_ADDRESS | (location << 3));
  delayMicroseconds(37);
  for (int i = 0; i < 8; i++) {
    writeCommand(SO2002A_I2C_DATA, charmap[i]);
    delayMicroseconds(37);
  }
}

// OLED original functions
void SO2002A_I2C::singleHeightFont() {
  functionMode &= SO2002A_I2C_FUNCTION_DOUBLE_HEIGHT_OFF;
  setFunctionMode();
}

void SO2002A_I2C::doubleHeightFont() {
  functionMode |= SO2002A_I2C_FUNCTION_DOUBLE_HEIGHT_ON;
  setFunctionMode();
}

void SO2002A_I2C::setScrollQuantity(uint8_t dot) {
  setFunctionMode(functionMode | SO2002A_I2C_FUNCTION_EXT_RE_ON);
  writeCommand(SO2002A_I2C_COMMAND, SO2002A_I2C_COMMAND_SET_SCROLL_QUANTITY | (dot & SO2002A_I2C_SCROLLQUANTITY_MASK));
  delayMicroseconds(37);
  setFunctionMode(functionMode & SO2002A_I2C_FUNCTION_EXT_RE_OFF);
}

void SO2002A_I2C::selectCharacterRom(uint8_t font) {
  setFunctionMode(functionMode | SO2002A_I2C_FUNCTION_EXT_RE_ON);
  writeCommand(SO2002A_I2C_COMMAND, SO2002A_I2C_COMMAND_FUNCTION_SELECTION_B);
  writeCommand(SO2002A_I2C_DATA, font);
  delayMicroseconds(37);
  setFunctionMode(functionMode & SO2002A_I2C_FUNCTION_EXT_RE_OFF);
  clear();
}

void SO2002A_I2C::setContrastControl(uint8_t contrast) {
  setFunctionMode(functionMode | SO2002A_I2C_FUNCTION_EXT_RE_ON);
  oledEnableSd();
  writeCommand(SO2002A_I2C_COMMAND, SO2002A_I2C_COMMAND_SET_CONTRAST_CONTROL);
  writeCommand(SO2002A_I2C_COMMAND, contrast);
  delayMicroseconds(37);
  oledDisableSd();
  setFunctionMode(functionMode & SO2002A_I2C_FUNCTION_EXT_RE_OFF);
}

void SO2002A_I2C::setFadeOutAndBlinking(uint8_t mode, uint8_t interval) {
  setFunctionMode(functionMode | SO2002A_I2C_FUNCTION_EXT_RE_ON);
  oledEnableSd();
  writeCommand(SO2002A_I2C_COMMAND, SO2002A_I2C_COMMAND_SET_FADE_OUT_AND_BLINKING);
  writeCommand(SO2002A_I2C_COMMAND, mode | (interval & SO2002A_I2C_FADE_OUT_INTERVAL_MASK));
  delayMicroseconds(37);
  oledDisableSd();
  setFunctionMode(functionMode & SO2002A_I2C_FUNCTION_EXT_RE_OFF);
}

size_t SO2002A_I2C::write(uint8_t value) {
  writeCommand(SO2002A_I2C_DATA, value);
  delayMicroseconds(37);
  return 1;
}

void SO2002A_I2C::setEntryMode() {
  writeCommand(SO2002A_I2C_COMMAND, SO2002A_I2C_COMMAND_ENTRY_MODE_SET | entryMode);
  delayMicroseconds(37);
}

void SO2002A_I2C::setDisplayMode() {
  writeCommand(SO2002A_I2C_COMMAND, SO2002A_I2C_COMMAND_DISPLAY_ON_OFF | displayMode);
  delayMicroseconds(37);
}

void SO2002A_I2C::setFunctionMode() {
  writeCommand(SO2002A_I2C_COMMAND, SO2002A_I2C_COMMAND_FUNCTION_SET | functionMode);
  delayMicroseconds(37);
}

void SO2002A_I2C::setFunctionMode(uint8_t mode) {
  writeCommand(SO2002A_I2C_COMMAND, SO2002A_I2C_COMMAND_FUNCTION_SET | mode);
  delayMicroseconds(37);
}

void SO2002A_I2C::oledEnableSd() {
  writeCommand(SO2002A_I2C_COMMAND, SO2002A_I2C_COMMAND_OLED_ENABLE_SD);
}

void SO2002A_I2C::oledDisableSd() {
  writeCommand(SO2002A_I2C_COMMAND, SO2002A_I2C_COMMAND_OLED_DISABLE_SD);
}

void SO2002A_I2C::setCgramAddress(uint8_t address) {
  writeCommand(SO2002A_I2C_COMMAND, SO2002A_I2C_COMMAND_SET_CGRAM_ADDRESS | address);
  delayMicroseconds(37);
}

void SO2002A_I2C::setDdramAddress(uint8_t address) {
  writeCommand(SO2002A_I2C_COMMAND, SO2002A_I2C_COMMAND_SET_DDRAM_ADDRESS | address);
  delayMicroseconds(37);
}

/*
 * Low Level Control
 */
uint8_t SO2002A_I2C::writeCommand(uint8_t rs, uint8_t data) {
  Wire.beginTransmission(i2cAddress);
  Wire.write(rs);
  Wire.write(data);
  return Wire.endTransmission();
}

OLED_I2C.ino

#include <Wire.h>
#include "SO2002A_I2C.h"

SO2002A_I2C oled(0x3c);

byte smiley[8] = {
  B00000,
  B10001,
  B00000,
  B00000,
  B10001,
  B01110,
  B00000,
};

void setup() {
  // put your setup code here, to run once:
  delay(1000);
  
  oled.begin(20, 2);
  oled.createChar(0, smiley);
}

void loop() {
  // put your main code here, to run repeatedly:
  char data1[] = "I2C OLED YELLOW 20x2";
  char data2[] = "HELLO WORLD !!";

  // clear() and print()
  oled.clear();
  oled.print(data1);
  delay(1000);
  
  // home() -> data1 is not deleted
  oled.home();
  oled.print(data2);
  delay(1000);
  
  // setCursor()
  oled.clear();
  for (int y = 0; y < 2; y++) {
    for (int x = 0; x < 20; x++) {
      oled.setCursor(x, y);
      oled.print(x % 10);
      delay(10);
    }
  }
  delay(1000);
  
  // write()
  oled.clear();
  for (int i = 0; i < 20; i++) {
    oled.write(i + 0xb1);
  }
  delay(1000);
  
  // cursor() and noCursor();
  oled.clear();
  oled.print("cursor()");
  oled.cursor();
  delay(2000);
  oled.clear();
  oled.print("noCursor()");
  oled.noCursor();
  delay(2000);

  // blink() and noBlink()
  oled.clear();
  oled.print("blink()");
  oled.cursor();
  oled.blink();
  delay(2000);
  oled.clear();
  oled.print("noBlink()");
  oled.cursor();
  oled.noBlink();
  delay(2000);
  oled.noCursor();
  
  // noDisplay() and Display()
  oled.noDisplay();
  delay(1000);
  oled.display();
  delay(1000);

  // scrollDisplayLeft() and scrollDisplayRight()
  oled.clear();
  oled.print(data2);
  for (int i = 0; i < strlen(data2); i++) {
    oled.scrollDisplayLeft();
    delay(200);
  }
  for (int i = 0; i < strlen(data2); i++) {
    oled.scrollDisplayRight();
    delay(200);
  }

  // autoscroll() and noAutoscroll()
  oled.clear();
  oled.autoscroll();
  for (int i = 0; i < 20; i++) {
    oled.print(data1[i]);
    delay(200);
  }
  oled.clear();
  oled.noAutoscroll();
  oled.print(data1);
  delay(1000);
  
  // rightToLeft() and leftToRight()
  oled.clear();
  oled.setCursor(19, 0);
  oled.rightToLeft();
  oled.print(data1);
  delay(1000);
  oled.clear();
  oled.leftToRight();
  oled.print(data1);
  delay(1000);
  
  // createChar()
  oled.clear();
  oled.write((uint8_t)0);
  delay(1000);

  // doubleHeightFont() and singleHeightFont()
  oled.clear();
  oled.doubleHeightFont();
  oled.print(data1);
  delay(1000);
  oled.clear();
  oled.singleHeightFont();
  oled.print(data1);
  delay(1000);
  
  // setContrastControl
  for (int i = 0; i < 0xff; i++) {
    oled.setContrastControl(i);
    delay(30);
  }
  
  // selectCharacterRom()
  oled.clear();
  oled.selectCharacterRom(SO2002A_I2C_CHARACTER_ROM_A);
  for (int i = 0; i < 20; i++) {
    oled.write(i + 0xb1);
  }
  delay(1000);
  
  oled.clear();
  oled.selectCharacterRom(SO2002A_I2C_CHARACTER_ROM_B);
  for (int i = 0; i < 20; i++) {
    oled.write(i + 0xb1);
  }
  delay(1000);
  
  oled.clear();
  oled.selectCharacterRom(SO2002A_I2C_CHARACTER_ROM_C);
  for (int i = 0; i < 20; i++) {
    oled.write(i + 0xb1);
  }
  delay(1000);  

  // setFadeOutAndBlinking()
  oled.clear();
  oled.print(data1);
  oled.setFadeOutAndBlinking(SO2002A_I2C_ENABLE_BLINKING_MODE, 1);
  delay(7000);
  oled.setFadeOutAndBlinking(SO2002A_I2C_DISABLE_FADE_OUT_AND_BLINKING, 0);
}

バージョン

Arduino 1.5.7/Arduino Due



メニューを表示するためにJavaScriptを有効にしてください。

Arduinoで遊ぶページ
Copyright © 2014 garretlab all rights reserved.
inserted by FC2 system