RaspberryPi Picoで小型OLEDディスプレイ SSH1106(1.3inch)を使ってみた

コンピュータ、組み込み

小型のOLEDディスプレイSSH1106を使ってみました。
SSD1306 0.96inchより一回り大きい表示パネルです。

今回紹介するもの

OLED SSH1106(1.3inch)

特徴

OLED SSD1306 0.96inchより一回り大きいため視認性が高いです。
I2Cで制御できますが、SSD1306 I2Cモデルと配線が違います。
ライブラリもSSD1306とよく似ていますが、SSH1106専用のライブラリが必要です。

サイズ1.3inch
解像度(X, Y)128, 64
表示色白、青、黄、黄+青
黄+青の場合、それぞれのエリアが決まっていて、
色の変更はできないようです。
電源電圧3.3 – 5.0V
通信方式I2C(アドレスは 0x3c, または0x3dのどちらかを選択)
※SPIもありますが、この記事ではI2Cの紹介
ドライバSSH1106
I2Cアドレス0x3C(デフォルト)または、チップ抵抗を移動させることで0x3D
入手電子部品ショップ、ネットショップ
入手性は非常に良く、安く大量買いする場合はAli Express

本記事でSSH1106を2種類紹介します。
SSH1106ドライバを使った1.3inchOLEDは他にもいくつか販売されていますが、ほとんどがSSD1306と比べると電源とGNDのピン配置が違います
購入する前にピン配置をよく確認してください。

ピン配置

DIY MOREのOLEDです。
こちらは、SSD1306と同じピン配置です。

こちらははSSH1106でよく見かけるタイプのピン配置です。

外観

こちらはDIY MORE製のSSH1106です。

こちらはSSH1106でよく見かけるタイプのピン配置です。
SSD1306とは電源とGNDが逆なので注意。


SSD1306の0.96inchと1.54inchと表示を比べてみました。
縦横解像度は同じですが、1pixelが大きくなっているため0.96inchより見やすいです。
左から、SSD1306-0.96inch、SSH1106-1.3inch、SSD1306-1.54inchです。

使用感

0.96inchより大きいため視認性が良く、1.54inchより小さいですが価格が安い。
サイズも価格も中間のモジュールです。

ライブラリにはAdafruitを使用していますが、SSD1306とはライブラリが異なります。
宣言箇所箇所と初期化関数のパラメータが違いますが、描画関数の仕様は同じようですので親和性は高めだと思います。
同じライブラリであれば尚よかったと思います。

SSH1106 1.3inchにはピン配置が2種類あり、購入前によく確認する必要があります。

余談ですが、今回紹介した2種類以外にもう1種類所有してます。
ピン配置はよく見かけるパターンのものと同じですが、I2Cアドレスの変更ができないタイプもあります。
OLEDを複数使用する場合は、I2Cアドレスが重複してしまうので不利になります。

準備

使うもの

画像名称、型番用途
OLED 1.3inch
SSH1106
表示します。
今回紹介したDIY MORE製と
ピン配置の違うもう一種類を使用します。
RP2040-ASSH1106を制御します。
RaspberryPi Pico互換基板を使用します。
ブレッドボード配線します
ジャンパワイヤ数本
オス-オス
配線します

ライブラリ

ライブラリマネージャから以下2件のライブラリをインストールします。
SPI、I2Cのどちらで通信する場合も同じライブラリを使用します。

ライブラリ名検索確認時のバージョン
Adafruit SSH110X by AdafruitOLED2.1.8
Adafruit GFX LibraryGFX1.11.9

動作

表示制御(1個)

説明

RP2040-Aを使いSSH1106 OLEDを制御します。

そのほかの図形描画サンプルは、Arduinoサンプルを参照してください。
ファイル(F) > スケッチ例 > Adafruit SH110X > OLED_QTPY_SH1106 > SH1106_128x64_i2c_QTPY

配線
RP2040-A配線SSH1106
3.3VVCC
GNDGND
GPIO0(I2C0 SDA)SDA
GPIO1(I2C0 SCL)SCL
スケッチ
/**********************************************************************
【ライセンスについて】
Copyright(c) 2022 by tamanegi
Released under the MIT license
'http://tamanegi.digick.jp/about-licence/

【マイコン基板】
RaspberryPi Pico

【スケッチの説明】
SSH1106 OLEDを制御します。

【ライブラリ】
Raspberry Pi Pico / RP2040 > Raspberry Pi Pico

Adafruit SSH110X by Adafruit
Adafruit GFX Library by Adafruit

【準備】
マイコン基板 <-> SSH1106(I2C address 0x3c)
3V3           <-> VCC
GND           <-> GND
GP0(I2C0 SDA) <-> SDA
GP1(I2C0 SCL) <-> SCL

【バージョン情報】
2023/10/28 : 新規
**********************************************************************/

#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>

#include <Adafruit_SH110X.h>

#define PIN0_SDA 0                      //0.96, 1.54inch用I2C
#define PIN0_SCL 1

#define SCREEN_WIDTH 128                //解像度 128 x 64 で使用します。
#define SCREEN_HEIGHT 64                //SCREEN_HEIGHTは 32 に設定することができます。

#define OLED_RESET     -1               //使用しないので -1を設定する。
#define OLED_13     0x3c                //1.3inch I2cアドレスは 0x3c

Adafruit_SH1106G display13 = Adafruit_SH1106G(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, OLED_RESET);
                                        
void setup()
{
  
  // //I2C0の場合
  Wire.setSDA(PIN0_SDA);
  Wire.setSCL(PIN0_SCL);

  display13.begin(OLED_13, true); // Address 0x3C default

  display13.clearDisplay();               //何か表示されている場合に備えて表示クリア

  display13.setTextSize(2);               //フォントサイズは2(番目に小さい)
  display13.setTextColor(SSD1306_WHITE);  //色指定はできないが必要
  display13.setCursor(20, 0);            //テキストの表示開始位置
  display13.print(F("TAMANEGI"));         //表示文字列
  display13.setCursor(20, 25);
  display13.print(F("OLED 1.3"));
  display13.setCursor(25, 45);
  display13.print(F("SSH1106"));

  display13.display();                    //バッファ転送(表示)


}

void loop()
{
}
結果

SSH1106に文字を表示できました。
サイズが違う以外にSSD1306との差異は見られません。

表示制御(2個)

説明

RP2040-Aを使いSSH1106を2個表示します。
I2Cアドレスは両方ともに0x3cを使用します。

片方はI2C0を使用し、もう片方にはI2C1を使用します。

配線

本記事で紹介した、DIY MOREのSSH1106と、よく見かけるSSH1106を使用しています。
電源とGNDのピン配置が違うのでよく確認して配線してください。

RP2040-A配線SSH1106配線SSH1106
3.3VVCCVDD
GNDGNDGND
GPIO0(I2C0 SDA)SDA
GPIO1(I2C0 SCL)SCL
GPIO2(I2C1 SDA)SDA
GPIO3(I2C1 SCL)SCL
スケッチ
/**********************************************************************
【ライセンスについて】
Copyright(c) 2022 by tamanegi
Released under the MIT license
'http://tamanegi.digick.jp/about-licence/

【マイコン基板】
RaspberryPi Pico

【スケッチの説明】
SSH1106 OLEDを制御します。
I2C0 と I2C1を使い2個のOLEDを別々に制御します。

使用するOLEDのI2Cアドレスは2個ともに0x3cです。

【ライブラリ】
Raspberry Pi Pico / RP2040 > Raspberry Pi Pico

Adafruit SSH110X by Adafruit
Adafruit GFX Library by Adafruit

【準備】
マイコン基板 <-> SSH1106(I2C address 0x3c)
3V3           <-> VCC
GND           <-> GND
GP0(I2C0 SDA) <-> SDA
GP1(I2C0 SCL) <-> SCL

マイコン基板 <-> SSH1106(I2C address 0x3c)
3V3           <-> VCC
GND           <-> GND
GP2(I2C2 SDA) <-> SDA
GP3(I2C3 SCL) <-> SCL

【バージョン情報】
2023/10/28 : 新規
**********************************************************************/

#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>

#include <Adafruit_SH110X.h>

#define PIN0_SDA 0
#define PIN0_SCL 1
#define PIN1_SDA 2
#define PIN1_SCL 3

#define SCREEN_WIDTH 128                //解像度 128 x 64 で使用します。
#define SCREEN_HEIGHT 64                //SCREEN_HEIGHTは 32 に設定することができます。

#define OLED_RESET   -1                 //使用しないので -1を設定する。
#define OLED0_13     0x3c               //I2c0に使用するアドレスは 0x3c
#define OLED1_13     0x3c               //I2c1に使用するアドレスは 0x3c

Adafruit_SH1106G display0 = Adafruit_SH1106G(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, OLED_RESET);
Adafruit_SH1106G display1 = Adafruit_SH1106G(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire1, OLED_RESET);
                                        
void setup()
{
  //I2C0
  Wire.setSDA(PIN0_SDA);
  Wire.setSCL(PIN0_SCL);

  //I2C1
  Wire1.setSDA(PIN1_SDA);
  Wire1.setSCL(PIN1_SCL);

  display0.begin(OLED0_13, true); // Address 0x3C default

  display0.clearDisplay();                //何か表示されている場合に備えて表示クリア
  display0.setTextSize(2);                //フォントサイズは2(番目に小さい)
  display0.setTextColor(SSD1306_WHITE);   //色指定はできないが必要
  display0.setCursor(20, 0);              //テキストの表示開始位置
  display0.print(F("TAMANEGI"));          //表示文字列
  display0.setCursor(5, 25);
  display0.print(F("OLED_0 1.3"));
  display0.setCursor(25, 45);
  display0.print(F("SSH1106"));
  display0.display();                     //バッファ転送(表示)


  display1.begin(OLED1_13, true); // Address 0x3C default

  display1.clearDisplay();                //何か表示されている場合に備えて表示クリア
  display1.setTextSize(2);                //フォントサイズは2(番目に小さい)
  display1.setTextColor(SSD1306_WHITE);   //色指定はできないが必要
  display1.setCursor(20, 0);              //テキストの表示開始位置
  display1.print(F("TAMANEGI"));          //表示文字列
  display1.setCursor(5, 25);
  display1.print(F("OLED_1 1.3"));
  display1.setCursor(25, 45);
  display1.print(F("SSH1106"));
  display1.display();                    //バッファ転送(表示)
}

void loop()
{
}
結果

それぞれに別の表示ができました。
変化の少ない表示ですが、左側には”OLED_0″、右側には”OLED_1″と表示をしています。
左側がDIY MOREのSSH1106、右側がよく見かけるSSH1106です。

画像からはわかりにくいですが、右側の表示は若干暗いです。
電源は左側を中継して右側にチェーンしています。
電源のチェーンの順番を入れ替えても変わりませんでした。
製品差か個体差かについては調べていません。

コメント

タイトルとURLをコピーしました