TIM Labs

2019年7月アーカイブ

128×64ドットで、多数jの文字を表示するのは、1画面ならOKだが、2画面だとダメだった。

ということで、次のような実験をした。

  1. 画面を128×64ではなく、128x32を指定してみた。
  2. 表示する文字数をぐっと半分以下に減らしてみた。

これだと、ディスプレイの上半分だけが使われるのだろうか。

プログラム全体を以下に示す。

#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>
#define SCREEN_WIDTH 128 // OLED display width, in pixels
#define SCREEN_HEIGHT 32 // OLED display height, in pixels
#define OLED_RESET     4

Adafruit_SSD1306 display1(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, OLED_RESET);
Adafruit_SSD1306 display2(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, OLED_RESET);

void setup() {
  Serial.begin(115200);
  display1.begin(SSD1306_SWITCHCAPVCC, 0x3C);
  display2.begin(SSD1306_SWITCHCAPVCC, 0x3D);

  displayText(display1, "Arduino is an open-source hardware and software company,"
                        "project and user community ");
                       
  displayText(display2, "that designs and manufactures "
                        "single-board microcontrollers and microcontroller kits " );
} 

void loop() {
  
}

void displayText(Adafruit_SSD1306 disp, char* text) {
  disp.setTextColor(WHITE);
  disp.clearDisplay();
  disp.setTextSize(1);
  disp.setCursor(0,0);
  disp.print(text);
  disp.display();
}

すると、結果はこうなった。

OLED-128x32displa2.JPG

文字が縦に倍に伸ばされているようだ。1行の文字数には変化がない。

さて、どうして、128×64では動かず、128×32にしたら動いたのであろうか。

たぶん、以下のような理由ではないかと思う。

OLEDは非常に鮮明な表示と言われているので、文字を非常に小さくしてみた。

DSCN4780-small.JPG    DSCN4782-small.JPG

漢字を表示したりするには、フォントを入れたりしないといけないのだが、面倒なので止めた。

とりあえず、これを表示しているスケッチ(プログラム)を示す。

#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>
#define SCREEN_WIDTH 128 // OLED display width, in pixels
#define SCREEN_HEIGHT 64 // OLED display height, in pixels
#define OLED_RESET     4

Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, OLED_RESET);

void setup() {
  display.begin(SSD1306_SWITCHCAPVCC, 0x3C);
  displayText(display,"Arduino is an open-source hardware and software company,"
                       "project and user community that designs and manufactures "
                       "single-board microcontrollers and microcontroller kits " );
} 

void loop() {
  
}

void displayText(Adafruit_SSD1306 disp, char* text) {
  disp.setTextColor(WHITE);
  disp.clearDisplay();
  disp.setTextSize(2);
  disp.setCursor(0,0);
  disp.print(text);
  disp.display();
}

さて、次は、2つのディスプレイに異なる内容を表示してみよう。

adafruitのデモプログラムに手を入れて、2つのディスプレイに異なるグラフィックス表示をさせるのは面倒だったので、とりあえずこのプログラムを修正して、2つのディスプレイで、最後まで表示してみよう。

I2CバスでOLED(有機EL)のドットディスプレイを Arduinoに接続したが、まったく何も表示されず、画面は真っ暗なままだった。

OLED-128x64display.JPG

こういうとき、一番考えられるのは、I2Cのアドレスが一致していないことである。

スケッチのコードを見ると...

  if(!display.begin(SSD1306_SWITCHCAPVCC, 0x3D)) { // Address 0x3D for 128x64
    Serial.println(F("SSD1306 allocation failed"));
    for(;;); // Don't proceed, loop forever
  }

となっていて、プログラムではアドレスが0x3Dが指定されている。

デバイス側のI2Cのアドレスが3Dであるかどうかを確認しなくてはならない。

確認方法は色々考えられる。

  1. 他のI2Cのアドレスを調べられるマシンで確認する。
  2. デバイスの説明書を読んで確認する。
  3. Arduinoに、I2Cバスに接続したデバイスのアドレスを調べるソフト(スキャナ)を入れて確認する。

2.が正統派と思うが、ここでは、知っておくと非常に便利なI2Cのアドレス・スキャナについて説明しよう。

前回、Arduinoの小型版のArduino nano に、128×64のモノクロのOLED(有機EL)を繋いでみたことを書いた。今回は、もっと掘り下げてみよう。

Arduino-nano-OLED-1.JPG

まず、もっとも標準的なArduino UNOから、より小さい、ブレッドボード上に挿せるArduino nanoについて説明しよう。

機能的にはArduino UNOとほぼ同じであるが、ピンに違いがあるので、結線するときには必ず印刷されているピンの記号を見ながら行おう。

今回は、I2CでOLEDディスプレイを繋ぐので、必要な結線は4本だけである。

OLED-128x64display.JPG

ディスプレイの上に、ピンが4つあるが、左から GND, VCC, SCL, SDA になっている。

16文字2行の液晶ディスプレイをArduinoにつけたが、基板も含めると、幅8cm、高さ3.6cmとかなり大きい。Arduino本体より大きく、拡張ボードと同じ幅になってしまった。遠くから眺めるのならともかく、これではあまりにも大きく、基板を専有し過ぎて邪魔である。

ということで、小型化に取り組んでみよう。

さらに、このディスプレイはピンの数が多く、ハンダ付けするのが面倒である。
ということで、少ない線数で接続できる小型のディスプレイを探すことにした。

それで、ネットで何か手頃なものはないかと調べてみた。

すると、YouTubeに、Tutorial on I2C OLED Display with Arduino/NodeMCUがあり、参考になった。
英語だけど、非常に丁寧な説明で、英語が聞き取れなくても、良く分かる説明であったので、これをベースに考えることにした。

  • 単に小さいディスプレイではなく、ドットマトリックスにしてみよう。
  • 液晶はバックライトがないと見難いし、視野角に限度がある。でも、OLED(organic light-emitting diode、有機EL)なら、ドット自身が発光しているから、見やすい。
  • Arduinoとの接続に、I2Cバスを使えば、たった4本の結線で済むので、楽そうだ。(エンジニアはlazyであるべし)温湿度気圧センサーはI2Cだったし。
  • ついでに、Arduino Uno(実際にはMarduino)を使っていたが、このビデオではArduino nano というはるかに小さいのが使われていた。

ということで、ちょっと部品を集め直して、ディスプレイのテストをしてみた。

どのくらい小さくなったか、センサーの値を表示する3階建てと比較してみた。

DSCN4729-600.JPG

ディスプレイははるかに小さくなって、約1/3の大きさである。これだけ小さいけれど、実はこちらの方が、より多くの文字を表示することができる。楽勝で、10文字4行の英数字が表示できる。頑張れば、20文字8行さえ可能である。

ディスプレイの右にあるのが、Arduino nanoである。正しくは、その互換品の安いやつである。
USBなのだが、USB Mini-B という、それほど一般的でないコネクタになっていたので、これのケーブルはわざわざ入手した。

ディスプレイにはイメージが描かれているが、これはこのデバイスのためのライブラリのサンプルを走らせただけである。

さて、次回から、もう少し詳しく説明しようと思う。

このアーカイブについて

このページには、2019年7月に書かれたブログ記事が新しい順に公開されています。

前のアーカイブは2019年6月です。

次のアーカイブは2019年8月です。

最近のコンテンツはインデックスページで見られます。過去に書かれたものはアーカイブのページで見られます。

月別 アーカイブ