Arduino UNO R4にOLEDディスプレイをつなぐ

Arduino UNO R4の5回目です。
今回は、Arduino UNO R4にOLEDディスプレイをつないで表示させます。

OLEDディスプレイとは

OLEDは、Organic Light-Emitting Diodeの略で、直訳すると有機LEDですね。
(オーガニックと聞くと、何だか体に良さそうですが炭素を含む有機化合物の事だから、人体に有害なものも多いですね。)

有機ELは、1950年代にフランスで発明されました。
その後、1960年代にアメリカで実用的な研究がなされ、1995年に山形大学の城戸淳二教授と長井 勝利教授などが「白色有機EL」を開発したことで商業化の道が拓けました。(青色LEDみたいですね。)

ディスプレイとしての有機ELは、1999年に三洋電気とイーストマン・コダック社が初のフルカラー・ディスプレイを開発して現在に至っています。
(出典:Wikipedia, “Multilayer White Light-Emitting Organic Electroluminescent Device”, ASCII 1999/9/30)

Arduinoでよく使うOLED

テレビなど大画面の有機ELディスプレイは「アクティブマトリクスOLED」と呼ばれ、各素子に制御用の半導体素子を組み込んだもので高精細で低電圧で動作しますが、その分、製造価格が上昇します。

Arduinoでよく使用されているのはドット数の少ないディスプレイです。
こちらは「パッシブマトリクスOLED」と呼ばれ、各素子は時分割のダイナミック駆動のために動作には高電圧が必要ですが、構造が簡単なために、小型で安価なディスプレイに使用されています。

これ以外にも「セグメントOLED」があります。車のスピードメータ周りなどの定形の表示機に使われていますが、指定場所の端子に通電すると矢印や定形文字型に配置された素子が発光します。

液晶ディスプレイと比較すると、液晶ディスプレイは微細な電子的なシャッターでバックライトを透過させているために、低消費電力ですが表示は低速です。
有機ELディスプレイは、それ自体が発光するために、より電力を消費しますが見やすく反応は高速です。

Arduinoでよく使用されているOLEDディスプレイは、通常、「パッシブマトリクスOLED」にI2Cインターフェースが付いた駆動用のドライバICと周辺部品の基盤が付いたモジュールを指します。
(毎回、0.5 mm程のフレキシブル・フラット・ケーブルを半田付けする手間は勘弁ですね。)

自宅には、1.3インチのSH1106と0.96インチのSSD1306がありますが、これらが定番だと思われるので今回はこの2種類を扱います。

OLEDの動作確認

I2CインターフェースのOLEDディスプレイを動作確認します。

ー注意1-
液晶ディスプレイも同様ですが、OLEDディスプレイの表示部分は薄いガラス製です。
表示部分はとても割れやすく、薄いガラス面に直接に素子が張り付いている形なのでヒビが入っただけで表示されなくなります。
中学生時代に使った顕微鏡のプレパラートの上に被せる薄いガラスのように丁寧に扱いましょう。

ー注意
入手時期により異なるかもしれませんが、SH1106とSSD1306は、4本の端子のうち、I2Cの端子位置は同じですが電源端子は逆になっています。+5 V(または+3.3 V)とGNDをつなぐ場合は、通電前に再確認が必要です。

ー注意3-
特に1.3インチのSH1106はArduinoへのノイズの回り込みが激しいです。
これは、基盤上の電源レギュレータの出力側に、本来付けられるべきコンデンサが付けられていないためです。
Arduinoでアナログ信号を取り扱う場合などで、ノイズが気になる場合は対策をおすすめします。
(対策の実際は、以下をクリック)

SSD1306

ここで、「SSD1306」と呼んでいる自宅にあるOLEDディスプレイには、2種類あります。
1つは定番の128✕64ドットのディスプレイです。
裏側でI2Cアドレスを設定できます。

もう1つは、128✕32ドットのディスプレイです。
こちらは特に設定用の部分は有りません。

どちらも制御ICはSSD1306が使われています。
このICは香港の晶門半導体有限公司(英社名:Solomon Systech(International) Limited)製です。

Arduino IDEを立ち上げてライブラリを「SSD1306」で検索します。
「Adafruit SSD1306」が出てくるのでインストールします。

ドキュメント・フォルダ内の「Arduino\libraries\Adafruit_SSD1306\examples」にある「ssd1306_128x64_i2c」の動作例を読み込みます。
動作例のスケッチには「Adafruit_GFX.h」も必要だと書いてあるので、インストールしていない場合は同様にライブラリの検索で見つけてインストールします。

ArduinoとSSD1306を接続します。
電源2本と信号線2本だけなので簡単に接続できます。

ちなみに、Arduinoのデジタル側端子の一番上「D19」が「SCL」、その1つ下の「D18」が「SDA」ですが、アナログ側の端子の一番下の「A5」も「SCL」その1つ上の「A4」も「SDA」と繋がっています。

パソコンにArduinoをUSBケーブルで接続したら、「ツール」の「ボード」からArduino UNO R4を選択してコンパイル、インストールします。
(下の図は横長の128✕32ドットのディスプレイの例です。)

転送が終了すると、Arduinoは再起動されSSD1306にテストパターンが表示されます。

SH1106

SH1106は0.96インチのSSD1306(128✕64)と比較して1.3インチと0.3インチほどの差ですが、実際にはかなり大きく表示も見やすくなります。制御ICには上海のSINO WEALTH ELECTRONIC LTD(中颖电子股份有限公司)の「SSH1106」が使われています。
表示は、SSD1306と同じく128✕64ドットです。

中央、右から4番目の「C2」が実装されていません。
これは取り付けミスではなく仕様だそうです。
ただし、このコンデンサが付いていないと電源ICの出力にノイズが乗りArduinoのアナログ入力に支障があります。
気になる場合は1 uFのコンデンサを追加しましょう。
SSD1306と異なりアドレス設定は出来ませんが、電源端子の極性を変更できます。
(極性を変更したら、表面の表示も書き換えましょう。)

SH1106には、Arduino UNO R3時代から使用していたライブラリがあります。
GitHubにwonho-makerさんが公開されている「Adafruit_SH1106」ライブラリです。(GitHubからダウンロードしてライブラリ・フォルダにインストールしました。)
このライブラリは、SSD1306と同じ用に使用できるので便利です。
まずは、このライブラリを使用します。

Arduino UNO R4とSH1106を接続します。(電源ラインに注意)
その後、導入したライブラリ内の実行例「libraries\Adafruit_SH1106-master\examples\sh1106_128x64_i2c」を読み込んでコンパイル、インストールしようとしましたが、エラーが出ました。

ライブラリの「util/delay.h」が不良のようです。
ネットで情報を探しましたが、解決策が見つかりませんでした。

しかたがないので、他のライブラリを使用します。
ライブラリから「SH1106」で検索します。
「Adafruit SH110X」が見つかりました。インストールします。

「Adafruit SH110X」ライブラリ内の実行例を読み込みます。
今度は無事Arduino UNO R4にスケッチを送ることが出来ました。

問題なくSH1106でも、テストパターンが表示できました。

ライブラリの互換性

「Adafruit_SH1106」ライブラリを使用して書かれたスケッチはそのままでは「Adafruit SH110X」では動作しませんでした。

現在までに確認できた部分では「setTextColor(WHITE)」でエラーとなります。

setTextColor(WHITE);

setTextColor(SH110X_WHITE);

と書き換えると動作することが確認できています。

OLEDディスプレイとライブラリ

Arduino UNO R4でも、R3のほとんどのライブラリが動くようですが、今回も1部のライブラリに不具合が発生しました。
今後、R4でも動作を確認できたライブラリのリストを他のページにまとめます。

今までのところ、動作確認が取れたのは以下のとおりです。

I2C LCD(液晶ディスプレイ)

型番制御ICライブラリ動作
AQM1602Y
16×2行
ST7032LCD_ST7032動作せず
同上ST7032ST7032_asukiaaa

I2C OLEDディスプレイ

型番制御ICライブラリ動作
SSD1306
128×64
SSD1306Adafruit SSD1306
SSD1306
128×32
SSD1306Adafruit SSD1306
SH1106
128×64
SSH1106Adafruit_SH1106動作せず
同上SSH1106Adafruit SH110X

コメント