macsbug

Just another WordPress.com site

Using the WeMos I2C OLED 64×48

leave a comment »

WeMos の I2C OLED 64×48 Shield を D1 mini で使う方法。        2016.04.01

WeMos Electronic から OLED 64×48 I2C Shield が 3/16 に発売され3/31に到着しました。
OLEDのケースは アンテナ部を少し加工しますが D1 mini と OLED が入る大きさです。
D1 mini に OLED Shield を接続し 2つの方法を試しました。


準備:
1. D1 mini with TELEC
2. WeMos I2C OLED 64×48:$5.10
3. LED Shield Pin のハンダ付けは4つ:3.3V、GND、D2(SDA:4)、D1(SCL:5)。
4. Library:Install SparkFun_Micro_OLED_Arduino_Library:WeMosの記載。
5. Library:Modification of SSD1306 library to be used for I2C OLED:お薦め。


さあ、始めよう:
WeMos.cc の OLED Shiled には 「Install SparkFun_Micro_OLED_Arduino_Library」とある。
SparkFun_Micro_OLED_Arduino_Library は3つの問題がある。例:「MicroOLED_Cube」
1. 直ぐ動かない :MicroOLED_Cube は SPI, I2C 共用の為 I2C 用に設定する。
2. 動作が遅い  : Arduinoの速度でESP8266用に最適化されていない 。スケッチも遅い。
3. ピクセル座標軸:座標軸が異なる為に調整が必要。


1. 直ぐ動かない 件の解決方法:
_ 例:「MicroOLED_Cube」の使い方。
_ 29-36行目を以下の様に修正すると動きます。ただし動作は遅いです。

要約:
_ I2C の為、#include <SPI.h>、#define PIN_DC 8、#define PIN_CS 10、
_  MicroOLED oled(PIN_RESET, PIN_DC, PIN_CS); は使用しない。
_ I2C の為、MicroOLED oled(PIN_RESET, DC_JUMPER); // I2C declaration を使用する
_ #define PIN_RESET 9 は使用しないがLibraryで受け取る為 未使用のGPIOを割り振る。
_ メモ:MicroOLED oled(PIN_RESET, DC_JUMPER); 変数2個の場合 I2C動作になる。
_    MicroOLED用の名前は 「oled」になる。例:oled.begin();

#include <Wire.h>  // Include Wire if you're using I2C
//#include <SPI.h>  // Include SPI if you're using SPI
#include <SFE_MicroOLED.h>  // Include the SFE_MicroOLED library

//////////////////////////
// MicroOLED Definition //
//////////////////////////
#define PIN_RESET 13  // Connect RST to pin 9
//#define PIN_DC    8  // Connect DC to pin 8
//#define PIN_CS    10 // Connect CS to pin 10
#define DC_JUMPER 0

//////////////////////////////////
// MicroOLED Object Declaration //
//////////////////////////////////
//MicroOLED oled(PIN_RESET, PIN_DC, PIN_CS); // SPI declaration
MicroOLED oled(PIN_RESET, DC_JUMPER);    // I2C declaration

2. 動作が遅い 件の解決方法:
_ ESP8266 に最適化されたライブラリーを使用する。
_ squix78FWeinb氏作成のSSD1306 Library に drawLine命令を追加したものを使用する。
_ drawLine命令は Modification of SSD1306 library to be used for I2C OLED を参照の事。


3. ピクセル座標軸 が異なる件の解決方法:
_ SSD1306.h は128×64 のサイズの為の Library です。
_ Library を 64×48 用に改修するのは難題の為 スケッチの記述で済ましました。
_ 「flipScreenVertically 」という設定(縦方向を逆にする)で行います。
_  SSD1306 Library では、Flex wire 側が下になります。
_ 左上が 32,16 右下が 95,63 の座標になります。中央は 64,40 になります。
_ この座標軸の違いをスケッチ上で補正します。

スケッチ:

// 3D cube
// Add drawLine to SSD1306.h and SSD1306.cpp : 2016.03.16 macsbug 
// Add WeMos OLED 64x48                      : 2016.03.31 macsbug 
// https://github.com/squix78/esp8266-oled-ssd1306
// WeMos OLED : 64 x 48  : x, y    x, y : CTR = 64,40    //
// flipScreenVertically : 32,16---95,16                  //
// flipScreenVertically : 32,63---95,63                  //
#include <Wire.h>                                        // with mod SSD1306.cpp
#include "SSD1306.h"                                     // with mod SSD1306.h
extern "C" {
  #include "user_interface.h" 
}
SSD1306 display(0x3c,D2,D1);                             // SDA=GPIO04,SCL=5
float r, x1, z1, y2;                                     //
int f[8][2];                                             // Draw box
int c[8][3];                                             // Cube

void setup() {                                           //
  display.init();                                        // OLED
  display.setFont(ArialMT_Plain_10);                     //
  display.setTextAlignment(TEXT_ALIGN_LEFT);             //
  display.flipScreenVertically();                        // OLED
  display.displayOn();                                   // OLED
  display.clear();                                       // OLED
}                                                        //

void loop() {                                            //
  for ( int q =  5; q < 10; q = q + 2 ){ cube(q);} // 
  for ( int q = 10; q >  5; q = q - 2 ){ cube(q);}       //
}                                                        //

void cube(int q){                                        //
  int c[8][3] = {                                        // Cube
    {-q,-q, q},{q,-q, q},{q,q, q},{-q,q, q},             //
    {-q,-q,-q},{q,-q,-q},{q,q,-q},{-q,q,-q} };           //
  for (int a = 0; a <= 360; a = a + 3 ) {                // 0 to 360 degree
   for (int i = 0; i < 8; i++) {                         //
    r       = a * 0.0174531;                             // 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) + 64;  // X
    f[i][1] = x1      * sin(r) + y2      * cos(r) + 40;  // Y
    f[i][2] = c[i][1] * sin(r) + z1      * cos(r);       // Z
   }                                                     //
  display.clear();                                       //
  display.drawString(32,16,"3D Cube");                   //
  display.drawLine(f[0][0],f[0][1],f[1][0],f[1][1]);     //
  display.drawLine(f[1][0],f[1][1],f[2][0],f[2][1]);     //
  display.drawLine(f[2][0],f[2][1],f[3][0],f[3][1]);     //
  display.drawLine(f[3][0],f[3][1],f[0][0],f[0][1]);     //
  display.drawLine(f[4][0],f[4][1],f[5][0],f[5][1]);     //
  display.drawLine(f[5][0],f[5][1],f[6][0],f[6][1]);     //
  display.drawLine(f[6][0],f[6][1],f[7][0],f[7][1]);     //
  display.drawLine(f[7][0],f[7][1],f[4][0],f[4][1]);     //
  display.drawLine(f[0][0],f[0][1],f[4][0],f[4][1]);     //
  display.drawLine(f[1][0],f[1][1],f[5][0],f[5][1]);     //
  display.drawLine(f[2][0],f[2][1],f[6][0],f[6][1]);     //
  display.drawLine(f[3][0],f[3][1],f[7][0],f[7][1]);     //
  display.drawLine(f[1][0],f[1][1],f[3][0],f[3][1]);     // cross
  display.drawLine(f[0][0],f[0][1],f[2][0],f[2][1]);     // cross
  display.display();                                     //
  delay(1);                                              //
  }                                                      //
}                                                        //

参考:
OLED Shield:OLED Shield for WeMos D1 mini 0.66″ inch 64X48 IIC I2C $5.10
MicroPython Forumnew WEMOS Oled shield
sparkfun:Photon OLED Shield Hookup Guide
I2C OLED 128×64 SSD1306 in ESP8266


感想:
WeMosの完成度:全体的にナンバーワンですが OLED はスケッチのサンプルが不完全でした。
_ 多分論議をかもすと思います。WeMos.cc としてはフォローが失策だと思います。
ケースの大きさ:感心致しました。OLEDのケースがそのまま完成品を入れる事が出来るのです。
_ ほんのわずか大きくアンテナ部分を切る必要がありますが、USBコネクターの部分に
_ 穴を開けてピッタリに収まる姿は気持ちのいいものですし完成した姿になります。
_ ESP-12FをESP-WROOM-02 にした場合は アンテナ部分が減り まさにピッタリの
_ 大きさになります。WeMosでD1 miniのESP-WROOM-02 With TELEC版を作って欲しい。


Written by macsbug

4月 1, 2016 @ 8:19 am

カテゴリー: ESP8266

コメントを残す

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

WordPress.com ロゴ

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

Twitter 画像

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

Facebook の写真

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

Google+ フォト

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

%s と連携中

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