0.96インチ 128x64ドット OLEDディスプレイ
Arduinoで使うキャラクタ表示の液晶のストックが無くなりそうなので、0.96インチで128x64ドットのOLEDディスプレイをAlEexpressから購入しました。
注文したのが12月の初め頃だったのですが、なんと正月の年賀状と一緒に届きました。注文から受け取りまで24日掛かりましたが、送料最安コースなのでこんなもんでしょう。
▼0.96インチOLED (左のユニットは画面保護用のシールを剥がしています)

1個 $1.99を2個買い、送料込みで$4.14でした。安いのでもっと多く買いたかったのですが、3個目から送料が急に上がったので2個にしておきました。ちなみに、少し送料を増やせばデリバリーが早くなるようです。なお買ったのは白色表示の物で、インターフェイスはI2Cです。
AliExpress のページはこちら→new original 4pin 0.96" White/Blue/Yellow blue 0.96 inch OLED 128X64 OLED Display Module for arduino 0.96" IIC I2C Communicate
このモジュールで気になったのは電源電圧です。調べると3.3Vから5Vまで使えることになっていました。秋月のサイトに同じような物がありますが、そちらも電源電圧は3.3-5.0Vになっています。こういう場合、以下のようなケースが考えられます。
1) 電源電圧は3.3Vから5VまでOK。(例えば、ATmega328)
2) 電源電圧は3.3から5VまでOK。入力は5Vトレラントなので、電源電圧3.3Vで使っていても 5V入力が可能。
3) 仕様上の電源電圧は3.3Vだけど、5Vでも動く。但し保証外。
1)なら安心なのですが、コントローラーチップのSSD1306のデーターシートを読むと電源電圧は3.3Vとなっています。5Vは絶対最大定格すら超えているので、そんなに高い電圧かけてはいけません。
まさか3)のように危ない物では無いと思いますが、中華マーケットにはこういう危ない部品を見かけることがあります。
ともかく、このあたりの疑問をすっきりさせるために、インターフェイス基板の中身がどうなっているか調べてみました。
▼インターフェイス基板 (表示面の裏側です)

上の4ピンのピンヘッダがインターフェイスコネクタで、下側の30ピンのフレキを経由してSSD1306のチップに接続されています。
▼回路図 (図をクリックで別窓に拡大図)

フレキ側のピンの信号名は、Webで調べた情報を元に記入しているので、多少間違っているところがあるかも知れません。
この回路図で疑問点は全て解決しました。電源はU2の三端子レギュレーターを通して供給されていました。つまり、OLEDモジュールに供給される電圧は3.3Vで、入力に3.3V以上が供給された場合は3端子レギュレーターで降圧される仕掛けになっていました。事前に三つのケースを想定していたのですが、結果はそのどれでもなく、部品コストを掛けた真面目な対応が行われていたことになります。
I2Cのプルアップ抵抗はこの基板で作った3.3Vに接続されています。つまりI2Cバスの電圧は3.3Vになります。そんなことで、外部に5V電源から垂らしたプルアップ抵抗を入れてはいけません。なお、Arduino側が5V電源だったとしても、I2Cのピンはオープンドレイン出力なので、そのままで(アマチュアが使うなら)大丈夫です。
自分用のメモを兼ねてこの回路の説明をしておきます。
BS0-1などの制御ピンに加える電圧の組み合わせで、SPIやパラレルなどのインタフェイス方式の選択を行っています。C4, C3 はチャージポンプのバケツ。C2, C1 は3.3V電源のデカップリング。R10, D1, C9 はパワーオンリセット回路。R6, R7 は I2Cバスのプルアップ、R5 はセル電流設定、C6, C5 は表示セル駆動電圧のデカップリング用だと思います。
▼動作テスト

Adafruit のデモプログラムを動かしている様子です。
▼特性測定中

せっかくなので波形や消費電流を見てみました。
電源の消費電流は最大で約15mAで、表示するセル(画素)が減るとその分少なくなって、最小では1mA以下になるようです。なお、デモプログラムを走らせたままで測定したので、最低がどれくらいまで減るかは今回は調べていません。
▼I2Cの波形

上がデーター(SDA)で、下がクロック(SCL)です。
振幅は3.3Vになっていて、クロックのポジエッジでデーターを読んでいる感じの波形です。クロックレートは約400kHzです。なお、以前測定したハードウエアSPIインターフェイスの液晶は4MHzでした。
◆まとめ
0.96インチは小さいと思ったのですが、OLEDなのでコントラストが非常に高くて見易いです。今後何か作る時にぜひ組み込んでみたいです。あと、同程度の解像度で横長の 128x32の物も売られているのでこっちも欲しくなりました。
今回、このOLEDを表示させるためのライブラリはAdafluit のものを使いました。他に U8g のライブラリが使える、というかこっちの方が有名のようです。ただ、U8g ライブラリを使う場合、firstPageで開始し、whileを使ってnextPageで終了待ちという構造が要求されるようです。これでは使い難いので使いたくないです。(私が良さに気付いていないだけかも知れません)
あと、このドライバチップの名前はSSD1306ですが、この1306という数字を見ると2SC1306を思い出します。同じ気持ちになる人が日本中探すと僅かにいるはずなので、そのあたりの話はまた記事にしたいと思います。
注文したのが12月の初め頃だったのですが、なんと正月の年賀状と一緒に届きました。注文から受け取りまで24日掛かりましたが、送料最安コースなのでこんなもんでしょう。
▼0.96インチOLED (左のユニットは画面保護用のシールを剥がしています)

1個 $1.99を2個買い、送料込みで$4.14でした。安いのでもっと多く買いたかったのですが、3個目から送料が急に上がったので2個にしておきました。ちなみに、少し送料を増やせばデリバリーが早くなるようです。なお買ったのは白色表示の物で、インターフェイスはI2Cです。
AliExpress のページはこちら→new original 4pin 0.96" White/Blue/Yellow blue 0.96 inch OLED 128X64 OLED Display Module for arduino 0.96" IIC I2C Communicate
このモジュールで気になったのは電源電圧です。調べると3.3Vから5Vまで使えることになっていました。秋月のサイトに同じような物がありますが、そちらも電源電圧は3.3-5.0Vになっています。こういう場合、以下のようなケースが考えられます。
1) 電源電圧は3.3Vから5VまでOK。(例えば、ATmega328)
2) 電源電圧は3.3から5VまでOK。入力は5Vトレラントなので、電源電圧3.3Vで使っていても 5V入力が可能。
3) 仕様上の電源電圧は3.3Vだけど、5Vでも動く。但し保証外。
1)なら安心なのですが、コントローラーチップのSSD1306のデーターシートを読むと電源電圧は3.3Vとなっています。5Vは絶対最大定格すら超えているので、そんなに高い電圧かけてはいけません。
まさか3)のように危ない物では無いと思いますが、中華マーケットにはこういう危ない部品を見かけることがあります。
ともかく、このあたりの疑問をすっきりさせるために、インターフェイス基板の中身がどうなっているか調べてみました。
▼インターフェイス基板 (表示面の裏側です)

上の4ピンのピンヘッダがインターフェイスコネクタで、下側の30ピンのフレキを経由してSSD1306のチップに接続されています。
▼回路図 (図をクリックで別窓に拡大図)

フレキ側のピンの信号名は、Webで調べた情報を元に記入しているので、多少間違っているところがあるかも知れません。
この回路図で疑問点は全て解決しました。電源はU2の三端子レギュレーターを通して供給されていました。つまり、OLEDモジュールに供給される電圧は3.3Vで、入力に3.3V以上が供給された場合は3端子レギュレーターで降圧される仕掛けになっていました。事前に三つのケースを想定していたのですが、結果はそのどれでもなく、部品コストを掛けた真面目な対応が行われていたことになります。
I2Cのプルアップ抵抗はこの基板で作った3.3Vに接続されています。つまりI2Cバスの電圧は3.3Vになります。そんなことで、外部に5V電源から垂らしたプルアップ抵抗を入れてはいけません。なお、Arduino側が5V電源だったとしても、I2Cのピンはオープンドレイン出力なので、そのままで(アマチュアが使うなら)大丈夫です。
自分用のメモを兼ねてこの回路の説明をしておきます。
BS0-1などの制御ピンに加える電圧の組み合わせで、SPIやパラレルなどのインタフェイス方式の選択を行っています。C4, C3 はチャージポンプのバケツ。C2, C1 は3.3V電源のデカップリング。R10, D1, C9 はパワーオンリセット回路。R6, R7 は I2Cバスのプルアップ、R5 はセル電流設定、C6, C5 は表示セル駆動電圧のデカップリング用だと思います。
▼動作テスト

Adafruit のデモプログラムを動かしている様子です。
▼特性測定中

せっかくなので波形や消費電流を見てみました。
電源の消費電流は最大で約15mAで、表示するセル(画素)が減るとその分少なくなって、最小では1mA以下になるようです。なお、デモプログラムを走らせたままで測定したので、最低がどれくらいまで減るかは今回は調べていません。
▼I2Cの波形

上がデーター(SDA)で、下がクロック(SCL)です。
振幅は3.3Vになっていて、クロックのポジエッジでデーターを読んでいる感じの波形です。クロックレートは約400kHzです。なお、以前測定したハードウエアSPIインターフェイスの液晶は4MHzでした。
◆まとめ
0.96インチは小さいと思ったのですが、OLEDなのでコントラストが非常に高くて見易いです。今後何か作る時にぜひ組み込んでみたいです。あと、同程度の解像度で横長の 128x32の物も売られているのでこっちも欲しくなりました。
今回、このOLEDを表示させるためのライブラリはAdafluit のものを使いました。他に U8g のライブラリが使える、というかこっちの方が有名のようです。ただ、U8g ライブラリを使う場合、firstPageで開始し、whileを使ってnextPageで終了待ちという構造が要求されるようです。これでは使い難いので使いたくないです。(私が良さに気付いていないだけかも知れません)
あと、このドライバチップの名前はSSD1306ですが、この1306という数字を見ると2SC1306を思い出します。同じ気持ちになる人が日本中探すと僅かにいるはずなので、そのあたりの話はまた記事にしたいと思います。