macsbug

Just another WordPress.com site

I2C OLED 128×64 SSD1306 in ESP8266

leave a comment »

ESP8266 で I2C OLED 128×64 SSD1306 を動かす方法の備忘録。       2016.03.20

ESP8266 で OLED を動かす代表的なライブラリは以下の2つがあります。今回は の方法です。
1. squix78:esp8266-oled-ssd1306 ( SSD1306 + SSD1306Ui ):squix78氏に感謝。

. cmmakerclub:ESP_Adafruit_SSD1306:cmmakerclubに感謝。
_  adafruit:Adafruit-GFX-Library:adafruitに感謝。



1. squix78氏 による SSD1306,SSD1306Ui ライブラリは多くの機能を持ち最高傑作です。
_  文字の奇麗さや表示方法により見やすい画面を作る事ができます。
_  使用したいフォントを作成して組み込むことができるウエブサイトは素晴らしいです。
_  文字の表示は X,Y の位置に表示する方式で表示レイアウトがしやすいです。
_  右揃え 左揃えの機能により位置合わせができる為 奇麗に表示できます。
_  WiFi受け待ち時の進行状況やページめくりの画像処理機能は見事です。
_  気になる点は「drawLine 命令」が無い為に 線を引く事ができません。
_  この件は ライブラリの解析を実施し drawLineルーチンを追加して動作しました。
_  詳細は Modification of SSD1306 library to be used for I2C OLED です。

2. ESP_Adafruit_SSD1306Adafruit-GFX Library は drawLine 命令で線を引く事が可能。
_  Arduino IDEのLibraryやBoardのバージョンにより 動く場合と動かない場合があります。
_  3D CUBE with ESP8266 and OLED(2016.01.16)の時点では動いていましたが 何かを
_  バージョンアップした為かコンパイルエラーが発生し使用できなくなりました。
_  恐らく最新のArduino IDE のバージョンで始められた方はエラーが出ると思われます。
_  使用する為に、備忘録も兼ねて解説を致します。
_  文字表示はX,Yの位置指定でなくプリント文方式で改行が行われます。
_  文字は拡大すると奇麗ではありません。フォント機能を調べる必要があります。
_  よって ライブラリーは用途によって使い分けしたほうが良いかと思います。


開発環境:
Mac OSX Mountain Lion
Arduino IDE 1.6.5_r5
_ Library Manager:Adafuruit GFX Library by Adafuruit Version 1.1.5 INSTALLED
_ Boards Manager:esp8266 by ESP8266 Community version 2.0.0 INSTALLED
LIbrary:ESP_Adafruit_SSD1306
LIbrary:Adafruit-GFX-Library
ESP8266(ESP-WROOM-02):ebayで1個435円(TELEC 技適済)。
I2C OLED 128×64 SSD1306:ebayで1個631円。


サンプルや今回のスケッチをコンパイルすると以下のエラーを表示します。
又、コンパイルエラー修正後には 128×32 の低い解像度で表示されます。

/Users/imac/Documents/Arduino/libraries/ESP_Adafruit_SSD1306/ESP_Adafruit_SSD1306.cpp: In member function ‘virtual void Adafruit_SSD1306::drawPixel(int16_t, int16_t, uint16_t)’:
/Users/imac/Documents/Arduino/libraries/ESP_Adafruit_SSD1306/ESP_Adafruit_SSD1306.cpp:215:14: error: ‘swap’ was not declared in this scope
swap(x, y);
^
/Users/imac/Documents/Arduino/libraries/ESP_Adafruit_SSD1306/ESP_Adafruit_SSD1306.cpp: In member function ‘virtual void Adafruit_SSD1306::drawFastHLine(int16_t, int16_t, int16_t, uint16_t)’:
/Users/imac/Documents/Arduino/libraries/ESP_Adafruit_SSD1306/ESP_Adafruit_SSD1306.cpp:558:16: error: ‘swap’ was not declared in this scope
swap(x, y);
^
/Users/imac/Documents/Arduino/libraries/ESP_Adafruit_SSD1306/ESP_Adafruit_SSD1306.cpp: In member function ‘virtual void Adafruit_SSD1306::drawFastVLine(int16_t, int16_t, int16_t, uint16_t)’:
/Users/imac/Documents/Arduino/libraries/ESP_Adafruit_SSD1306/ESP_Adafruit_SSD1306.cpp:626:16: error: ‘swap’ was not declared in this scope
swap(x, y);
^
コンパイル時にエラーが発生しました。


コンパイルエラーと解像度の修正は、ESP_Adafruit_SSD1306 への追加と
_ Adafruit-GFX-Library への変更を実施します。

1. コンパイルエラーを取り除く。理由:_swap_ の定義がされていない為。
_  Adafruit_GFX.h に以下を追加します。
_  場所は #define の定義してあるリストの12行目あたりに入れます。
_  #define swap(a, b) { int16_t t = a; a = b; b = t; }

2. OLED 128×64 を使用する為の変更。理由:デフォルトの設定は 128×32 の為。
_  ESP_Adafruit_SSD1306.h を以下のように変更します。
_  場所は リストの55行目あたりにあります。
_  #define SSD1306_128_64
_  // #define SSD1306_128_32
_  // #define SSD1306_96_16


メモ:
ESP_Adafruit_SSD1306 LIbrary:ESP8266用 の LIbrary で Adafruit_SSD1306 LIbrary を
_ ESP8266用に最適化したものです。Adafruit_SSD1306 LIbrary でも動作しますが
_ 速度は Arduino と同じく遅いです。ESP8266に最適化された ESP_Adafruit_SSD1306
_ は Arduinoの5倍の速度で動き ESP8266のパワーを発揮する事ができます。


OLED情報:OLEDには以下の3種類がある。
左:GNDが左端にある。中央:VCCが左端にある。右:VCCが左端にある赤い基板。
このOLEDで注意する所は、I2Cの配列が規格化されていないのも原因ですが、
端子の配列が2種類あり、正面左側の端子がVCCかGNDになっている。
交換する時に電源が逆になる場合があるので注意する事。
業者によっては
2種類の画像が同時に掲載されており どちらがくるか到着するまで解らない。
他に発光色として白と黄色+青(黄色は一番上の1行分)がある。

ebayで1個631円程度。業者としては、ebayの「gc_supremarket」という所が
画像通りの「VCCが左端にある」ものを出荷し一番安全である。

赤いタイプに注意:赤いタイプは他にも種類があるようです。
販売先の画面には、Power supply voltage: 2.8-5.0V DC とかかれている。
しかし、LDOのU2が無く3.3V以上はレギュレートされないと思われます。
その為 想像ですが5Vを接続した場合は破損する可能性があります。
左:16個の部品が使用されている。(U2,D1,R1,5,6,7,RDRS,C1,2,3,4,5,6,7,8,9)
右:10個の部品が使用されている。(R1,2,3,4,C1,2,3,4,5,6):U2,D1,ADRS なし。


感想:
よくある何かの後に起きるトラブル:ライブラリーのアップデートか何かの後に スケッチが
_ コンパイルできなくなり調べました私の脳味噌では解るまで結構時間を使いましたので
_ 自分の備忘録として書き置きしました。又、友人の所でOLEDが不明なエラーの為に
_ 動かす事が出来なかった件がこの方法で動かす事が出来る様になります。
ディスプレー環境の現状:ESP8266における見やすいディスプレーはこのOLED位しか無い。
_ Arduino IDEで開発できるTFTは1件ほどしか無く環境が整っていない。
delay(1):スケッチの終わりにある delay(1)は 必要です。これが無いとグラフックが途中で
_ 停止します。この方法は理由が解らず入れていますので対症療法的です。
_ ESP.wdtDisable(); では効果がありません。


スケッチ:以下のスケッチが動けば幸いです。OLEDのチェックにも使えます。


// 3D Cube in The ESP8266 and I2C OLED 128x64 SSD1306
// There is change in the two libraries
// 1:ESP_Adafruit_SSD1306.h Libraries:
//   https://github.com/cmmakerclub/ESP_Adafruit_SSD1306
//   change : #define SSD1306_128_64
// 2:Adafruit_GFX.h:
//   https://github.com/adafruit/Adafruit-GFX-Library
//   add to : #define swap(a, b) { int16_t t = a; a = b; b = t; }
// Library Manager:Adafuruit GFX Library by Adafuruit Version 1.1.5 INSTALLED
// Boards  Manager:esp8266 by ESP8266 Community version 2.0.0 INSTALLED
// I2C : SDA=GPIO04,SCL=GPIO05
#include <SPI.h>                                            //
#include <Wire.h>                                           //
#include <Adafruit_GFX.h>                                   // with mod
#include <ESP_Adafruit_SSD1306.h>                           // with mod
Adafruit_SSD1306 display(4);                                // OLED Reset
float r, x1, z1, y2;                                        //
int f[8][2];                                                // Draw box
int x = 64;                                                 // 64=128/2
int y = 32;                                                 // 32= 64/2
int c[8][3] = {                                             // Cube
    {-20,-20, 20},{20,-20, 20},{20,20, 20},{-20,20, 20},    //
    {-20,-20,-20},{20,-20,-20},{20,20,-20},{-20,20,-20} };  //

void setup() {                                              //
  Wire.begin(4,5);                                          // SDA=GPIO04,SCL=5
  display.begin(SSD1306_SWITCHCAPVCC, 0x3c);                // 0x78:011110+SA0+RW 
  display.clearDisplay();                                   //
  display.display();                                        //
}                                                           //

void loop() {                                               //
  for (int a = 0; a <= 360; a = a + 3 ) {                   // 0 to 360 degree
   for (int i = 0; i < 8; i++) {                            //
    r       = a * 0.0174532;                                // 1 degree
    x1      = c[i][2] * sin(r) + c[i][0] * cos(r);          // rotate X
    z1      = c[i][2] * cos(r) - c[i][0] * sin(r);          // rotate Z                                            //
    y2      = c[i][1] * cos(r) - z1      * sin(r);          // rotate Y
    f[i][0] = x1      * cos(r) - y2      * sin(r)  + x;     // X
    f[i][1] = x1      * sin(r) + y2      * cos(r)  + y;     // Y
    f[i][2] = c[i][1] * sin(r) + z1      * cos(r);          // Z
   }                                                        //
   display.clearDisplay();                                  //
   display.drawLine(f[0][0],f[0][1],f[1][0],f[1][1],WHITE); //
   display.drawLine(f[1][0],f[1][1],f[2][0],f[2][1],WHITE); //
   display.drawLine(f[2][0],f[2][1],f[3][0],f[3][1],WHITE); //
   display.drawLine(f[3][0],f[3][1],f[0][0],f[0][1],WHITE); //
   display.drawLine(f[4][0],f[4][1],f[5][0],f[5][1],WHITE); //
   display.drawLine(f[5][0],f[5][1],f[6][0],f[6][1],WHITE); //
   display.drawLine(f[6][0],f[6][1],f[7][0],f[7][1],WHITE); //
   display.drawLine(f[7][0],f[7][1],f[4][0],f[4][1],WHITE); //
   display.drawLine(f[0][0],f[0][1],f[4][0],f[4][1],WHITE); //
   display.drawLine(f[1][0],f[1][1],f[5][0],f[5][1],WHITE); //
   display.drawLine(f[2][0],f[2][1],f[6][0],f[6][1],WHITE); //
   display.drawLine(f[3][0],f[3][1],f[7][0],f[7][1],WHITE); //
   display.drawLine(f[1][0],f[1][1],f[3][0],f[3][1],WHITE); // cross
   display.drawLine(f[0][0],f[0][1],f[2][0],f[2][1],WHITE); // cross
   display.display();                                       //
  }                                                         //
  delay(1);                                                 //
}                                                           //

Written by macsbug

3月 19, 2016 @ 2:52 am

カテゴリー: ESP8266

コメントを残す

以下に詳細を記入するか、アイコンをクリックしてログインしてください。

WordPress.com ロゴ

WordPress.com アカウントを使ってコメントしています。 ログアウト / 変更 )

Twitter 画像

Twitter アカウントを使ってコメントしています。 ログアウト / 変更 )

Facebook の写真

Facebook アカウントを使ってコメントしています。 ログアウト / 変更 )

Google+ フォト

Google+ アカウントを使ってコメントしています。 ログアウト / 変更 )

%s と連携中

%d人のブロガーが「いいね」をつけました。