月曜日, 4月 11, 2016

Arduino: 有機ELディスプレイを使う

今日、有機ELディスプレイが届きました。有機ELは英語で OLED ですね。有機ELは液晶ディスプレイよりまだ高価ですが、近い将来、市場を席巻するだろうという未来の素材です。


有機ELは発光素子を挟み込んだ画面を用います。発光素子を直接光らせるので、画面のバックライトをフィルターして見せている液晶より明るく、消費電力が少ないわけです。バックライトが必要ないため薄くできます。


薄くて明るく消費電力の少ないという有機ELですが、そろそろ手ごろな値段で出ています。さっそく注文してみました。この価格帯だと解像度というレベルのものではないですが、細かい文字も表示できます。


この小さなディスプレイは、端子はたったの4つ。



ライブラリなどは128x64サイズのものを使えばそのまま文字でもビットマップでも表示できます。

https://github.com/adafruit/Adafruit_SSD1306
https://github.com/adafruit/Adafruit-GFX-Library

このライブラリですが、使用の際ディスプレイのアドレスを得る必要があります。

http://playground.arduino.cc/Main/I2cScanner

アドレスを得たら初期化のとき引数として渡してやります。

display.begin(SSD1306_SWITCHCAPVCC, 0x3C); 

この画面サイズの場合、ヘッダファイル(Adafruit_SSD1306.h)を書き換える必要があります。

   #define SSD1306_128_64
//   #define SSD1306_128_32
//   #define SSD1306_96_16


ライブラリを使っての HelloWorld! スクリプトです。

#include <SPI.h>
#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>
#define OLED_RESET 4
Adafruit_SSD1306 display(OLED_RESET);
#define NUMFLAKES 10
#define XPOS 0
#define YPOS 1
#define DELTAY 2
#define LOGO16_GLCD_HEIGHT 16
#define LOGO16_GLCD_WIDTH 16
#if (SSD1306_LCDHEIGHT != 64)
#error("Height incorrect, please fix Adafruit_SSD1306.h!");
#endif
#if (SSD1306_LCDHEIGHT != 64)
#error("Height incorrect, please fix Adafruit_SSD1306.h!");
#endif
void setup() {
Serial.begin(9600);
display.begin(SSD1306_SWITCHCAPVCC, 0x3C);
display.clearDisplay();
display.setTextSize(1);
display.setTextColor(WHITE);
display.setCursor(0,0);
/*
for (uint8_t i=0; i < 168; i++) {
if (i == '\n') continue;
display.write(i);
if ((i > 0) && (i % 21 == 0))
display.println();
}
*/
/*
String str="Hello World!";
for(uint8_t j=0;j<5;j++)
{
display.setTextSize(j);
// for(uint8_t i=0;i<str.length();i++)
for(uint8_t i=0;i<1;i++)
{
// display.write(str.charAt(i));
display.write('A');
}
// display.println();
}
*/
String str="Hello World!";
display.setTextSize(1);
display.println(str);
display.display();
display.startscrollright(0x00, 0x0F);
delay(1000);
display.stopscroll();
delay(500);
display.startscrollleft(0x00, 0x0F);
delay(1000);
display.stopscroll();
delay(500);
display.startscrolldiagright(0x00, 0x0F);
delay(1000);
display.startscrolldiagleft(0x00, 0x07);
delay(1000);
display.startscrolldiagright(0x00, 0x0F);
delay(1100);
display.startscrolldiagleft(0x00, 0x07);
delay(850);
display.stopscroll();
}
void loop() {
}
view raw helloOLED.ino hosted with ❤ by GitHub


動きました!ので、使いやすいよう Arduino 用有機ELディスプレイ・モジュールを作ってみました。

ここで晒すのもなんですが、配線はこんな感じです。アナログ入力端子をふさがないよう長足のピンソケットをつけています。モジュールだと配線を考えなくていいので使いやすいです。


モジュールが使いやすいってのはつまり配線を間違えることがない、成功率が高い、能率がいい、ひいては使う際の敷居が低いってことでもあります。すべからくモジュールを組んでおくと Arduino の良さを満喫できます。

#使ってみると有機ELディスプレイってのはいいです。小さいし軽い。電池も持つしいうことないです。早くもっと普及してほしい。

#この「IICシールド」、他のIIC機器用のシールドとしても使えます。時計モジュールとつなぐとそのまま時刻が読めます。


Qt: 外部プログラムを起動する

  Qt/C++ のアプリは、外部へ直接アクセスできます。これはネットアプリでは不可能な Qt のメリットです。 外部プログラムを起動することもできます。QProcess::startDetached() を使うと独立したプロセスを立ち上げることができます。 この QProces...