macsbug

Just another WordPress.com site

3D CUBE with ESP8266 and OLED

with 2 comments

ESP8266 + OLED で 3D CUBE を表示しました。              2016.01.16


ESP8266 80MHz( 左 )。________________ Arduino 16MHz( 右 )。
 

ESP8266 80MHz 立体視。裸眼立体視で CUBE が浮き上がって見えます。


準備:
ハード:
_ ESP8266 ( 例:ESP-WROOM-02 )
_ I2C OLED 128×64 Pixels :ebay:559円
_ USB Serial Converter:ebay:254円:前回ブログ参照
_ Schottky diode (1S4009):秋月で1個20円
_ 4.7uF Capacitor
_ 10KΩ Resistor
_ 配線:ESP8266_13 = OLED_SDA, ESP8266_14 = OLED_SCL。
_    1. ESP_RST を Capacitor, Diodeから DTR へ。
_    2. ESP_GPIO0 を Diode から DTR へ。

ソフト:OLED SSD1306 Library:Adafruit_GFX.hESP_Adafruit_SSD1306


メモ:
スケッチは、Colin Ord:Arduino – OLED Module with 3D demo sketch を参照しました。
_     Colin Ord Art Blog の Colin Ord氏に感謝。
SSD1306 Library:幾つかありますが、drawLine命令(線を引く)のある物を使用しました。
_         U8glib.h。SSD1306.h, SSD1306Ui.h。sd1306_i2c.h。
_         Library OLED_I2C:OLED_I2C.h
_         Adafruit_GFX.h,ESP_Adafruit_SSD1306.h。今回使用したライブラリー
1 degree=0.0174532:この精度で記載しないと 360度1回転でずれが出てきます。
delay(1); :スケッチ最後尾にあるこの命令は、画面の停止を防止します。
保護抵抗:GPIO0(PROG)とGND間(Diode Anode側[-]、RST(RESET)とGND間(4.7uF+側)
_    に 100Ωを入れた方が安全と思われます。
USB Serail Converter:5V/3.3V 動作が可能のもので セレクトは 3.3Vにしてあります。
自動書き込み:4.7uF+diode+DTR信号により スケッチの書き込みが自動的に行われます。
Arduio 16MHz と ESP8266 80MHz の速度差は、動画に示すようにかなりの差があります。
3D CUBEの動画: .mov を 「Total Video Converter Lite 」アプリで gif に変換しました。
_       (WordPress は .mov が使用不可の為)
OLEDの注意:VCCとGNDが逆配置のボードがあります。ebay, Aliexpress 共にそうです。


デイスプレーのライブラリーについて:
最も充実しているのは、Rinky-Dink Electronics です。ただし ここでの、ESP8266は非対応です。
ここには、Arduino、chipKit、Ti LaunchPad に対する多くのライブラリがあります。
Arduino には LCD、LED、TFT(UTFT)、OLED ライブラリーがあり便利です。
ちなみに、TFT Display でタッチ機能のあるものは、UTtouch を使用します。
今回使用した OLEDには Arduino UNO対応の OLED_I2C ライブラリーがあります。
_ サンプルは、3D_Cube、Bitmap、Brightness、Graph_Demo、NumberFonts、
_ Scrolling_Text、TinyFont_View、ViewFont があり参考になります。
_ 尚、UTFTのESP8266対応版は現在調査中です。


スケッチ:

//3D CUBE with ESP8266 and OLED :  by macsbug  2016.01.15
#include <Wire.h>                                          //
#include <Adafruit_GFX.h>                                  // OLED
#include <ESP_Adafruit_SSD1306.h>                          // OLED 
Adafruit_SSD1306 display(4);                               // OLED Reset
float r, x1, ya, z1, x2, y2, z2, x3, y3, z3;               //
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(13,14);                                       // I2C SDA,SCL
  display.begin(SSD1306_SWITCHCAPVCC,0x3c);                // I2C ADDRESS=3C
  display.clearDisplay();                                  // Clear the buffer
}                                                          //

void loop(){                                               //
 for (int a = 0; a <= 360; a = a + 3 ) {                   // 0 to 360 deg 3step
   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 Y
    ya = c[i][1];                                          //
    z1 = c[i][2] * cos(r) - c[i][0] * sin(r);              //
    x2 = x1;                                               //
    y2 = ya * cos(r) - z1 * sin(r);                        // rotate X
    z2 = ya * sin(r) + z1 * cos(r);                        //
    x3 = x2 * cos(r) - y2 * sin(r);                        // rotate Z
    y3 = x2 * sin(r) + y2 * cos(r);                        //
    z3 = z2;                                               //
    x3 = x3 + x ;                                          //
    y3 = y3 + y ;                                          //
    f[i][0] = x3;                                          // store new values
    f[i][1] = y3;                                          //
    f[i][2] = z3;                                          //
   }                                                       //
   display.clearDisplay();                                 // clear
   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();                                      // display
   delay(1);                                               //
 }                                                         //
}                                                          //

参考:
Adafruit_SSD1306
Adafruit SSD1306 OLED Library:拡大文字は汚い。抽画のLine(線)命令はある。
ESP_Adafruit_SSD1306:ESP8266用のAdafuruit SSD1306。
Adafruit GFX Graphics Library
Adafruit GFX Graphics Library.pdf
squix78/esp8266-oled-ssd1306:奇麗な拡大フォントを使用できる。抽画のLine(線)命令がない。
Colin Ord:Arduino – OLED Module with 3D demo sketch:Arduinoの3D Cubeデモ(u8glib)
u8glib:ESP8266 非対応。
u8glib:google:ESP8266 非対応。
OLED_I2C:ESP8266 非対応。

 


 

Written by macsbug

1月 15, 2016 @ 11:02 am

カテゴリー: ESP8266

コメント / トラックバック2件

Subscribe to comments with RSS.

  1. 図面ですが、vccでプルアップするところがGND接続になっているかとおもわれます。

    y

    1月 23, 2016 at 3:12 pm

    • ご指摘ありがとうございます。OLEDのVCCとGNDが逆になっていましたので修正しました。助かります。
      尚、販売されている OLED は、VCCとGNDが逆になっている2種類が存在しています。

      macsbug

      1月 23, 2016 at 6:12 pm


コメントを残す

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

WordPress.com ロゴ

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

Twitter 画像

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

Facebook の写真

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

Google+ フォト

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

%s と連携中

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