画像を表示させる(Grove Beginner Kit For Arduino検証報告)

Grove Beginner Kit For Arduino(以下、Beginner Kit)検証報告の10番目です。前回の記事はこちらです。
hirocom777.hatenadiary.org

画像データを表示する

 前回はOLED ディスプレイで、図形と文字を同時に表示してみました。今回は画像データを表示してみようと思います。OLEDディスプレイにはXBM形式形式の画像ファイルを表示する機能があります。

XBM形式の画像ファイル

 XBM形式の画像ファイルというものを、僕は今回初めて知りました。これは、画像をC言語の配列として表現したファイル形式です。C言語のソースリストに組み込んで使うことが出来ます。今回は、以下の画像データを表示してみましょう。
f:id:HiroCom777:20201212112515j:plain
100×50ピクセルのモノクロビットマップファイルです。このファイルをXBM形式に変換するには以下のサイトを利用するのがよいでしょう。
www.online-utility.org
此方のサイトを開いて『ファイルの選択』を押すと、ファイルを開くダイアログが表示されます。上記のビットマップファイルを選択した後に『Convert and Download』を押すと変換されたファイルがダウンロードされます。テキストデータなのでテキストエディタで開いてみると、以下のような形式が現れます。

#define xxxxxxxxxxxx_width 100
#define xxxxxxxxxxxx_height 50
static char xxxxxxxxxxxx_bits[] = {
 変換されたデータ
};

今回は、上記ファイル変換されたデータ部分を使用します。

画像を表示するスケッチ

 それでは画像を表示するスケッチを以下にご紹介します。

#include <U8g2lib.h>
U8G2_SSD1306_128X64_NONAME_1_HW_I2C u8g2(U8G2_R2, /* reset=*/U8X8_PIN_NONE);
const unsigned char A_bmp[] 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, 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, 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, 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,
  0x00, 0xA0, 0x1A, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  0x00, 0x00, 0xE0, 0x3F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  0x00, 0x00, 0x00, 0xF0, 0x3F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  0x00, 0x00, 0x00, 0x00, 0xF0, 0x3F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  0x00, 0x00, 0x00, 0x00, 0x00, 0xF0, 0x7F, 0x00, 0x00, 0x00, 0x00, 0x00,
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xF8, 0x7F, 0x00, 0x00, 0x00, 0x00,
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xF8, 0x7F, 0x00, 0x00, 0x00,
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFC, 0xFF, 0x00, 0x00,
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFC, 0xFF, 0x00,
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFC, 0xFF,
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFE,
  0xFF, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  0xFE, 0xFC, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  0x00, 0xFE, 0xFC, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  0x00, 0x00, 0xFF, 0xFC, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  0x00, 0x00, 0x00, 0x7F, 0xF8, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  0x00, 0x00, 0x00, 0x00, 0x7F, 0xF8, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00,
  0x00, 0x00, 0x00, 0x00, 0x80, 0x7F, 0xF8, 0x07, 0x00, 0x00, 0x00, 0x00,
  0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x7F, 0xF0, 0x07, 0x00, 0x00, 0x00,
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x3F, 0xF0, 0x07, 0x00, 0x00,
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xC0, 0x3F, 0xF0, 0x0F, 0x00,
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xC0, 0x3F, 0xF0, 0x0F,
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xE0, 0x1F, 0xE0,
  0x1F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xE0, 0x1F,
  0xE0, 0x1F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xE0,
  0xFF, 0xFF, 0x1F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  0xF0, 0xFF, 0xFF, 0x3F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  0x00, 0xF0, 0xFF, 0xFF, 0x3F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  0x00, 0x00, 0xF0, 0xFF, 0xFF, 0x3F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  0x00, 0x00, 0x00, 0xF8, 0xFF, 0xFF, 0x7F, 0x00, 0x00, 0x00, 0x00, 0x00,
  0x00, 0x00, 0x00, 0x00, 0xF8, 0xFF, 0xFF, 0x7F, 0x00, 0x00, 0x00, 0x00,
  0x00, 0x00, 0x00, 0x00, 0x00, 0xF8, 0x07, 0x00, 0x7F, 0x00, 0x00, 0x00,
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFC, 0x07, 0x80, 0xFF, 0x00, 0x00,
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFC, 0x03, 0x00, 0xFF, 0x00,
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFC, 0x03, 0x00, 0xFF,
  0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFE, 0x03, 0x00,
  0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFE, 0x01,
  0x00, 0xFE, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFE,
  0x01, 0x00, 0xFE, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  0x56, 0x00, 0x00, 0xD8, 0x01, 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, 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, 0x00,
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  0x00, 0x00,
};

void setup() {
  u8g2.begin();
  u8g2.setPowerSave(0);
  u8g2.setFlipMode(0);
  u8g2.firstPage();
  do {
    u8g2.drawXBMP(20, 0, 100, 50, A_bmp);
  } while (u8g2.nextPage());
}
void loop() {
}

コンパイルしてBeginner Kitに書き込んでみると、以下の様に表示されました。

f:id:HiroCom777:20201212143204j:plain
成功ですね!!

スケッチの解説

 それではスケッチの解説です。変換されたデータデータの内容は
const unsigned char A_bmp[] U8X8_PROGMEM =
に続く{}の中に貼り付けます。この値の配列が画像データです。表示をするには以下の関数を使用します。
・u8g2.drawXBMP()
 XBM形式の画像データを表示します。記述方法は以下の通りです。
 u8g2.drawXBMP(表示位置X,表示位置Y,画像幅,画像高さ,画像データ)
表示位置X,Yは画像データの左上になります。また、この関数も他のu8g2の描画関数と一緒で、
u8g2.firstPage()とu8g2.nextPage()を使って描画します。今回のスケッチと以下を参考にしてください。
hirocom777.hatenadiary.org

さて、CPUボードと全てのモジュールについて解説が完了しました。これでGrove Beginner Kit For Arduino検証報告の連載は終了します。でも、最後にちょっとだけおまけがあります。

おまけ-なんだか似たような製品が出てる

 最近になって、何だか気になる製品の広告を目にしました。

Arduino Sensor Kit - Base - Seeed Studio

なんだかBeginner Kitに似ている!!一体何者なんでしょうか?

CPUボードの代わりにGROVEベースシールド

 Arduino Sensor Kit - Base(以下、Sensor Kit)は、簡単に言うとBeginner KitのCPUボードがGROVEベースシールドに切り替わったものです。
www.switch-science.com
GROVEベースシールドは、マイコンボードArduinoUNO(または、その互換機)に取り付けることで、その他のセンサー、表示装置、入力装置などのGROVEモジュールを簡単に接続、使用する事ができます。以下の連載でArduinoUNOとGROVEシステムを使った例を紹介しています。

Arduino UNO入門の連載記事はコチラからどうぞ!!

つまり、この製品はArduinoUNOをすでに持っている人が安価にGROVEモジュールを手に入れられるというモノのようです。確かに個別にGROVEモジュールを購入するよりも、かなり安価です。Sensor KitにArduinoUNOを取り付けるとBeginner Kitとほぼ同等の機能になります。でも、ちょっとだけ違うところがあるんですよ。モジュールに接続されているピンが少しだけ変更されています。

・ボタンモジュールとLEDモジュールの接続
 Beginner Kitでは、LEDモジュールが4番ピン、ボタンモジュールが6番ピンに接続されています。Sensor KitではLEDモジュールが6番ピン、ボタンモジュールが4番ピンになりました。これで、LEDモジュールに接続されたピンがPWMサポートされるようになりました。この連載ではLEDモジュールでPWMを確認するために無理やりケーブルで繋ぎ変えていました。最初からこうしてほしかったです。

・光センサーの接続
 Beginner Kitでは、光センサーモジュールがA6ピンに接続されています。Sensor KitではA3ピンに変更になっています。

これらの接続を読みかえれば、Sensor KitとArduinoUNOを組み合わせることで、この連載でご紹介したスケッチは問題なく動作すると思います。

お付き合い有難うございました

 これでこの連載は本当に終了です。この連載を書くことでArduinoの今まで触れていなかった部分も知ることが出来てよかったです。また別の記事でお会いしたいと思います。有難うございました。


Arduino Grove Beginner Kit For Arduinoの連載記事はコチラからどうぞ!!