編集履歴一覧に戻る
momoのアイコン画像

momo が 2023年05月29日23時14分28秒 に編集

コメント無し

本文の変更

# はじめに 電子ペーパーモジュールを入手したので使い方の調査も兼ねて動作確認をしてみました。購入したのは下記の白黒赤の3色表示可能な2.13インチの電子ペーパーモジュールです。AliExpress などでは1400円くらいで販売しているのをよく見かけます。他にも白黒黄3色/白黒2色のタイプもあるようです。私の探し方がよくないのか、このモジュールのデータシートや使っているドライバICの型番などが見つけられず表示させるのに、てこずりました…。 ![キャプションを入力できます](https://camo.elchika.com/bcc7ebe0cc03ab9d134e74f794de123b7eb28413/687474703a2f2f73746f726167652e676f6f676c65617069732e636f6d2f656c6368696b612f76312f757365722f65343964323538632d663631612d346363642d393865302d3439323165303732366539302f39316364393963342d303033382d343463632d393130362d393934386634333763383265/) 2.13" 2.13 Inch Epaper Module E-paper E-Ink EInk Display Screen SPI Support For Arduino UNO STM32 Raspberry PI ESP32 # 開発環境 制御するマイコンはSeeed Studio XIAO(SAMD21) 、開発環境はArduino IDE(ver.2.1.0)を使用しました。 # 使用方法の調査 ### デバイスの情報はどこ? もちろん説明書などはありませんし、基板を見ても型番や形式名など検索キーワードになるものがなく手探り状態でした。唯一、製造メーカーっぽい「MH-ET LIVE」を手掛かりに探したところ、似たような電子ペーパーモジュールの情報がありました。が、結局、このモジュールについて詳細はわかりませんでした。ちなみに、基板裏についているICは単にレベルシフト用でした。電子ペーパーを制御しているICはおそらく電子ペーパー自体についているのだと思います。壊れそうだったので電子ペーパーを剝がして確認するのはあきらめました。 ![キャプションを入力できます](https://camo.elchika.com/5abf9f35fa4dd2ac6edaf34681190320fd126f57/687474703a2f2f73746f726167652e676f6f676c65617069732e636f6d2f656c6368696b612f76312f757365722f65343964323538632d663631612d346363642d393865302d3439323165303732366539302f31363239623239652d346561632d343732352d623238332d333465663065656335633237/) ### ライブラリはどれ? このモジュールの型番はわかりませんでしたが調べている中で、電子ペーパーの呼称がいくつかある事に気づきました。「e-paper」、「e-ink」、「epd」等と表記されることがあるようです。(どれが一般的なんでしょうか?) そこで、Arduino IDEのライブラリから、それらをキーワードに検索するといくつかヒットしたライブラリが見つかりました。その中からSAMD21系でコンパイルでき、3色表示で2.13incに対応している「**Adafruit_EPD**」を試してみました。 * https://github.com/adafruit/Adafruit_EPD/tree/master/examples/ThinkInk_tricolor ++GxEPD2というライブラリもよさそうでしたが、かなりの種類の電子ペーパーモジュールに対応していて設定などが複雑そうだったので途中で断念しました。ライブラリとしてはGxEPD2の方が新しいし高機能っぽいです。たぶん。++ ### どのClass定義を使えばいい? 早速 **Adafruit_EPD** をインストールしてexamplesから3色表示用のサンプルコードを開いてみましたが、モジュールの型番がわからないので、どのClassを使ったら良いかわかりません。仕方ないので2.13インチ3色用の定義が2つあったので両方試してみました。その結果、この電子ペーパーの制御ICは、**SSD1680** である事がわかりました(少なくとも互換性はあると思われる)。 ```:サンプルコードThinkInk_tricolor.inoから抜粋 // 1.54" 152x152 Tricolor EPD with ILI0373 chipset // ThinkInk_154_Tricolor_Z17 display(EPD_DC, EPD_RESET, EPD_CS, SRAM_CS, // EPD_BUSY, EPD_SPI); // 1.54" 152x152 Tricolor EPD with SSD1680 chipset // ThinkInk_154_Tricolor_RW display(EPD_DC, EPD_RESET, EPD_CS, SRAM_CS, EPD_BUSY, EPD_SPI); // 1.54" 200x200 Tricolor EPD with SSD1681 chipset // ThinkInk_154_Tricolor_Z90 display(EPD_DC, EPD_RESET, EPD_CS, SRAM_CS, EPD_BUSY, EPD_SPI); // 2.13" Tricolor EPD with SSD1680 chipset ThinkInk_213_Tricolor_RW display(EPD_DC, EPD_RESET, EPD_CS, SRAM_CS, EPD_BUSY, EPD_SPI); // 2.13" Tricolor EPD with IL0373 chipset // ThinkInk_213_Tricolor_Z16 display(EPD_DC, EPD_RESET, EPD_CS, SRAM_CS, EPD_BUSY, EPD_SPI); // 2.7" Tricolor Featherwing or Breakout with IL91874 chipset // ThinkInk_270_Tricolor_C44 display(EPD_DC, EPD_RESET, EPD_CS, SRAM_CS, EPD_BUSY, EPD_SPI); // 2.7" Tricolor Featherwing or Breakout with EK79686 chipset // ThinkInk_270_Tricolor_Z70 display(EPD_DC, EPD_RESET, EPD_CS, SRAM_CS, EPD_BUSY, EPD_SPI); // 2.9" Tricolor Featherwing or Breakout with IL0373 chipset // ThinkInk_290_Tricolor_Z10 display(EPD_DC, EPD_RESET, EPD_CS, SRAM_CS, EPD_BUSY, EPD_SPI); // 2.9" Tricolor Featherwing or Breakout with UC8151D chipset // ThinkInk_290_Tricolor_Z13 display(EPD_DC, EPD_RESET, EPD_CS, SRAM_CS, EPD_BUSY, EPD_SPI); // 2.9" Tricolor Featherwing or Breakout with SSD1680 chipset and negative offset // ThinkInk_290_Tricolor_Z94 display(EPD_DC, EPD_RESET, EPD_CS, SRAM_CS, EPD_BUSY, EPD_SPI); // ThinkInk_420_Tricolor_RW display(EPD_DC, EPD_RESET, EPD_CS, SRAM_CS, EPD_BUSY, EPD_SPI); // ThinkInk_420_Tricolor_Z21 display(EPD_DC, EPD_RESET, EPD_CS, SRAM_CS, EPD_BUSY, EPD_SPI); ``` ### 表示がずれる? 一応、表示できたのですが、よく見ると表示が垂直方向にずれているように見えます。表示開始位置がずれていて上の数ラインにゴミが表示されているようでした。仕方ないのでライブラリのソースコードを調べると、表示データを内部BufferからSPIで転送する際に表示開始位置にオフセットがかけられていました。そこで、Adafruit_SSD1680 のクラス定義している箇所を変更して `_xram_offset = 0` としてみたところ正常に表示することができました。 ![キャプションを入力できます](https://camo.elchika.com/c2ae90111e4fc602ba56c5120829e329e42a0924/687474703a2f2f73746f726167652e676f6f676c65617069732e636f6d2f656c6368696b612f76312f757365722f65343964323538632d663631612d346363642d393865302d3439323165303732366539302f63376530376334382d643331612d343435372d393264312d643930303835326563666266/) ```:\Arduino\libraries\Adafruit_EPD\src\drivers\Adafruit_SSD1680.h抜粋 class Adafruit_SSD1680 : public Adafruit_EPD { public: Adafruit_SSD1680(int width, int height, int16_t SID, int16_t SCLK, int16_t DC, int16_t RST, int16_t CS, int16_t SRCS, int16_t MISO, int16_t BUSY = -1); Adafruit_SSD1680(int width, int height, int16_t DC, int16_t RST, int16_t CS, int16_t SRCS, int16_t BUSY = -1, SPIClass *spi = &SPI); void begin(bool reset = true); void powerUp(); void update(); void powerDown(); protected: uint8_t writeRAMCommand(uint8_t index); void setRAMAddress(uint16_t x, uint16_t y); void busy_wait(); //int8_t _xram_offset = 1; // 1だと表示開始位置がずれる int8_t _xram_offset = 0;  // 0だとOK }; ``` ![キャプションを入力できます](https://camo.elchika.com/80f92b148d1543618a33e617f45c7f2c39364ac0/687474703a2f2f73746f726167652e676f6f676c65617069732e636f6d2f656c6368696b612f76312f757365722f65343964323538632d663631612d346363642d393865302d3439323165303732366539302f66366336393739662d653166312d346263652d613631612d333338316334363966343339/) ### 表示サイズが謎? 今回使用した電子ペーパーモジュールの仕様では、表示サイズは**212x104**です。にもかかわらず、何故か**250x122**で表示しているように見えます。謎です。 ![キャプションを入力できます](https://camo.elchika.com/f899b9a0bfcf0bbeafa23c660be8fb1994925a33/687474703a2f2f73746f726167652e676f6f676c65617069732e636f6d2f656c6368696b612f76312f757365722f65343964323538632d663631612d346363642d393865302d3439323165303732366539302f61613433336663652d386233302d346463312d393665382d346530646431306530336434/) ライブラリのソースコードを更に調べてみると、SSD1680の設定では表示サイズが **250x122** を想定しているようでした。試しに、ここのサイズを**212x104**に変更してみましたが、水平方向にもずれてしまって全然ダメでした。謎です。 おそらく、電子ペーパーの制御のコマンドは同じで、表示アドレス設定が違うのだと思われます。それをオフセット設定で無理やり合わせて、対応していない表示サイズだけどたまたまうまくいった。と言ったところでしょうか。(調べたが未だ不明....。) ```:\Arduino\libraries\Adafruit_EPD\src\panels\ThinkInk_213_Tricolor_RW.h抜粋 class ThinkInk_213_Tricolor_RW : public Adafruit_SSD1680 { public: ThinkInk_213_Tricolor_RW(int16_t SID, int16_t SCLK, int16_t DC, int16_t RST, int16_t CS, int16_t SRCS, int16_t MISO, int16_t BUSY = -1) : Adafruit_SSD1680(250, 122, SID, SCLK, DC, RST, CS, SRCS, MISO, BUSY){}; ThinkInk_213_Tricolor_RW(int16_t DC, int16_t RST, int16_t CS, int16_t SRCS, int16_t BUSY = -1, SPIClass *spi = &SPI) : Adafruit_SSD1680(250, 122, DC, RST, CS, SRCS, BUSY, spi){}; …(省略)… } ``` # ハードウェア マイコン側の端子と直結するだけです。Reset/Busy/CS/DC端子はプログラムで任意に指定が可能です。基板裏のSPIバスの選択スイッチは4線モードで使用しました。 ![キャプションを入力できます](https://camo.elchika.com/0a0e0d5acb123df397364aa765f17121ffc161ae/687474703a2f2f73746f726167652e676f6f676c65617069732e636f6d2f656c6368696b612f76312f757365722f65343964323538632d663631612d346363642d393865302d3439323165303732366539302f38626339643933372d346438302d346339392d626665342d346563383633393237386164/) # ソフトウェア 下記のソースコードではelchikaのロゴをお借りして表示させてみました。ビットマップ表示、文字列表示、四角形の表示を行っています。Adafruit_GFXライブラリもインストールしておけばGFX系の描画APIやフォントも普通に使えました。尚、SRAM_CSは、SRAMから表示データを転送する場合のENABLE信号端子のようです。今回は使用しませんので-1としています。 ```:e_paper_test.ino #include <Adafruit_ThinkInk.h> #include <Adafruit_GFX.h> #include <Fonts/FreeSansBold18pt7b.h> #include "bitmap_data.h" // 2.13" Tricolor EPD with SSD1680 chipset ThinkInk_213_Tricolor_RW epd( 3, // DC 1, // RESET, 2, // CS, -1, // SRAM_CS, 4 // BUSY ); void setup() { const uint8_t *bmp = __android_icon_bmp; uint32_t size_x = getVal(&bmp[0x12], sizeof(uint32_t)); // 水平サイズ uint32_t size_y = getVal(&bmp[0x16], sizeof(uint32_t)); // 垂直サイズ uint32_t offset = sizeof(__android_icon_bmp) - (size_x / 8 * size_y); // 画像データの先頭 epd.begin(THINKINK_TRICOLOR); epd.clearBuffer(); epd.setFont(&FreeSansBold18pt7b); epd.drawBitmap(0, 0, &bmp[offset], size_x, size_y, EPD_WHITE, EPD_RED); // 描画色=白 背景色=赤 epd.setCursor(125, 80); epd.setTextColor(EPD_BLACK); epd.print("elchika"); epd.fillRect(125, 85, 125, 3, EPD_RED); epd.display(); } void loop() { delay(1000); } int32_t getVal(const uint8_t *pb, int32_t len) { uint32_t val = 0; for (int sft = 0; sft < (len * 8); sft += 8) { val |= ((*pb++) << sft); } return val; } ``` 表示させるビットマップデータは`bitmap_data.h`に定義してあります。作り方は次の章に記載しましたので、他のビットマップを表示させてみたい場合は参考にしてください。 ```:bitmap_data.h unsigned char __android_icon_bmp[] = { 0x42, 0x4d, 0xbe, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3e, 0x00, 0x00, 0x00, 0x28, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x78, 0x00, 0x00, 0x00, 0x01, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x07, 0x00, 0x00, 0xc4, 0x0e, 0x00, 0x00, 0xc4, 0x0e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x00, 0x00, 0x3f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x00, 0x00, 0x07, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x00, 0x00, 0x01, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x00, 0x00, 0x00, 0x0f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x00, 0x00, 0x00, 0x07, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x00, 0x00, 0x00, 0x01, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x00, 0x00, 0x00, 0x00, 0x3f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x00, 0x00, 0x00, 0x00, 0x1f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x07, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x01, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe0, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x00, 0x00, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, 0x00, 0x1f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, 0x00, 0x0f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, 0x00, 0x0f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x00, 0x03, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, 0x1f, 0xff, 0xff, 0x00, 0x01, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, 0x01, 0xff, 0xff, 0x80, 0x01, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, 0x00, 0x0f, 0xff, 0xe0, 0x00, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, 0x00, 0x03, 0xff, 0xf0, 0x00, 0x3f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, 0x00, 0x00, 0xff, 0xf8, 0x00, 0x3f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, 0x00, 0x00, 0x3f, 0xfe, 0x00, 0x0f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, 0x00, 0x00, 0x0f, 0xff, 0x00, 0x07, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe0, 0x00, 0x00, 0x07, 0xff, 0x80, 0x07, 0xff, 0xff, 0xff, 0xff, 0xf0, 0x7f, 0xff, 0xff, 0xff, 0xe0, 0x00, 0x00, 0x01, 0xff, 0xc0, 0x03, 0xff, 0xff, 0xff, 0xff, 0xc0, 0x0f, 0xff, 0xff, 0xff, 0xff, 0x80, 0x00, 0x00, 0xff, 0xe0, 0x03, 0xff, 0xff, 0xff, 0xff, 0x00, 0x07, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x00, 0x00, 0x7f, 0xe0, 0x01, 0xff, 0xff, 0xff, 0xfe, 0x00, 0x01, 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, 0x00, 0x1f, 0xf0, 0x00, 0xff, 0xff, 0xff, 0xfc, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, 0x00, 0x1f, 0xf8, 0x00, 0xff, 0xff, 0xff, 0xf8, 0x00, 0x00, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x00, 0x0f, 0xfc, 0x00, 0xff, 0xff, 0xff, 0xf8, 0x00, 0x00, 0x3f, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x00, 0x03, 0xfe, 0x00, 0x3f, 0xff, 0xff, 0xf0, 0x00, 0x00, 0x3f, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x03, 0xfe, 0x00, 0x3f, 0xff, 0xff, 0xf0, 0x00, 0x00, 0x3f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, 0x03, 0xfe, 0x00, 0x1f, 0xff, 0xff, 0xe0, 0x00, 0x00, 0x3f, 0xff, 0xff, 0xf8, 0x07, 0xff, 0xe0, 0x00, 0xff, 0x80, 0x1f, 0xff, 0xff, 0xe0, 0x00, 0x00, 0x3f, 0xff, 0xff, 0xf8, 0x01, 0xff, 0xf0, 0x00, 0x7f, 0x80, 0x1f, 0xff, 0xff, 0xe0, 0x00, 0x00, 0x3f, 0xff, 0xff, 0xf8, 0x00, 0x7f, 0xf8, 0x00, 0x7f, 0xc0, 0x1f, 0xff, 0xff, 0xe0, 0x00, 0x00, 0x1f, 0xff, 0xff, 0xf8, 0x00, 0x0f, 0xfc, 0x00, 0x3f, 0xc0, 0x0f, 0xff, 0xff, 0xe0, 0x00, 0x00, 0x1f, 0xff, 0xff, 0xf8, 0x00, 0x0f, 0xfe, 0x00, 0x3f, 0xc0, 0x07, 0xff, 0xff, 0xe0, 0x00, 0x00, 0x0f, 0xff, 0xff, 0xfc, 0x00, 0x03, 0xff, 0x00, 0x1f, 0xe0, 0x07, 0xff, 0xff, 0xf0, 0x00, 0x00, 0x01, 0xff, 0xff, 0xfc, 0x00, 0x01, 0xff, 0x00, 0x0f, 0xe0, 0x3f, 0xff, 0xff, 0xf0, 0x00, 0x00, 0x00, 0xff, 0xff, 0xfc, 0x00, 0x00, 0xff, 0x80, 0x0f, 0xf0, 0xff, 0xff, 0xff, 0xf0, 0x00, 0x00, 0x00, 0x7f, 0xff, 0xfe, 0x00, 0x00, 0x7f, 0xc0, 0x0f, 0xf7, 0xff, 0xff, 0xff, 0xf8, 0x00, 0x00, 0x00, 0x0f, 0xff, 0xff, 0xe0, 0x00, 0x3f, 0xe0, 0x07, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x00, 0x00, 0x00, 0x07, 0xff, 0xff, 0xf0, 0x00, 0x3f, 0xe0, 0x0f, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x00, 0x00, 0x00, 0x03, 0xff, 0xff, 0xfc, 0x00, 0x1f, 0xe0, 0x3f, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x7f, 0xff, 0xff, 0x00, 0x0f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x06, 0x00, 0x00, 0x3f, 0xff, 0xff, 0x80, 0x07, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, 0x0f, 0x00, 0x00, 0x0f, 0x80, 0x7f, 0x80, 0x07, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, 0x00, 0x00, 0x00, 0x0f, 0xe0, 0x3f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, 0x00, 0x00, 0x00, 0x07, 0xe1, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x00, 0x00, 0x00, 0x03, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x01, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe0, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x00, 0x3f, 0x00, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x00, 0x3f, 0x80, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x7f, 0x80, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, 0x7f, 0xc0, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, 0xff, 0xc0, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, 0x7f, 0xc0, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x00, 0x7f, 0x80, 0x1f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x00, 0x3f, 0x80, 0x0f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, 0x3f, 0xff, 0xf0, 0x00, 0x3f, 0x00, 0x03, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x01, 0xff, 0x80, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x00, 0x00, 0x7c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe0, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x7f, 0xff, 0xff, 0xc0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7f, 0xff, 0xff, 0xc0, 0x00, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3f, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1f, 0x80, 0x3e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1f, 0xff, 0xff, 0x00, 0x0f, 0xc0, 0x00, 0x00, 0x7f, 0x80, 0x3f, 0x80, 0x00, 0x00, 0x00, 0x00, 0x1f, 0xff, 0xfe, 0x00, 0x1f, 0xf0, 0x00, 0x00, 0xff, 0x80, 0x3f, 0x80, 0x00, 0x00, 0x00, 0x00, 0x1f, 0xff, 0xfe, 0x00, 0xff, 0xf8, 0x00, 0x07, 0xff, 0x80, 0x3f, 0xf0, 0x00, 0x00, 0x00, 0x00, 0x1f, 0xff, 0xfe, 0x00, 0xff, 0xfc, 0x00, 0x0f, 0xff, 0x80, 0x3f, 0xf8, 0x00, 0x00, 0x00, 0x00, 0x1f, 0xff, 0xfe, 0x01, 0xff, 0xfe, 0x00, 0x1f, 0xff, 0x80, 0x3f, 0xfe, 0x00, 0x00, 0x00, 0x00, 0x1f, 0xff, 0xfc, 0x03, 0xff, 0xfe, 0x00, 0xff, 0xff, 0x80, 0x3f, 0xff, 0xc0, 0x00, 0x00, 0x00, 0x1f, 0xff, 0xfc, 0x03, 0xff, 0xff, 0x00, 0xff, 0xff, 0x80, 0x3f, 0xff, 0xc0, 0x00, 0x00, 0x00, 0x1f, 0xff, 0xfc, 0x03, 0xff, 0xff, 0x00, 0xff, 0xff, 0x80, 0x3f, 0xff, 0xf0, 0x00, 0x00, 0x00, 0x1f, 0xff, 0xfc, 0x07, 0xff, 0xff, 0x00, 0xff, 0xff, 0x80, 0x3f, 0xff, 0xf0, 0x00, 0x00, 0x00, 0x1f, 0xff, 0xfc, 0x07, 0xff, 0xff, 0x00, 0xff, 0xff, 0x80, 0x3f, 0xff, 0xf0, 0x00, 0x00, 0x00, 0x1f, 0xff, 0xfc, 0x07, 0xff, 0xff, 0x00, 0xff, 0xff, 0x80, 0x3f, 0xff, 0xf0, 0x00, 0x00, 0x00, 0x1f, 0xff, 0xfc, 0x03, 0xff, 0xff, 0x00, 0xff, 0xff, 0x80, 0x3f, 0xff, 0xf0, 0x00, 0x00, 0x00, 0x1f, 0xff, 0xfc, 0x03, 0xff, 0xfe, 0x00, 0xff, 0xff, 0x80, 0x3f, 0xff, 0xf0, 0x00, 0x00, 0x00, 0x1f, 0xff, 0xfc, 0x01, 0xff, 0xfe, 0x00, 0xff, 0xff, 0x80, 0x3f, 0xff, 0xf0, 0x00, 0x00, 0x00, 0x1f, 0xff, 0xfe, 0x00, 0xff, 0xfe, 0x00, 0xff, 0xff, 0x80, 0x3f, 0xff, 0xf0, 0x00, 0x00, 0x00, 0x1f, 0xff, 0xfe, 0x00, 0xff, 0xfc, 0x01, 0xff, 0xff, 0x80, 0x1f, 0xff, 0xf0, 0x00, 0x00, 0x00, 0x1f, 0xff, 0xfe, 0x00, 0x7f, 0xf8, 0x01, 0xff, 0xff, 0x80, 0x1f, 0xff, 0xf0, 0x00, 0x00, 0x00, 0x1f, 0xff, 0xff, 0x00, 0x1f, 0xc0, 0x03, 0xff, 0xff, 0x80, 0x1f, 0xff, 0xf0, 0x00, 0x00, 0x00, 0x1f, 0xff, 0xff, 0x00, 0x03, 0x00, 0x07, 0xff, 0xff, 0x80, 0x1f, 0xff, 0xf0, 0x00, 0x00, 0x00, 0x1f, 0xff, 0xff, 0x80, 0x00, 0x00, 0x07, 0xff, 0xff, 0x80, 0x1f, 0xff, 0xf0, 0x00, 0x00, 0x00, 0x1f, 0xff, 0xff, 0xc0, 0x00, 0x00, 0x0f, 0xff, 0xff, 0x80, 0x1f, 0xff, 0xf8, 0x00, 0x00, 0x00, 0x1f, 0xff, 0xff, 0xe0, 0x00, 0x00, 0x1f, 0xff, 0xff, 0x00, 0x1f, 0xff, 0xf8, 0x00, 0x00, 0x00, 0x1f, 0xff, 0xff, 0xf0, 0x00, 0x00, 0x3f, 0xff, 0xfe, 0x00, 0x0f, 0xff, 0xf8, 0x00, 0x00, 0x00, 0x3f, 0xff, 0xff, 0xf8, 0x00, 0x00, 0xff, 0xff, 0xf8, 0x00, 0x03, 0xff, 0xf8, 0x00, 0x00, 0x00, 0x7f, 0xff, 0xff, 0xfe, 0x00, 0x01, 0xff, 0xff, 0xf0, 0x00, 0x01, 0xff, 0xfc, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0x00, 0x07, 0xff, 0xff, 0xf0, 0x00, 0x01, 0xff, 0xff, 0x00, 0x00, 0x01, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe0, 0x00, 0x00, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe0, 0x00, 0x00, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, 0x00, 0x00, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, 0x00, 0x00, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, 0x00, 0x00, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, 0x00, 0x00, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, 0x00, 0x00, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, 0x00, 0x00, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, 0x00, 0x00, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, 0x00, 0x00, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe0, 0x00, 0x00, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe0, 0x00, 0x00, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, 0x00, 0x01, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x00, 0x03, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x00, 0x07, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x1f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, 0x3f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff }; unsigned int __android_icon_bmp_len = 1982; ``` # ビットマップデータの作り方 ビットマップのフォーマットをが生かして、マイコン制御で扱い易いようにデータを成形します。

-

「bitmap_data.h」を生成するには下記のようにします。

+

「bitmap_data.h」を生成するには下記のようにします。(ファイル名が android-iconになっているのは特に意味はないです。間違えた...)

1. 表示したいビットマップ形式のデータを用意する。使用する色は1色(背景と合わせて2色)とする。 1. この電子ペーパーの表示サイズに合うように水平サイズは250pix以下、垂直サイズは122pix以下にリサイズする。尚、Paddingが入らないようにする為、水平サイズは32の倍数にする。 1. ビットマップフォーマットは逆さまに画像データが格納されているので、読みだしたとき正転するように、あらかじめ元の絵を上下反転しておく。(下記はWindows11のペイントで作成) ![キャプションを入力できます](https://camo.elchika.com/efca117f5afc97ec9d11a9098073f7c691e4bed0/687474703a2f2f73746f726167652e676f6f676c65617069732e636f6d2f656c6368696b612f76312f757365722f65343964323538632d663631612d346363642d393865302d3439323165303732366539302f63623430346239352d333136352d346563362d626436302d323234623566303066336165/) 1. モノクロビットファイルとしてファイル保存する。 ![キャプションを入力できます](https://camo.elchika.com/fd8b75037e0a2e21e4485bbefb871fa7104179a2/687474703a2f2f73746f726167652e676f6f676c65617069732e636f6d2f656c6368696b612f76312f757365722f65343964323538632d663631612d346363642d393865302d3439323165303732366539302f35613138373862332d623036652d346334622d616431642d616530386165336235353161/) 1. 下記のようにxxdコマンドでC言語コードに変換する。(WindowsであればWSLなどのLinux環境のインストールが必要) `$> xxd -c 16 -i ./android-icon.bmp > bitmap_data.h` 生成された配列データにはヘッダも含まれてるので、実際の画像データは、[ファイルサイズ] - [水平サイズ] x [垂直サイズ] の位置から正転された状態で格納されていることになる。また、1bit = 1pix に対応していて、0が黒、1が白に対応します。つまり、表示すると背景と前景が逆のイメージになるので注意。 1. 生成された「bitmap_data.h」ファイルを e_paper_test.ino と同じフォルダにコピーする。 # 表示している様子 表示されるまでは結構時間がかかります。 @[twitter](https://twitter.com/serebent/status/1663149270047002624) 電子ペーパーなので、もちろん電源を切っても表示したままです。 ![キャプションを入力できます](https://camo.elchika.com/189e254604bd488fbe7a41ebcae275e701a0fb1f/687474703a2f2f73746f726167652e676f6f676c65617069732e636f6d2f656c6368696b612f76312f757365722f65343964323538632d663631612d346363642d393865302d3439323165303732366539302f62396164346636612d613332342d346631312d613733652d303563333235346337663232/) # まとめ 試行錯誤しましたが、とりあえず、この電子ペーパーモジュールの使い方がわかりました。電子ペーパーは電源を切っても表示されるのがメリットです。書き換える時にだけにしか電力を消費しないのでいろいろな用途に使えそうです。 ++今回は、ライブラリを改変してやっと動かせましたが、もっとスマートな方法があれば誰か教えて。++