KUMIKOMI NO SEKAI ~ #5 Displaying ”写輪眼” on OLED
こんにちは。今回はOLEDディスプレイを使って遊んでみたいと思います。LEDのように単純に光るだけではなく、文字や絵を表現できるので遊び応えがあります。OLEDは128×64ドットのサイズなので、その範囲内の絵であれば何でも表示できます。絵としては漫画NARUTOに登場するうちは一族の血継限界である”写輪眼”を表示させてみます。写輪眼を知らない人はwikiでご確認あれ。
このボードに搭載されているOLEDを制御するには、I2C(I-squared-C)と言うシリアル通信の一種を使う必要があるのですが、既に制御用のライブラリが準備されているので、それを利用させて貰いましょう。
関連モジュール
今回関連するモジュール(ハードウェア)はOLEDディスプレイになります。
ライブラリって何?
ライブラリ(library)とは英語で言う図書館のことですね。プログラムの世界におけるライブラリも同じようなもので、過去の賢い人達の知恵を後世の人が使える形にしてくれたプログラム群のことを指します。今まで散々使ってきたprintf関数も標準ライブラリと言うライブラリに収められている関数の一つだったのです。「どっかの誰かが作ってくれた」と記事に書いていたあれのことですね。今回扱うOLEDもI2Cで通信して制御する必要があるのですが、既にライブラリを作ってくれているので、我々はそれを拝借すれば即OLEDディスプレイを使うことができると言うわけです。便利ですねぇ。
ライブラリをインストールする
Arduino IDEには初期状態ではOLEDディスプレイ制御用のライブラリが入っていないので、インストールしないといけません。ライブラリのインストールは以下の手順で行います。
1)Arduino IDEのツールバーのスケッチ → ライブラリをインクルード → ライブラリを管理の順にクリックする。
2)ライブラリマネージャ画面が開くので、検索ワードにu8g2と入力する。
3)U8g2ライブラリが表示されるので、インストールボタンをクリックする。
以上でOLED制御に必要なライブラリのインストールが完了です。
シンプルに文字を表示してみる
最初はシンプルに文字だけを表示してみましょう。次のコードで"NARUTO!!"とOLED上に表示されます。
#include <Arduino.h>
#include <U8x8lib.h>
// u8x8ライブラリの準備
U8X8_SSD1306_128X64_ALT0_HW_I2C u8x8(/* reset=*/ U8X8_PIN_NONE);
void setup(void) {
// ライブラリを初期化
u8x8.begin();
u8x8.setFlipMode(1);
}
void loop(void) {
u8x8.setFont(u8x8_font_chroma48medium8_u); // フォントを指定
u8x8.setCursor(0,0); // カーソル位置を初期化
u8x8.print("NARUTO!!");
}
U8X8_SSD1306_128X64_ALT0_HW_I2C u8x8(/* reset=*/ U8X8_PIN_NONE);の行で、ライブラリを取り込んでいます。これはお作法だと思って貰えれば良いです。詳しくはC++のクラスを勉強する必要があります。上記の記述で、u8x8と言う名前の構造体の変数にアクセスするようにライブラリの関数を扱えるようになります。
u8x8.beginでライブラリを初期化し、setFlipModeで表示の上下を反転させています。setFlipMode(0);とすると、NARUTO!!の文字がOLEDの右下から表示されます。setFontで使用するフォントを指定しています。setCursorでは文字の表示開始位置を左上にしています。printはもう説明不要ですね。
u8x8ライブラリには他にも色んな関数がありますので、詳しくはリファレンスサイトをご覧下さい。
実行結果
実行結果はこんな感じ。まあまあ綺麗に表示されますね。
うちはサスケの”写輪眼”を表示してみる
お次は写輪眼を表示してみましょうかね。先ずは元データを準備します。こちらです。
これは元々もっと大きく、カラフルな画像だったのですがOLEDに表示できるように、サイズを64×64に縮小し、完全に白と黒の二色に変換してあります。ファイル形式はpngです。
次にこの画像データを0と1のデータに変換しないといけません。ルフィの時にやったあれです。ルフィの時は自前で変換ツールを作ってやっていたのですが、今回は外部発注しました。こちらのサイトにファイルをアップロードすれば、pngファイルをxbmファイルに変換してくれます。有難え。xbmファイルとは画像データを0と1のデータに変換したファイルです。
写輪眼ソースコード
以下が写輪眼を表示するソースコードです。
#include <U8g2lib.h>
// 写輪眼データ
const unsigned char sharingan[] U8X8_PROGMEM = {
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0xFC, 0x3F, 0x00, 0x00, 0x00, 0x00, 0x00, 0xC0, 0xFF,
0xFF, 0x03, 0x00, 0x00, 0x00, 0x00, 0xF0, 0xFF, 0xFF, 0x0F, 0x00, 0x00,
0x00, 0x00, 0xFC, 0x01, 0x80, 0x3F, 0x00, 0x00, 0x00, 0x00, 0x3F, 0x00,
0x00, 0xFC, 0x00, 0x00, 0x00, 0x80, 0x0F, 0x00, 0x00, 0xF0, 0x01, 0x00,
0x00, 0xE0, 0x03, 0x00, 0x3E, 0xC0, 0x07, 0x00, 0x00, 0xF0, 0x01, 0xC0,
0xFF, 0x83, 0x0F, 0x00, 0x00, 0x78, 0x00, 0xE0, 0xFF, 0x0F, 0x1E, 0x00,
0x00, 0x3C, 0x00, 0xF0, 0x3F, 0x00, 0x3C, 0x00, 0x00, 0x1E, 0x00, 0xF8,
0x3F, 0x00, 0x78, 0x00, 0x00, 0x0E, 0x00, 0xF8, 0x3F, 0x00, 0xF0, 0x00,
0x00, 0x07, 0x00, 0xFC, 0x7F, 0x00, 0xE0, 0x00, 0x80, 0x07, 0x00, 0xFE,
0x7F, 0x00, 0xC0, 0x01, 0x80, 0x03, 0x80, 0xFF, 0xFF, 0x01, 0xC0, 0x03,
0xC0, 0x01, 0xC0, 0xFF, 0xFF, 0x03, 0x80, 0x03, 0xC0, 0x01, 0xE0, 0xF9,
0xBF, 0x0F, 0x80, 0x07, 0xE0, 0x00, 0x70, 0xF0, 0x1F, 0x1E, 0x00, 0x07,
0xE0, 0x00, 0x38, 0xE0, 0x0F, 0x1C, 0x00, 0x07, 0x70, 0x00, 0x1C, 0x80,
0x07, 0x38, 0x00, 0x0E, 0x70, 0x00, 0x0E, 0x00, 0x00, 0x70, 0x00, 0x0E,
0x70, 0x00, 0x0E, 0x00, 0x00, 0x70, 0x00, 0x0C, 0x30, 0x00, 0x07, 0x00,
0x00, 0xE0, 0x00, 0x1C, 0x38, 0x00, 0x07, 0x00, 0x00, 0xE0, 0x00, 0x1C,
0x38, 0x00, 0x03, 0xE0, 0x07, 0xC0, 0x00, 0x1C, 0x38, 0x80, 0x03, 0xF0,
0x0F, 0xC0, 0x01, 0x1C, 0x38, 0x80, 0x03, 0xF8, 0x1F, 0xC0, 0x01, 0x1C,
0x38, 0x80, 0x03, 0xF8, 0x3F, 0xC0, 0x01, 0x18, 0x38, 0x80, 0x03, 0xFC,
0x3F, 0xC0, 0x01, 0x18, 0x38, 0x81, 0x03, 0xFC, 0x3F, 0xC0, 0x01, 0x18,
0x38, 0x81, 0x07, 0xF8, 0x3F, 0xC0, 0x01, 0x18, 0x38, 0x82, 0x3F, 0xF8,
0x1F, 0xF8, 0x01, 0x18, 0x38, 0xC6, 0x7F, 0xF8, 0x1F, 0xFC, 0x03, 0x1C,
0x38, 0xEE, 0xFF, 0xF0, 0x0F, 0xFE, 0x07, 0x1C, 0x38, 0xFE, 0xFF, 0xC0,
0x03, 0xFF, 0x07, 0x1C, 0x30, 0xFE, 0xFF, 0x00, 0x00, 0xFF, 0x0F, 0x1C,
0x70, 0xFC, 0xFF, 0x01, 0x80, 0xFF, 0x0F, 0x0C, 0x70, 0xFC, 0xFF, 0x01,
0x80, 0xFF, 0x0F, 0x0E, 0x70, 0xF8, 0xFF, 0x00, 0x80, 0xFF, 0x0F, 0x0E,
0xE0, 0xF0, 0xFF, 0x00, 0x00, 0xFF, 0x0F, 0x0E, 0xE0, 0xE0, 0xFF, 0x00,
0x00, 0xFF, 0x0F, 0x07, 0xC0, 0xC1, 0xFF, 0x00, 0x00, 0xFF, 0x07, 0x07,
0xC0, 0x01, 0xFF, 0x03, 0xC0, 0xFF, 0x87, 0x03, 0xC0, 0x03, 0x80, 0x7F,
0xFE, 0xF1, 0xC3, 0x03, 0x80, 0x03, 0x00, 0xFE, 0xFF, 0xC0, 0xC3, 0x01,
0x00, 0x07, 0x00, 0xF8, 0x1F, 0xC0, 0xE1, 0x00, 0x00, 0x0F, 0x00, 0x00,
0x00, 0xC0, 0xF0, 0x00, 0x00, 0x1E, 0x00, 0x00, 0x00, 0x60, 0x78, 0x00,
0x00, 0x3C, 0x00, 0x00, 0x00, 0x20, 0x3C, 0x00, 0x00, 0x78, 0x00, 0x00,
0x00, 0x10, 0x1E, 0x00, 0x00, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x0F, 0x00,
0x00, 0xE0, 0x03, 0x00, 0x00, 0x80, 0x07, 0x00, 0x00, 0xC0, 0x07, 0x00,
0x00, 0xE0, 0x03, 0x00, 0x00, 0x00, 0x1F, 0x00, 0x00, 0xF8, 0x00, 0x00,
0x00, 0x00, 0xFE, 0x00, 0x00, 0x7F, 0x00, 0x00, 0x00, 0x00, 0xF8, 0x1F,
0xF8, 0x1F, 0x00, 0x00, 0x00, 0x00, 0xE0, 0xFF, 0xFF, 0x07, 0x00, 0x00,
0x00, 0x00, 0x00, 0xFE, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80,
0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
};
U8G2_SSD1306_128X64_NONAME_1_HW_I2C u8g2(U8G2_R2, U8X8_PIN_NONE);
void setup() {
u8g2.begin();
}
void loop() {
u8g2.firstPage();
do {
u8g2.setFont(u8g2_font_t0_16b_mr);
// 32 = X軸の開始位置 0 = Y軸の開始位置 64 = 画像のサイズ
u8g2.drawXBMP(32,0,64,64,sharingan);
} while (u8g2.nextPage());
}
写輪眼データはxbmファイルをテキストエディタで開き、丸ごとコピーして貼り付けました。0が黒で、1が白になります。64×64なので4096ビットのデータになっています。先程シンプルに文字を表示するだけの場合は、u8x8の方を使いましたが、今回は絵なのでu8g2の方を使います。u8g2の使い方はdo ~ while文で関数を繰り返し呼ぶ作法のようです。do ~ whileは今回初めて出てきた文法ですね。while( 継続条件 ){ }の場合、継続条件が成立しなければ、一回も{ }の処理を実行されませんが、do ~ while( 継続条件 ){ }の場合、必ず一回は{ }の処理が実行されます。後は普通のwhile文と同じです。{ }内のdrawXBMP関数にsharingan配列のポインタを渡せばOLED上に写輪眼が表示されます。u8g2のリファレンスはこちらを参照下さい。
実行結果
実行結果はこんな感じでした。あぁ~良い感じやんか。横幅あるし、もっと目玉っぽく出来そうやな。まあ、これでええけど。
写輪眼回してみた
ここまで来たら写輪眼を回してやろうじゃないの。以下ソースコードです。
#include <U8g2lib.h>
// 写輪眼
const unsigned char sharingan4[] U8X8_PROGMEM = {
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0xFC, 0x3F, 0x00, 0x00, 0x00, 0x00, 0x00, 0xC0, 0xFF,
0xFF, 0x03, 0x00, 0x00, 0x00, 0x00, 0xF0, 0xFF, 0xFF, 0x0F, 0x00, 0x00,
0x00, 0x00, 0xFC, 0x01, 0x80, 0x3F, 0x00, 0x00, 0x00, 0x00, 0x3F, 0x00,
0x00, 0xFC, 0x00, 0x00, 0x00, 0x80, 0x0F, 0x00, 0x00, 0xF0, 0x01, 0x00,
0x00, 0xE0, 0x03, 0x00, 0x3E, 0xC0, 0x07, 0x00, 0x00, 0xF0, 0x01, 0xC0,
0xFF, 0x83, 0x0F, 0x00, 0x00, 0x78, 0x00, 0xE0, 0xFF, 0x0F, 0x1E, 0x00,
0x00, 0x3C, 0x00, 0xF0, 0x3F, 0x00, 0x3C, 0x00, 0x00, 0x1E, 0x00, 0xF8,
0x3F, 0x00, 0x78, 0x00, 0x00, 0x0E, 0x00, 0xF8, 0x3F, 0x00, 0xF0, 0x00,
0x00, 0x07, 0x00, 0xFC, 0x7F, 0x00, 0xE0, 0x00, 0x80, 0x07, 0x00, 0xFE,
0x7F, 0x00, 0xC0, 0x01, 0x80, 0x03, 0x80, 0xFF, 0xFF, 0x01, 0xC0, 0x03,
0xC0, 0x01, 0xC0, 0xFF, 0xFF, 0x03, 0x80, 0x03, 0xC0, 0x01, 0xE0, 0xF9,
0xBF, 0x0F, 0x80, 0x07, 0xE0, 0x00, 0x70, 0xF0, 0x1F, 0x1E, 0x00, 0x07,
0xE0, 0x00, 0x38, 0xE0, 0x0F, 0x1C, 0x00, 0x07, 0x70, 0x00, 0x1C, 0x80,
0x07, 0x38, 0x00, 0x0E, 0x70, 0x00, 0x0E, 0x00, 0x00, 0x70, 0x00, 0x0E,
0x70, 0x00, 0x0E, 0x00, 0x00, 0x70, 0x00, 0x0C, 0x30, 0x00, 0x07, 0x00,
0x00, 0xE0, 0x00, 0x1C, 0x38, 0x00, 0x07, 0x00, 0x00, 0xE0, 0x00, 0x1C,
0x38, 0x00, 0x03, 0xE0, 0x07, 0xC0, 0x00, 0x1C, 0x38, 0x80, 0x03, 0xF0,
0x0F, 0xC0, 0x01, 0x1C, 0x38, 0x80, 0x03, 0xF8, 0x1F, 0xC0, 0x01, 0x1C,
0x38, 0x80, 0x03, 0xF8, 0x3F, 0xC0, 0x01, 0x18, 0x38, 0x80, 0x03, 0xFC,
0x3F, 0xC0, 0x01, 0x18, 0x38, 0x81, 0x03, 0xFC, 0x3F, 0xC0, 0x01, 0x18,
0x38, 0x81, 0x07, 0xF8, 0x3F, 0xC0, 0x01, 0x18, 0x38, 0x82, 0x3F, 0xF8,
0x1F, 0xF8, 0x01, 0x18, 0x38, 0xC6, 0x7F, 0xF8, 0x1F, 0xFC, 0x03, 0x1C,
0x38, 0xEE, 0xFF, 0xF0, 0x0F, 0xFE, 0x07, 0x1C, 0x38, 0xFE, 0xFF, 0xC0,
0x03, 0xFF, 0x07, 0x1C, 0x30, 0xFE, 0xFF, 0x00, 0x00, 0xFF, 0x0F, 0x1C,
0x70, 0xFC, 0xFF, 0x01, 0x80, 0xFF, 0x0F, 0x0C, 0x70, 0xFC, 0xFF, 0x01,
0x80, 0xFF, 0x0F, 0x0E, 0x70, 0xF8, 0xFF, 0x00, 0x80, 0xFF, 0x0F, 0x0E,
0xE0, 0xF0, 0xFF, 0x00, 0x00, 0xFF, 0x0F, 0x0E, 0xE0, 0xE0, 0xFF, 0x00,
0x00, 0xFF, 0x0F, 0x07, 0xC0, 0xC1, 0xFF, 0x00, 0x00, 0xFF, 0x07, 0x07,
0xC0, 0x01, 0xFF, 0x03, 0xC0, 0xFF, 0x87, 0x03, 0xC0, 0x03, 0x80, 0x7F,
0xFE, 0xF1, 0xC3, 0x03, 0x80, 0x03, 0x00, 0xFE, 0xFF, 0xC0, 0xC3, 0x01,
0x00, 0x07, 0x00, 0xF8, 0x1F, 0xC0, 0xE1, 0x00, 0x00, 0x0F, 0x00, 0x00,
0x00, 0xC0, 0xF0, 0x00, 0x00, 0x1E, 0x00, 0x00, 0x00, 0x60, 0x78, 0x00,
0x00, 0x3C, 0x00, 0x00, 0x00, 0x20, 0x3C, 0x00, 0x00, 0x78, 0x00, 0x00,
0x00, 0x10, 0x1E, 0x00, 0x00, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x0F, 0x00,
0x00, 0xE0, 0x03, 0x00, 0x00, 0x80, 0x07, 0x00, 0x00, 0xC0, 0x07, 0x00,
0x00, 0xE0, 0x03, 0x00, 0x00, 0x00, 0x1F, 0x00, 0x00, 0xF8, 0x00, 0x00,
0x00, 0x00, 0xFE, 0x00, 0x00, 0x7F, 0x00, 0x00, 0x00, 0x00, 0xF8, 0x1F,
0xF8, 0x1F, 0x00, 0x00, 0x00, 0x00, 0xE0, 0xFF, 0xFF, 0x07, 0x00, 0x00,
0x00, 0x00, 0x00, 0xFE, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80,
0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
};
const unsigned char sharingan3[] U8X8_PROGMEM = {
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0xFC, 0x3F, 0x00, 0x00, 0x00, 0x00, 0x00, 0xC0, 0xFF,
0xFF, 0x03, 0x00, 0x00, 0x00, 0x00, 0xF0, 0xFF, 0xFF, 0x0F, 0x00, 0x00,
0x00, 0x00, 0xFE, 0x01, 0x80, 0x3F, 0x00, 0x00, 0x00, 0x00, 0x3F, 0x00,
0x00, 0xFC, 0x00, 0x00, 0x00, 0xC0, 0x0F, 0xC0, 0x00, 0xF0, 0x01, 0x00,
0x00, 0xE0, 0x03, 0x3E, 0x00, 0xC0, 0x07, 0x00, 0x00, 0xF0, 0x80, 0x1F,
0x00, 0x80, 0x0F, 0x00, 0x00, 0x78, 0xC0, 0x0F, 0x00, 0x00, 0x1E, 0x00,
0x00, 0x3C, 0xE0, 0x07, 0x00, 0x00, 0x3C, 0x00, 0x00, 0x1E, 0xF0, 0x0F,
0x00, 0x00, 0x78, 0x00, 0x00, 0x0F, 0xF8, 0x1F, 0x00, 0x00, 0x70, 0x00,
0x00, 0x07, 0xF8, 0xFF, 0x0F, 0x00, 0xE0, 0x00, 0x80, 0x03, 0xFC, 0xFF,
0x7F, 0x00, 0xE0, 0x01, 0xC0, 0x03, 0xFC, 0xFF, 0xFF, 0x01, 0xC0, 0x01,
0xC0, 0x01, 0xFC, 0x7F, 0xE0, 0x03, 0x80, 0x03, 0xE0, 0x00, 0xFC, 0x3F,
0x80, 0x07, 0x80, 0x03, 0xE0, 0x00, 0xFC, 0x3F, 0x00, 0x0E, 0x00, 0x07,
0x70, 0x00, 0xFC, 0x3F, 0x00, 0x1C, 0x00, 0x07, 0x70, 0x00, 0xFC, 0x1F,
0x00, 0x38, 0x00, 0x0E, 0x70, 0x00, 0xFE, 0x0F, 0x00, 0x70, 0x00, 0x0E,
0x30, 0x00, 0x86, 0x01, 0x00, 0x70, 0x00, 0x0E, 0x38, 0x00, 0x07, 0x00,
0x00, 0xE0, 0x00, 0x0C, 0x38, 0x00, 0x03, 0x80, 0x01, 0xE0, 0x01, 0x1C,
0x38, 0x80, 0x03, 0xF0, 0x07, 0xF0, 0x07, 0x1C, 0x38, 0x80, 0x03, 0xF8,
0x0F, 0xF8, 0x0F, 0x1C, 0x18, 0x80, 0x03, 0xF8, 0x1F, 0xFC, 0x1F, 0x1C,
0x18, 0x80, 0x03, 0xFC, 0x1F, 0xFC, 0x3F, 0x1C, 0x1C, 0x80, 0x01, 0xFC,
0x1F, 0xFE, 0x3F, 0x1C, 0x1C, 0x80, 0x01, 0xFC, 0x1F, 0xFE, 0x3F, 0x1C,
0x18, 0x80, 0x03, 0xFC, 0x1F, 0xFE, 0x7F, 0x1C, 0x18, 0x80, 0x03, 0xF8,
0x1F, 0xFE, 0x7F, 0x1C, 0x38, 0x80, 0x03, 0xF8, 0x0F, 0xFC, 0x7F, 0x1C,
0x38, 0x80, 0x03, 0xF0, 0x07, 0xF8, 0x7F, 0x1C, 0x38, 0x00, 0x03, 0xC0,
0x03, 0xF0, 0x7F, 0x1C, 0x38, 0x00, 0x07, 0x00, 0x00, 0xE0, 0x31, 0x0C,
0x38, 0x00, 0xC7, 0x01, 0x00, 0x70, 0x30, 0x0E, 0x70, 0x00, 0xFE, 0x07,
0x00, 0x70, 0x30, 0x0E, 0x70, 0x00, 0xFC, 0x0F, 0x00, 0x38, 0x30, 0x0E,
0x70, 0x00, 0xFC, 0x1F, 0x00, 0x1C, 0x10, 0x07, 0xE0, 0x00, 0xFC, 0x3F,
0x00, 0x1E, 0x10, 0x07, 0xE0, 0x08, 0xFE, 0x3F, 0x80, 0x0F, 0x80, 0x03,
0xC0, 0x31, 0xFE, 0x3F, 0xE0, 0x03, 0x80, 0x03, 0xC0, 0xE1, 0xFF, 0xFF,
0xFF, 0x01, 0xC0, 0x01, 0x80, 0xC3, 0xFF, 0xFF, 0x7F, 0x00, 0xE0, 0x01,
0x00, 0x87, 0xFF, 0xFF, 0x0F, 0x00, 0xE0, 0x00, 0x00, 0x0F, 0xFF, 0x1F,
0x00, 0x00, 0x70, 0x00, 0x00, 0x1E, 0xFC, 0x0F, 0x00, 0x00, 0x78, 0x00,
0x00, 0x3C, 0xF0, 0x03, 0x00, 0x00, 0x3C, 0x00, 0x00, 0x78, 0x00, 0x00,
0x00, 0x00, 0x1E, 0x00, 0x00, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x0F, 0x00,
0x00, 0xE0, 0x03, 0x00, 0x00, 0xC0, 0x07, 0x00, 0x00, 0xC0, 0x07, 0x00,
0x00, 0xF0, 0x03, 0x00, 0x00, 0x00, 0x1F, 0x00, 0x00, 0xFC, 0x00, 0x00,
0x00, 0x00, 0xFE, 0x00, 0x00, 0x7F, 0x00, 0x00, 0x00, 0x00, 0xF8, 0x1F,
0xFC, 0x1F, 0x00, 0x00, 0x00, 0x00, 0xE0, 0xFF, 0xFF, 0x03, 0x00, 0x00,
0x00, 0x00, 0x00, 0xFE, 0x7F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
};
const unsigned char sharingan2[] U8X8_PROGMEM = {
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x01, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0xFF, 0x7F, 0x00, 0x00, 0x00, 0x00, 0x00, 0xE0, 0xFF,
0xFF, 0x07, 0x00, 0x00, 0x00, 0x00, 0xF8, 0x1F, 0xF8, 0x1F, 0x00, 0x00,
0x00, 0x00, 0xFE, 0x00, 0x00, 0x7F, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x00,
0x00, 0xF8, 0x00, 0x00, 0x00, 0xC0, 0x07, 0x00, 0x00, 0xE0, 0x03, 0x00,
0x00, 0xE0, 0x01, 0x00, 0x00, 0xC0, 0x07, 0x00, 0x00, 0xF0, 0x00, 0x00,
0x00, 0x00, 0x0F, 0x00, 0x00, 0x78, 0x08, 0x00, 0x00, 0x00, 0x1E, 0x00,
0x00, 0x3C, 0x04, 0x00, 0x00, 0x00, 0x3C, 0x00, 0x00, 0x1E, 0x06, 0x00,
0x00, 0x00, 0x78, 0x00, 0x00, 0x0F, 0x03, 0x00, 0x00, 0x00, 0xF0, 0x00,
0x00, 0x87, 0x03, 0xF8, 0x1F, 0x00, 0xE0, 0x00, 0x80, 0xC3, 0x03, 0xFF,
0x7F, 0x00, 0xC0, 0x01, 0xC0, 0xC3, 0x8F, 0x7F, 0xFE, 0x01, 0xC0, 0x03,
0xC0, 0xE1, 0xFF, 0x03, 0xC0, 0xFF, 0x80, 0x03, 0xE0, 0xE0, 0xFF, 0x00,
0x00, 0xFF, 0x83, 0x03, 0xE0, 0xF0, 0xFF, 0x00, 0x00, 0xFF, 0x07, 0x07,
0x70, 0xF0, 0xFF, 0x00, 0x00, 0xFF, 0x0F, 0x07, 0x70, 0xF0, 0xFF, 0x01,
0x00, 0xFF, 0x1F, 0x0E, 0x70, 0xF0, 0xFF, 0x01, 0x80, 0xFF, 0x3F, 0x0E,
0x30, 0xF0, 0xFF, 0x01, 0x80, 0xFF, 0x3F, 0x0E, 0x38, 0xF0, 0xFF, 0x00,
0x00, 0xFF, 0x7F, 0x0C, 0x38, 0xE0, 0xFF, 0xC0, 0x03, 0xFF, 0x7F, 0x1C,
0x38, 0xE0, 0x7F, 0xF0, 0x0F, 0xFF, 0x77, 0x1C, 0x38, 0xC0, 0x3F, 0xF8,
0x1F, 0xFE, 0x63, 0x1C, 0x18, 0x80, 0x1F, 0xF8, 0x1F, 0xFC, 0x41, 0x1C,
0x18, 0x80, 0x03, 0xFC, 0x1F, 0xE0, 0x81, 0x1C, 0x18, 0x80, 0x03, 0xFC,
0x3F, 0xC0, 0x81, 0x1C, 0x18, 0x80, 0x03, 0xFC, 0x3F, 0xC0, 0x01, 0x1C,
0x18, 0x80, 0x03, 0xFC, 0x1F, 0xC0, 0x01, 0x1C, 0x38, 0x80, 0x03, 0xF8,
0x1F, 0xC0, 0x01, 0x1C, 0x38, 0x80, 0x03, 0xF0, 0x0F, 0xC0, 0x01, 0x1C,
0x38, 0x00, 0x03, 0xE0, 0x07, 0xC0, 0x00, 0x1C, 0x38, 0x00, 0x07, 0x00,
0x00, 0xE0, 0x00, 0x1C, 0x38, 0x00, 0x07, 0x00, 0x00, 0xE0, 0x00, 0x0C,
0x30, 0x00, 0x0E, 0x00, 0x00, 0x70, 0x00, 0x0E, 0x70, 0x00, 0x0E, 0x00,
0x00, 0x70, 0x00, 0x0E, 0x70, 0x00, 0x1C, 0xE0, 0x01, 0x38, 0x00, 0x0E,
0xE0, 0x00, 0x38, 0xF0, 0x07, 0x1C, 0x00, 0x07, 0xE0, 0x00, 0x78, 0xF8,
0x0F, 0x0E, 0x00, 0x07, 0xE0, 0x01, 0xF0, 0xFD, 0x9F, 0x07, 0x80, 0x03,
0xC0, 0x01, 0xC0, 0xFF, 0xFF, 0x03, 0x80, 0x03, 0xC0, 0x03, 0x80, 0xFF,
0xFF, 0x01, 0xC0, 0x01, 0x80, 0x03, 0x00, 0xFE, 0x7F, 0x00, 0xE0, 0x01,
0x00, 0x07, 0x00, 0xFE, 0x3F, 0x00, 0xE0, 0x00, 0x00, 0x0F, 0x00, 0xFC,
0x1F, 0x00, 0x70, 0x00, 0x00, 0x1E, 0x00, 0xFC, 0x1F, 0x00, 0x78, 0x00,
0x00, 0x3C, 0x00, 0xFC, 0x0F, 0x00, 0x3C, 0x00, 0x00, 0x78, 0xF0, 0xFF,
0x07, 0x00, 0x1E, 0x00, 0x00, 0xF0, 0xC1, 0xFF, 0x03, 0x80, 0x0F, 0x00,
0x00, 0xE0, 0x03, 0x7C, 0x00, 0xC0, 0x07, 0x00, 0x00, 0x80, 0x0F, 0x00,
0x00, 0xF0, 0x01, 0x00, 0x00, 0x00, 0x3F, 0x00, 0x00, 0xFC, 0x00, 0x00,
0x00, 0x00, 0xFC, 0x01, 0x80, 0x3F, 0x00, 0x00, 0x00, 0x00, 0xF0, 0xFF,
0xFF, 0x0F, 0x00, 0x00, 0x00, 0x00, 0xC0, 0xFF, 0xFF, 0x03, 0x00, 0x00,
0x00, 0x00, 0x00, 0xFC, 0x3F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
};
const unsigned char sharingan1[] U8X8_PROGMEM = {
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0xFE, 0x7F, 0x00, 0x00, 0x00, 0x00, 0x00, 0xC0, 0xFF,
0xFF, 0x07, 0x00, 0x00, 0x00, 0x00, 0xF8, 0x3F, 0xF8, 0x1F, 0x00, 0x00,
0x00, 0x00, 0xFE, 0x00, 0x00, 0x7F, 0x00, 0x00, 0x00, 0x00, 0x3F, 0x00,
0x00, 0xF8, 0x00, 0x00, 0x00, 0xC0, 0x0F, 0x00, 0x00, 0xE0, 0x03, 0x00,
0x00, 0xE0, 0x03, 0x00, 0x00, 0xC0, 0x07, 0x00, 0x00, 0xF0, 0x00, 0x00,
0x00, 0x00, 0x0F, 0x00, 0x00, 0x78, 0x00, 0x00, 0x00, 0x00, 0x1E, 0x00,
0x00, 0x3C, 0x00, 0x00, 0xC0, 0x0F, 0x3C, 0x00, 0x00, 0x1E, 0x00, 0x00,
0xF0, 0x3F, 0x78, 0x00, 0x00, 0x0E, 0x00, 0x00, 0xF8, 0xFF, 0xF0, 0x00,
0x00, 0x07, 0x00, 0xF0, 0xFF, 0xFF, 0xE1, 0x00, 0x80, 0x07, 0x00, 0xFE,
0xFF, 0xFF, 0xC3, 0x01, 0x80, 0x03, 0x80, 0xFF, 0xFF, 0xFF, 0x87, 0x03,
0xC0, 0x01, 0xC0, 0x07, 0xFC, 0x7F, 0x8C, 0x03, 0xC0, 0x01, 0xF0, 0x01,
0xFC, 0x7F, 0x10, 0x07, 0xE0, 0x08, 0x78, 0x00, 0xFC, 0x3F, 0x00, 0x07,
0xE0, 0x08, 0x38, 0x00, 0xF8, 0x3F, 0x00, 0x0E, 0x70, 0x0C, 0x1C, 0x00,
0xF0, 0x3F, 0x00, 0x0E, 0x70, 0x0C, 0x0E, 0x00, 0xE0, 0x7F, 0x00, 0x0E,
0x70, 0x0C, 0x0E, 0x00, 0x80, 0xE3, 0x00, 0x1C, 0x30, 0x8C, 0x07, 0x00,
0x00, 0xE0, 0x00, 0x1C, 0x38, 0xFE, 0x0F, 0xC0, 0x03, 0xC0, 0x00, 0x1C,
0x38, 0xFE, 0x1F, 0xE0, 0x0F, 0xC0, 0x01, 0x1C, 0x38, 0xFE, 0x3F, 0xF0,
0x1F, 0xC0, 0x01, 0x1C, 0x38, 0xFE, 0x7F, 0xF8, 0x1F, 0xC0, 0x01, 0x18,
0x38, 0xFE, 0x7F, 0xF8, 0x3F, 0xC0, 0x01, 0x18, 0x38, 0xFC, 0x7F, 0xF8,
0x3F, 0x80, 0x01, 0x38, 0x38, 0xFC, 0x7F, 0xF8, 0x3F, 0x80, 0x01, 0x38,
0x38, 0xFC, 0x3F, 0xF8, 0x3F, 0xC0, 0x01, 0x18, 0x38, 0xF8, 0x3F, 0xF8,
0x1F, 0xC0, 0x01, 0x18, 0x38, 0xF0, 0x1F, 0xF0, 0x1F, 0xC0, 0x01, 0x1C,
0x38, 0xE0, 0x0F, 0xE0, 0x0F, 0xC0, 0x01, 0x1C, 0x38, 0x80, 0x07, 0x80,
0x01, 0xC0, 0x00, 0x1C, 0x30, 0x00, 0x07, 0x00, 0x00, 0xE0, 0x00, 0x1C,
0x70, 0x00, 0x0E, 0x00, 0x80, 0x61, 0x00, 0x0C, 0x70, 0x00, 0x0E, 0x00,
0xF0, 0x7F, 0x00, 0x0E, 0x70, 0x00, 0x1C, 0x00, 0xF8, 0x3F, 0x00, 0x0E,
0xE0, 0x00, 0x38, 0x00, 0xFC, 0x3F, 0x00, 0x0E, 0xE0, 0x00, 0x70, 0x00,
0xFC, 0x3F, 0x00, 0x07, 0xC0, 0x01, 0xE0, 0x01, 0xFC, 0x3F, 0x00, 0x07,
0xC0, 0x01, 0xC0, 0x07, 0xFE, 0x3F, 0x80, 0x03, 0x80, 0x03, 0x80, 0xFF,
0xFF, 0x3F, 0xC0, 0x03, 0x80, 0x07, 0x00, 0xFE, 0xFF, 0x3F, 0xC0, 0x01,
0x00, 0x07, 0x00, 0xF0, 0xFF, 0x1F, 0xE0, 0x00, 0x00, 0x0E, 0x00, 0x00,
0xF8, 0x1F, 0xF0, 0x00, 0x00, 0x1E, 0x00, 0x00, 0xF0, 0x0F, 0x78, 0x00,
0x00, 0x3C, 0x00, 0x00, 0xE0, 0x07, 0x3C, 0x00, 0x00, 0x78, 0x00, 0x00,
0xF0, 0x03, 0x1E, 0x00, 0x00, 0xF0, 0x01, 0x00, 0xF8, 0x01, 0x0F, 0x00,
0x00, 0xE0, 0x03, 0x00, 0x7C, 0xC0, 0x07, 0x00, 0x00, 0x80, 0x0F, 0x00,
0x03, 0xF0, 0x03, 0x00, 0x00, 0x00, 0x3F, 0x00, 0x00, 0xFC, 0x00, 0x00,
0x00, 0x00, 0xFC, 0x01, 0x80, 0x7F, 0x00, 0x00, 0x00, 0x00, 0xF0, 0xFF,
0xFF, 0x0F, 0x00, 0x00, 0x00, 0x00, 0xC0, 0xFF, 0xFF, 0x03, 0x00, 0x00,
0x00, 0x00, 0x00, 0xFC, 0x3F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
};
U8G2_SSD1306_128X64_NONAME_1_HW_I2C u8g2(U8G2_R2, U8X8_PIN_NONE);
void setup() {
u8g2.begin();
}
int rol = 0;
void loop() {
u8g2.firstPage();
do {
u8g2.setFont(u8g2_font_t0_16b_mr);
switch (rol){
case 0: u8g2.drawXBMP(32,0,64,64,sharingan1); break;
case 1: u8g2.drawXBMP(32,0,64,64,sharingan2); break;
case 2: u8g2.drawXBMP(32,0,64,64,sharingan3); break;
case 3: u8g2.drawXBMP(32,0,64,64,sharingan4); break;
}
} while (u8g2.nextPage());
rol = (rol < 3) ? rol + 1 : 0;
}
写輪眼の元データを90度ずつ回転させて、それぞれxbmファイルに変換し、配列データとして取り込みました。その配列データを順番にdrawXBMP関数に渡すことで、クルクル回転しているように見えます。
実行結果
実行結果はこんな感じです。あんまり見過ぎると瞳術にかかってしまうんで気を付けて!
まとめ
今回はOLEDを使って遊んでみました。色々な表示ができるので遊びの幅は広いと思います。ライブラリの使い方を調べれば、もっと色んなことができるでしょう。残りは照度センサー、音センサー、温湿度センサー、圧力センサー、加速度センサーがありますが、基本的に入力の話になるので難しい話にはなりません。それでは、今回はこの辺で。お疲れ様でした。散!!