2017年9月10日日曜日

HiLetogo 0.9" I2C OLED 128X32をu8g2で使ってみる。

久々にu8glibのWikiページを見たら、「今後開発しないのでu8g2を使うよう」に書いてあったので、試してみた。

u8gとu8g2の違いはhttps://github.com/olikraus/u8g2/wiki/u8gvsu8g2

Improvements
  • Full "RAM" memory buffer without picture loop
  • Arduino SPI and TWI Libraries instead of custom code
  • Support for Unicode and UTF-8
  • Faster compilation
  • High speed text only API (U8x8)
  • Hardware 180 degree rotation for some displays available
  • Tested with AVR, SAM and ESP8266 boards
とある。ページ単位の書き込みをしなくてよくなったようだ。(以前のようにdo while() で描画する方法も残されている)

ライブラリのArduinoへのインストールはhttps://github.com/olikraus/u8g2/wiki/u8g2installにキャプチャ画像入で紹介されているのでその通りにすればインストールできた。

exampleは
  • full_buffer フルバッファで1回で書込み。
  • games おまけ
  • page_buffer ページ単位で書き込み。
  • u8x8 8x8ドットの文字にのみ対応した軽量版
に分かれている。u8x8はHiLetgoのOLEDには小さすぎるかな~

見やすいフォントをさがしてみる。


Arduinoのスケッチ
<HiLetgo_IIC_OLED_SSD1306_128x32_u8g2_F_FontTest.ino>

#include <Arduino.h>
#include <U8g2lib.h>
#include <Wire.h>

U8G2_SSD1306_128X32_UNIVISION_F_HW_I2C u8g2(U8G2_R0, /* reset=*/ U8X8_PIN_NONE);  // Adafruit ESP8266/32u4/ARM Boards + FeatherWing OLED

void setup(void) {
  u8g2.begin();
}

#define RULER_STR "ABCDEFGHI012345678901234567890"

void loop(void) {
  u8g2.clearBuffer();                   // clear the internal memory
  u8g2.setFont(u8g2_font_8x13_tf);  // choose a suitable font  
  u8g2.drawStr(0,10,RULER_STR); // write something to the internal memory
  u8g2.drawStr(0,21,RULER_STR);  // write something to the internal memory
  u8g2.drawStr(0,32,RULER_STR);  // write something to the internal memory
  u8g2.sendBuffer();                    // transfer internal memory to the display
  delay(1000);

  u8g2.setDrawColor(1);
  u8g2.drawBox(0, 0, 128, 32);
  u8g2.sendBuffer();
  delay(1000);  
}

u8g2のFull Pageバージョンを使ってみた。

クラスは

U8G2_SSD1306_128X32_UNIVISION_F_HW_I2C u8g2(U8G2_R0, /* reset=*/ U8X8_PIN_NONE);  // Adafruit ESP8266/32u4/ARM Boards + FeatherWing OLED

を指定すれば動作した。「UNIVISON」という名前が何を意味するのかよくわからないですが(^q^;

スケッチはカットアンドトライで見やすいフォントを探したもの。loop()内のdrawBox()は画面のフルサイズで四角を書いて表示領域を確認した。このOLEDの表示域は少し上に偏っているようだ。


「u8g2_font_8x13_tf」を指定すると昔のパソコンっぽい感じのフォントで、16桁3行表示できる。


I2Cの通信状態



ch1:SDA ch2:SCL

デフォルトでFast Mode(400kHz)で動作している。

波形がかなりなまっているので、モジュール上でプルアップされている(おそらく)4.7kΩと並列になるようにブレッドボード上でも4.7kΩのRでプルアップした。

4.7kΩ//4.7kΩ = 2.35kΩ相当のプルアップになる。



ch1:SDA ch2:SCL

波形はきれいになる(←ノイズ等に強くなり誤動作が減る)が、電流が多く流れるのでトレードオフです。

メモ:


exampleのu8g2/page_buffer/Japaneseは、Arduino Uno R3だとメモリが足りなくてコンパイルできなかった。

Arduino:1.8.1 (Windows 10), ボード:"Arduino/Genuino Uno"
最大32256バイトのフラッシュメモリのうち、スケッチが32634バイト(101%)を使っています。
最大2048バイトのRAMのうち、グローバル変数が614バイト(29%)を使っていて、ローカル変数で1434バイト使うことができます。
スケッチが大きすぎます。http://www.arduino.cc/en/Guide/Troubleshooting#size には、小さくするコツが書いてあります。
ボードArduino/Genuino Unoに対するコンパイル時にエラーが発生しました。

フォントデータがでかいのかな?

上記スケッチでも

最大32256バイトのフラッシュメモリのうち、スケッチが9644バイト(29%)を使っています。
最大2048バイトのRAMのうち、グローバル変数が1512バイト(73%)を使っていて、ローカル変数で536バイト使うことができます。

メモリ食いますね(@@;