SO1602A シリーズは Sunlike Display Tech. 社の有機 EL ディスプレイ(OLED)モジュールです。キャラクタタイプで 2 行 16 桁の表示ができます。
文字色の違いで 3 タイプあり,型式は以下のようになっています。
SO1602AWWB-UC-WB-U | 白色 |
SO1602AWGB-UC-WB-U | 緑色 |
SO1602AWYB-UC-WB-U | 黄色 |
電源電圧は 3.3 V。ホストとのインタフェースは I2C です。
この記事では STM32 マイコン(STM32F334R8)と接続して文字列を表示してみます。
SO1602A の電源は VDD - VSS 端子間に,3.3 V を供給します。
マイコンとの接続は I2C なので,SDA と SCL の 2 本の信号線を接続します。 SO1602A の SDA 端子は SDA_in と SDA_out に分かれているので,両方をまとめてマイコンの SCL に接続しました。 SDA と SCL にはプルアップ抵抗が必要です。添付の説明書には 4.7 kΩ を付けるようにとありましたが,手元になかったので 10 kΩ をつけました。
I2C のスレーブアドレスは SA0 端子のレベルで変わります。 今回は SA0 端子は VSS に接続(つまり Low レベルに)しました。 この場合,スレーブアドレスは 2 進数で 0111100 となります。 実際に I2C でデータを送るときは最下位に Read/#Write を示すビットが入るので,1 ビット左にシフトして 01111000 とします。 16 進数で表すと,0x78 です。
/CS 端子は VSS に接続しなければなりません。
初期設定は内部で行われるので,通常は Display ON インストラクションを送るだけで良いようです。 ただ,添付の説明書によると Clear Displey と Return Home も送ったほうが良いとのことです。 インストラクションを送るときは 0x00 に続けて,1 バイトのインストラクションコードを送ります。 試しに以下のプログラムを書きました。
// インストラクションの送信
int OLED_WriteInstraction(uint8_t data)
{
uint8_t buf[] = { 0x00, data };
int status = HAL_I2C_Master_Transmit(&hi2c1, 0x78, buf, 2, 1000);
HAL_Delay(1);
return status == HAL_OK;
}
// OLED の初期化
void OLED_Init()
{
OLED_WriteInstraction(0x01); // Clear Display
OLED_WriteInstraction(0x02); // Return Home
OLED_WriteInstraction(0x0c); // Display ON
OLED_WriteInstraction(0x01); // Clear Display
}
内蔵の DDRAM に文字コードを書き込むと対応する文字が表示されます。 このときは 0x40 に続けて,文字コードを送ります。
ここでは,お約束の Hello, world! を表示してみます。
// DDRAM への書き込み
int OLED_WriteData(uint8_t data)
{
uint8_t buf[] = { 0x40, data };
int status = HAL_I2C_Master_Transmit(&hi2c1, 0x78, buf, 2, 1000);
HAL_Delay(1);
return status == HAL_OK;
}
// 文字列の出力
void Puts(const char *p)
{
for ( ; *p ; p++)
{
OLED_WriteData(*p);
}
}
// Hello, world! の表示
void HelloWorld()
{
OLED_Init();
Puts("Hello, world!");
}