以下の記事で、Flashサイズを確認してください。
ESP-WROOM-02 ( ESP8266 ) チップ・メモリ・MACアドレス情報確認方法
(2018/06/18)
Arduino core for the ESP8266 ver 2.4.1
では、OTAでなくても USBシリアルで 4M/3M SPIFFS アップロード可能になりました。
試してみて下さい。
以下、古い記事です。
(2018/06/18)
こんばんは。
以前の記事から発展させて、Adafruit OLED Breakout Board – 16-bit Color 1.5″ w/microSD holder を ESPr Developer ( ESP-WROOM-02 ( ESP8266 )) で動かすためのArduino IDE用ライブラリを作ってみました。
Adafruit社標準のライブラリでは日本語漢字フォントを表示させることが難しいため、作ってみた次第です。
とりあえず、こんな感じのスケッチを動かしてみました。
動画をご覧ください。
いかがでしょうか。
スイッチサイエンスさんの ESPr Developer ( ESP-WROOM-02 ) にSPIFFSアップローダーで保存した東雲フォント(フリーフォント)と 文字コード変換テーブルファイルを読み込んで、日本語漢字フォントを表示させてます。
半角、全角混在OKです。標準的なJIS記号もOKです。16×16ピクセルです。
さらに倍角の32×32ドット表示もさせてます。
それを8bit毎に色を変え、RGBのコントラストを自動で変化させて、さらにSSD1351のRAMスクロールも実行させてます。
この有機EL ( OLED )は自由にピクセル毎に色設定ができるので、いろいろなことができます。
ピクセルを描くときには必ずR(赤)、G(緑)、B(青)を設定しなければならないので、色変えがとても自由です。
また、OLED SSD1306のようにページという概念のハード的制約が無いので、さらに自由にピクセルを指定できます。
さすが、値段が高いだけあって、優れた有機EL ( OLED )です。
また、別件ですが、UTF8 to Shift_JISライブラリと東雲フォントライブラリもバージョンアップしました。両方ともBeta 1.3 です。
SPIFFSファイルのオープンクローズを一文字ずつ実行するのではなく、一括して文字列を抽出した後、ファイルをクローズするようにしました。
これは、ツイッターでVisyeii さんから教わった方式を使わせていただきました。
また、関数の引数で、Fileハンドルをそのまま使うことができるということは目から鱗でしたので、使わせていただきました。Visyeiiさんに感謝です。m_ _m
これにより、処理速度が少々早くなったので、以下の動画をご覧ください。
一瞬で終わってしまいますが、左が古いバージョンで、右がver1.3です。
表示速度を比較してみてください。
いかがでしょうか?
劇的に速くすることはできませんでしたが、私的にはこれでも結構な進歩です。
また、東雲フォントライブラリでは、JIS第2水準のアドレスが誤っていたので修正しました。
※新しいバージョンのライブラリをインストールする前に、必ず古いライブラリはフォルダごと事前に削除しておいてください。
以上です。
話は戻りまして、では、OLED_SSD1351ライブラリの使い方を説明していきます。
1.準備するもの
以前の記事で紹介しておりますが、念のため紹介しておきます。
●Adafruit OLED Breakout Board – 16-bit Color 1.5″ w/microSD holder
スイッチサイエンスさんウェブショップにあります。
https://www.switch-science.com/catalog/1754/
1.5インチの128×128ピクセルのものですので、1.27インチのものと間違えないようにしてください。
microSDカードスロット付きですので、いろいろな用途に使えそうです。
グラフィックも16bitカラー設定で、とても高機能な有機EL ( OLED )ですので、やはり高価になるのは仕方のないところです。
こちらの組み立て方はこちらの記事をご覧ください。
●ESPr Developer (ESP-WROOM-02(ESP8266)開発ボード)
Amazon.co.jp
当ブログで何度も紹介しておりますが、Arduino IDEで開発ができる優れものWi-Fiボードです。これを使ってしまうと、もうArduino UNOには戻れません。
この使い方の詳細はこちらの記事をご覧ください。
●その他
ブレッドボード、ジャンパーワイヤー、ピンヘッダ等・・・。
2.接続する
接続方法は以前の記事とまったく同じです。
GPIO #15 —- OC ( OLED CS )
GPIO #14 —- CL ( SCLK )
GPIO #13 —- SI ( MOSI )
GPIO #12 —- SO ( MISO )
GPIO # 4 —- DC ( Data/Command )
GPIO # 5 —- R ( Reset )
3.Arduino IDE、ESP8266ボード、SPIFFSファイルシステムアップローダーをインストールしておく
Arduino IDE は1.6.9 が推奨です。
Arduino IDE は1.8.5以上で動作します。
それにボードマネージャーで ESP8266ボードをインストールする必要があります。
そのインストール方法はこちらのページをご覧ください。
Arduino core for the ESP8266 は ver 2.4.1 で動作します。
SPIFFSファイルシステムはESP-WROOM-02にSPIフラッシュが入っており、それにフォントファイルなどを保存しておけるシステムです。そのArduino IDEプラグインがSPIFFSファイルシステムアップローダーです。
そのインストール方法はこちらのページをご覧ください。
4.自作ライブラリをインストール
UTF to Shift_JISライブラリと東雲フォントライブラリのインストール方法はこちらのページをご覧ください。
※古いバージョンのライブラリがある場合は、必ず古いライブラリのインストールしてあるフォルダごと事前に削除しておいてください。その後に新しいバージョンのライブラリをインストールしてください。
OLED_SSD1351ライブラリはAdafruit社の標準ライブラリを、shiitakeoさんが改変されたものを参考にしました。 ある程度Adafruit社のライブラリも参考にしましたので、そのBSDライセンス文も表記しています。
BSD ライセンスは無保証であること、著作者を表示すること、ライセンス文を掲載することを守れば、改変や再配布OKというものです。ですから、これを改変してMITライセンスとしました。
これも同じく無保証、著作者表示を守れば改変、再配布OKです。
では、この自作ライブラリはGitHubのこちらのページにあります。
以下、Windowsの場合で説明します。
ページを開いたら、以下の図のようなところをクリックします。
そうすると小さいウィンドウが出てきますので下図の様にDownlodad ZIPをクリック
すると、下図の様にWindows10ならばダウンロードフォルダにダウンロードされます。
次に、Arduino IDEを開き、下図の様に「ZIP形式のライブラリをインストール」をクリックして、ZIPファイルのままライブラリをインストールする機能を使います。
そうしたら、先ほどダウンロードしたフォルダを選択します。
次に先ほどダウンロードしたZIPファイルを選択して開きます。
すると、ライブラリインストール完了です。
確かめるために下図のようにメニューを開いていって、OLED_SSD1351 とあればインストール完了です。
※ここまでで、一旦 Arduino IDE を閉じて再起動してください!
これをしないとインストールされませんのでご注意ください。
5.サンプルスケッチを開き、SPIFFSアップローダーでフラッシュにファイルを書き込んでおく
以下の記事で、Flashサイズを確認してください。
ESP-WROOM-02 ( ESP8266 ) チップ・メモリ・MACアドレス情報確認方法
(2018/06/18)
Arduino core for the ESP8266 ver 2.4.1
では、OTAでなくても USBシリアルで 4M/3M SPIFFS アップロード可能になりました。
試してみて下さい。
以下、古い記事です。
(2018/06/18)
Arduino IDE を開き、下図の様にサンプルスケッチのSSD1351_font_display_sampleを開きます。
開いたら、一旦、名前を付けて保存しておきます。
次に、下図の様にこのスケッチのフォルダを開きます。
その中のdataフォルダを開いて下さい。
そこには以下の3つのファイルがあるはずです。
shnmk16.bdf (全角東雲フォントファイル)
Shnm8x16r.bdf (半角東雲フォントファイル)
Utf8Sjis.tbl ( UTF-8 → Shift_JIS 文字コード変換テーブル )
これを SPIFFS ファイルシステムアップローダーを使って ESP-WROOM-02 ( ESP8266 )のフラッシュへアップロードします。
合計で1Mbを超えてますので、4M ( 3M SPIFFS )モードでアップロードする必要があります。
これは、シリアル USB ポートではアップロードできない場合がありますので、その場合は OTA機能を使って、外部ルーター経由でWi-Fiアップロードする必要があります。
その方法はこちらのページを参照してください。汎用プログラミング言語pythonをインストールする必要があります。いろいろハマリどころがありますので注意してください。
6.サンプルスケッチについて
では、サンプルスケッチ
SSD1351_font_display_sample.ino
を解説します。
【ソースコード】 (※無保証 ※PCの場合、ダブルクリックすればコード全体を選択できます)
/* Adafruit OLED Breakout Board – 16-bit Color 1.5″ w/microSD holder を使用するためのサンプルスケッチ * 日本語専用です。 * UTF8toSJISライブラリ、ShinonomeFONTreadライブラリを事前にインストールする必要があります。 * 事前にSPIFFSファイルシステムアップローダーでフォントファイルをフラッシュにアップロードする必要があります。 * 詳しくは https://wwww.mgo-tec.com */ #include <UTF8toSJIS.h> #include <ShinonomeFONTread.h> #include <OLED_SSD1351.h> UTF8toSJIS u8ts; ShinonomeFONTread SFR; OLED_SSD1351 ssd1351; const char* UTF8SJIS_file = "/Utf8Sjis.tbl"; //UTF8 Shift_JIS 変換テーブルファイル名を記載しておく const char* ZenkakuFontFile = "/shnmk16.bdf"; //全角フォントファイル名を定義 const char* HalfFontFile = "/shnm8x16r.bdf"; //半角フォントファイル名を定義 char* cc[8] = {"フリー日本語漢字","東雲(シノノメ)フォント★","16x16ドット です。","全角-半角混在OK!","半角カタカナもOK!!","16bit カラー★♪","倍角表示"}; uint8_t sj_txt[32]; //Shift_JISコード uint16_t sj_length; //Shift_JISコードの長さ uint8_t font_buf[32][16]; //東雲フォントデータ const uint8_t sclk=14; const uint8_t mosi = 13; const uint8_t cs = 15; const uint8_t DCpin = 4; const uint8_t RSTpin = 5; uint8_t R_ctr = 255, G_ctr = 170, B_ctr = 85; uint8_t R_ud = 0, G_ud = 0, B_ud = 0; uint8_t scl = 0; uint32_t sclTime = 0; uint32_t contrastTime = 0; void setup() { Serial.begin(115200); ssd1351.SSD1351_Init(sclk, mosi, cs, DCpin, RSTpin); //SSD1351を初期化 delay(300); ssd1351.SSD1351_BlackOut(); //黒画面出力 uint8_t Red, Green, Blue; //Max Red = 31, Max Green = 63, MaxBlue = 31 int8_t i,j; int8_t ci=0; for(j=0; j<7; j++){ u8ts.UTF8_to_SJIS_str_cnv(UTF8SJIS_file, cc[j], sj_txt, &sj_length); //UTF8コードをShift_JISコードに変換 SFR.SjisToShinonome16FontRead_ALL(ZenkakuFontFile, HalfFontFile, 0, 0, sj_txt, sj_length, font_buf); //S_JISコードから東雲フォント抽出 switch(j){ case 0: Red = 31, Green = 0, Blue = 0; break; case 1: Red = 0, Green = 63, Blue = 0; break; case 2: Red = 0, Green = 0, Blue = 31; break; case 3: Red = 31, Green = 63, Blue = 31; break; } if(j < 4){ //文字列を1列一気に表示させる ssd1351.SSD1351_8x16_DisplayOut_1col_LtoR(0, j*16, Red, Green, Blue, sj_length, font_buf); }else{ for(i=0; i<16; i++){ if(ci<2){ Red = 31; Green = 0; Blue = 0; ci++; }else if(ci<4){ Red = 0; Green = 63; Blue = 0; ci++; }else if(ci<6){ Red = 0; Green = 0; Blue = 31; ci++; }else if(ci<8){ Red = 31; Green = 63; Blue = 0; ci++; }else if(ci<10){ Red = 0; Green = 63; Blue = 31; ci++; }else if(ci<12){ Red = 31; Green = 0; Blue = 31; ci = 0; } if(j < 6 ){ //半角一文字ずつ表示させる ssd1351.SSD1351_8x16_DisplayOut(i*8, j*16, Red, Green, Blue, font_buf[i]); }else{ if(i > 7) break; //2倍角フォント表示 ssd1351.SSD1351_8x16_2x2_DisplayOut(i*16, 96, Red, Green, Blue, font_buf[i]); } } } } delay(2000); //RAM_Hscrolleはメインloop外でもRAM側で勝手にスクロールする ssd1351.SSD1351_RAM_Hscrolle(0, 128, 0, 1); //(uint8_t StartY, uint8_t EndY, uint8_t Interval, uint8_t direction) sclTime = millis(); contrastTime = millis(); } void loop() { if(millis()-contrastTime > 5){ switch(R_ctr){ case 254: R_ud = 1; break; case 1: R_ud =0; break; } switch(G_ctr){ case 254: G_ud = 1; break; case 1: G_ud =0; break; } switch(B_ctr){ case 254: B_ud = 1; break; case 1: B_ud =0; break; } if(R_ud == 1){ R_ctr--; }else{ R_ctr++; } if(G_ud == 1){ G_ctr--; }else{ G_ctr++; } if(B_ud == 1){ B_ctr--; }else{ B_ctr++; } ssd1351.SSD1351_RGBcontrast(R_ctr, G_ctr, B_ctr);//OLEDのコントラスト調整関数 contrastTime = millis(); } if(millis()-sclTime > 100){ if(scl==127) scl=0; //RAM_VscrolleはHscrolleと異なり、自動ではスクロールしないので動作プログラムを組む必要がある。 ssd1351.SSD1351_RAM_Vscrolle(scl++, 1); //(uint8_t StartY, uint8_t OffsetY) sclTime = millis(); } }
●9行:
このライブラリのインクルードです。
●11-13行:
ライブラリのクラス名定義です。ここでは好きな名前で定義できます。
●15-17行:
SPIFFSファイルシステム中のフォントファイルを指定します。
ここでは必ずスラッシュ “/” をつけてください。
●19行:
ここで、文字列を初期化します。
このOLEDは一行に8文字、2倍角ならば4文字入ります。
全角半角混在OKです。
ただ、JIS13区の丸囲み文字などの特殊文字は表示できません。そもそも東雲フォントに13区文字はありません。
●25-29行:
ここでESP-WROOM-02 ( ESP8266 )のSPI通信のためのGPIOピンを設定します。
●31-35行:
ここは、RGBのコントラスト自動色変えの変数定義です。
●39行:
自作ライブラリのクラスで、SSD1351の初期化をしています。
●41行:
自作ライブラリのクラスで、黒画面を出力します。
●48行:
Windowsの場合のArduino IDEスケッチの文字コードはUTF-8 ですので、文字列をShift_JISコードへ一括変換します。ここで変換テーブルファイルが必要になります。
このライブラリの詳細はこちらのページを参照してください。
●49行:
Shift_JISコードから8×16ドットずつ東雲フォントファイルを抽出する関数です。
これは、東雲フォントファイルライブラリ beta ver 1.3 から新たに加わった関数です。
文字列を一括してビット列に変換しますので、処理速度は早くなったのですが、メモリーを食います。
●51-64行:
お遊びで、文字列1行毎に色を変えてます。
Red(赤)とBlue(青)の最大値は10進数で31です。
Green(緑)だけはなぜか最大値が63ですので、ちょっと面倒です。
●67行:
ここで、今回の自作ライブラリSSD1351へビット列を1列分だけ一括出力します。文字列の左から右方向へ出力します。
座標は最初のピクセル書き込み位置を指定します。
Y座標(row)位置を j*16 というように、1列表示したら、16ピクセルずつずらしています。
●69-88行:
ここもお遊びで、半角1文字ずつ色変えしてます。
半角ごとだと、全角の場合半分別の色になってしまいますが、今回はお遊びですので、ご容赦ください。
●91行:
これは半角1文字ずつSSD1351へ出力する関数です。
X座標位置(column)を i*8
Y座標位置(row)をj*16
というようにピクセル位置を指定してます。
●95行:
16×16ピクセルの東雲フォントを2倍角で表示させる関数です。このOLEDでは4文字しか出力できませんが、視認性抜群です。
半角1文字分ずつ2倍角で表示しますので、半角1文字について16×32ピクセルの領域が必要です。それにより描画の最初の位置を計算してください。
●102行:
SSD1351のRAM側で自動水平スクロールする関数です。これは一度指定してしまうと解除できません。メインloop関数が止まっても延々とスクロールし続けます。
垂直位置しか指定できませんので、0~128ピクセル分、つまり全画面スクロールします。
インターバルの数値を増やすとスクロールが遅くなります。ゼロでもあまり早くありません。
4番目の引数はスクロール方向を指定します。
direction 0 R—>L
1 L—>R
●109-147行:
ここもお遊びで、一定間隔でRGBのコントラストを変化させてます。
●148行:
SSD1351のRGBのコントラストを指定する関数です。
●152-157行:
縦方向のスクロールはその都度画面をオフセット設定することによって、スクロールしているように見せます。
155行でその縦方向オフセット値を指定してます。
これは、横方向RAM自動スクロールのようにはできません。
プログラムを組んでスクロールさせます。
以上です。
いかがでしょうか? ちゃんと動作しましたでしょうか。
もし、不明な点がありましたら、コメント等でご連絡ください。
次はWebから取得した文字を表示させてみたいと思います。
ではまた・・・。
Amazon.co.jp 当ブログのおすすめ
コメント
mgo-tec 様
mgo-tec さんのテキストの取り組みが日課となっております。
先日、「Adafruit 16-bit フルカラー OLED をESPr Developer で動かしてみた」に成功し、本テキストに取り組んでいますがなかなか成功に至りません。
テキスト通りに、OTA アップロードを試みていますが、SPIFFS Upload failed! のメッセージとなってしまいます。
Arduino : 1.6.12 (Windows 10), ボード : “Generic ESP8266 Module, 160 MHz, 80MHz, QIO, 921600, 4M (3M SPIFFS), nodemcu, Disabled, None”
[SPIFFS] data : C:\Users\*****\Documents\Arduino\BasicOTA\data
[SPIFFS] size : 3052
[SPIFFS] page : 256
[SPIFFS} block : 8192
/shnm8x16r.bdf
/shnmk16.bdf
/Utf8Sjis.tbl
[SPIFFS] upload : C:\Users\*****\AppData\Local\Temp\arduino_build_63556/BasicOTA.spiffs.bin
[SPIFFS] IP : 192.168.*.*
17:49:51 [ERROR]: No response from device
SPIFFS Upload failed!
アップロードができていると思い、コンパイル書き込みをすると、書き込み完了となるのですが画面の表示がありません。
スケッチの書込みは、推奨の Arduino 1.6.9 を使用しています。
お忙しいところ恐縮ですが、解決の糸口をアドバイスいただけると幸いです。
juchangさん
いつもブログ記事を試していただき、ありがとうございます。
この記事も2年位前に書いたもので、最新版では試していませんでした。
古い記事は、誤り以外は基本的にその時点のままで修正しておりませんのでご了承ください。
私は、旧版のフラッシュ4MB の ESPr Developer で、以下の環境で試してみました。
ESPr Developer ( Flash 4M )
Arduino IDE 1.8.5
Arduino core for the ESP8266 2.4.1
この場合は、OTA アップロードせずとも、USBシリアルで、アップロード速度921600bpsでも問題無くアップロードできました。
まず、お聞きしたいのは、
●ESPr Developer ( ESP-WROOM-02 )のFlashサイズは何MBでしょうか?
この記事を書いた当初の ESP-WROOM-02 のFlashサイズは4MBしか無かったのですが、今は2MBが流通してしまっているようです。
その場合アップロードできません。
分からない場合は以下の記事で調べてみて下さい。
ESP-WROOM-02 ( ESP8266 ) チップ・メモリ・MACアドレス情報確認方法
もし、4MB ならば、上記の様に最新版にして、USBシリアルでアップロードしてください。
(※SPIFFSアップロードは必ずシリアルモニタを閉じておいてください)
2MB の場合は、SPIFFSを使うことができませんので、micro SDHCカードからフォントを読み込むスケッチに変えるしかありません。
以上、ご確認ください。
mgo-tec 様
お手数をおかけします。
Flash サイズは、手持ちの3個とも 2MB でした。
SPIFFS は使えないとのこと、micro SDHC カードからフォントを読み込むスケッチを検討してみます。
やっぱりそうでしたか。
2MBだと少なすぎますよね。
おそらくコスト的な問題だと思いますが、それにしてもこれはあんまりですよね。
私個人的な意見ですが、ESP8266 ではメモリ容量的に厳しいものがあるので、ESP32 に移行することを強くお勧めします。
これから先のESP8266用のスケッチはメモリがギリギリで、ライブラリも更新され、もはや動作しない可能性があります。
当方では、ESP32に専念していて、ESP8266関連のスケッチを保守するのはとても無理です。
ですから、今後スケッチを直すことはできません。
申し訳ございません。
ただ、動作しないものはご連絡いただけると助かります。
その場合は記事を削除するなり、注意文を出すなどの対処をする予定です。
なにとぞよろしくお願いいたします。
m(_ _)m
mgo-tec 様
本テキストの動作確認!
micro SDカードからフォントを読み込むスケッチにチャレンジしていたのですがなかなかうまくいかず、と言って、やっと手に入れた SSD1351 の使用をあきらめるのも辛いし…。
たまたま、秋月電子で ESP-WROOM-02 (4MB) を販売しているのを知り、2MB との取り換えを行ってみました。
1個目は、2MB の取り外しに失敗しダメにしてしまいましたが、2個目で取り換えに成功し、USB シリアルでのアップロードもうまくいきました。
早速、スケッチをコンパイル書き込みすると、動画通りの表示となりました。
的確なアドバイスのお陰です、ありがとうございます。
SSD1351 は、画面が大きく色も綺麗で大変気に入っています。
機会がありましたら是非、ESP32 との組み合わせの投稿をお願いいたします。
juchangさん
動作確認していただいて、いつも申し訳ありません。
ありがとうございました。
m(_ _)m
私の方は、老眼もどんどん進行するし、身体あちこち痛いし、パソコンのし過ぎでしょうか?
歳にはかなわないなぁ、とつくづく思っている今日この頃です。
せっかく記事をご覧になって試していただいているのに、記事の保守は読者の皆さまからのコメント投稿に頼らざるを得ない状況で、ホントに申し訳ございません。
ブログを初めて、今頃、こういうジャンルの記事の保守の難しさを感じています。
技術や仕様は日進月歩で、すぐに古くなってしまいます。
ただ、私自身もこういうジャンルのブログを参照して、過去の記事で動作しなかったことが何度もありました。
でも、その情報を利用して、今更新されている内容に入れ替えたら動作したこともありました。
ですから、過去の記事は意外と役に立つ場合もあると考えております。
そういうことで、今後動かないこともあって、何かとご迷惑をおかけしますが、ご了承のほど当ブログを何卒よろしくお願いいたします。
m(_ _)m
そういえば、2MB の ESP-WROOM-02 を4MB に換装されたそうで、それはさぞかし大変だったと思います。
私はとてもそんな気は起きず、放置しております・・・。
高価な SSD1351 が動いてほんとに良かったです。
こういうことを聞いてしまうと、私自身も SSD1351 を ESP32 で動かせるようにしておかないとと思いました。
ちょっと今は取組中の課題が山積しているので、しばらく経ったらやってみようと思います。
いつもいつもご迷惑おかけしておりますので、しばらくお待ちください。
m(_ _)m