0.96/1.3インチのOLEDを1ドルCPU(CPU:STM8S103F3)ボードのI2Cで動かして見ました
1ドルCPUボードのI2C機能の確認も兼ねて、手持ちのI2Cの0.96と1.3インチの
OLEDを動かして見ました。文字の表示は全く問題無く出来るのがすぐに確認
出来たのですがグラフィックの方はCPUボードのRAMが1Kバイトしか無いので
諦めていました。しかし、ダメ元でRAMの半分を利用して画面の左右どちらか
半分のグラフィックを動作する方法も検討して、トライして見ました。
その結果、以下の様に画面は半分となりますが、グラフィックの方も上手く
動作させられる事が確認できました。以下はその状況となります。
<OLED 0.96"/1.3" の概要>
OLEDの0.96インチと1.3インチに関しては、以前はArduino系のチップで
動作させましたが、今回はSTM8Sのボードでの動作を検討しました。OLEDには
I2CとSPIの2種類のインターフェイスの形式がサポートされていますが、今回は
STM8SのボードでのI2C機能の確認も兼ねて、I2Cで行いました。
1.画素数 128x64ドットの有機LEDディスプレイ
2.発光色は青色(他の色の製品も有り)
3.インターフェイスはI2Cのものを利用、ただしOLEDからの表示状態の
情報は無し
0.96インチはI2C専用、
1.3インチはI2CとSPI(切り替えは裏面部品取り付け変更で対応)
(いずれも今回のもの、他の種類のものも有り)
4.ドライバIC
0.96インチは SSD1306
1.3インチはSSH1106
[動作状況]
動作状況は次のURLから確認できます。(最初は0.96インチで次が
1.3インチです。)
<関連資料>
0.96インチのドライバのチップ(SSD1306)のデータシートは次のURLから
入手可能です
URL : https://cdn-shop.adafruit.com/datasheets/SSD1306.pdf
1.3インチのドライバのチップ(SSH1106)のデータシートは次のURLから
入手可能です
URL : http://www.allshore.com/pdf/SH1106.pdf
<テスト内容>
OLEDのテストは次の様な内容で、STM8S103F3ボード用に、ライブラリを
改造してArduino用のライブラリに付属するサンプルプログラムの一部を
動作をさせる事にしました。ただし、グラフィック動作をさせる為には、
現在の描画状態のデータ用にメモリが必要な為、今回のボードチップの
メモリ容量の制限から、グラフィック動作は左右の半分づつで行う事に
しました。
[目的と結果]
テストの確認目標は次のものでした。
1.I2C動作に必要な設定を確認
2.I2Cの設定でArduinoのチップと同様な動作ができるかを確認
3.CPUのRAMの半分をグラフィック描画用に使った場合、CPUが
目的の動作をするかを確認
結果としては、次の様な状況で、グラフィックは左右どちらかの
半分づつしか行えませんが、動作させる事ができました。
1.CPUチップのI2Cの機能としては必要なものが揃っている
2.また、I2C動作の設定は、Arduinoのライブラリが使える様なものに
できる
3.RAMに関しては、グラフィック用の領域(512バイト)を
確保しても動作する事を確認
4.コードの移植に関しては、今回もCPUレジスタの設定関係以外の部分は
ほぼそのまま利用可能で、このレジスタ関連部分の作成が移植作業の
ほとんどであった
以上の様な状況で、コードの移植に関してはI/Oレジスタの設定部分等で
オリジナルのものと等価な動作をさせるものが用意できればArduinoの
ライブラリはそれ程難しくなく移植でき、また、RAMがグラフィック
メモリ用に取られて半分になっても、目的の動作をさせるものが
作るれる事が判りました。
[0.96"と1.3"の違い]
0.96インチと1.3インチではドライバーチップが異なります。その為、
0.96インチ用のものをそのまま利用すると、次の問題がでます。
1.1.3インチ用のドライバは132ドット用のもので、OLED自身は
128ドットなので、ドライバはその中心を合わせています。
その為、0.96インチ用のものをそのまま利用すると、左端の
2ドット分の表示が欠け、右端に2ドット分のアクセスされて無い
部分が画面上のノイズとなります。
2.0.96インチ用のドライバでは、表示データが右端に達すると
チップ側で表示位置の改行がされますが、1.3インチ用のドライバでは
表示データが右端に達した場合、改行されないで同じ行の先頭に
なります。その為、改行の管理をライブラリ側で行っていないものを
利用すると、最初の1行目しか表示されません。(ライブラリ側
もしくはアプリケーション側で改行の管理を行っているものでは、
この問題は起きません。)
その為、今回のプログラムでは、次の処理でこれらのチップ間の動作の違いに
対応しています。
1.1.3インチの場合は、横軸座標の指定値に2ドット分を足したものを
OLED側に送っています。(横軸座標2ドット分の加算の有無は
コンパイルオプションでの対応となっています。)
2.改行処理に関しては、表示位置の管理をライブラリ側で行い、改行が
発生した場合は、座標設定のコマンドをOLED側に出して
対応しています。(この部分は共有できる為、両方共通で利用
しています。)
[テストでの機器の接続]
[コード類]
今回も、コードの開発にはIARのシステムを利用しました。
(STM8S103F3P6ボードののコード開発に 関してはこちらの記事を
参照して下さい。)
Code download URL : https://www.dropbox.com/s/u136iee12yq4c6o/IAR_I2C_OLED_STM8S.zip?dl=0
OLEDを動かして見ました。文字の表示は全く問題無く出来るのがすぐに確認
出来たのですがグラフィックの方はCPUボードのRAMが1Kバイトしか無いので
諦めていました。しかし、ダメ元でRAMの半分を利用して画面の左右どちらか
半分のグラフィックを動作する方法も検討して、トライして見ました。
その結果、以下の様に画面は半分となりますが、グラフィックの方も上手く
動作させられる事が確認できました。以下はその状況となります。
<OLED 0.96"/1.3" の概要>
OLEDの0.96インチと1.3インチに関しては、以前はArduino系のチップで
動作させましたが、今回はSTM8Sのボードでの動作を検討しました。OLEDには
I2CとSPIの2種類のインターフェイスの形式がサポートされていますが、今回は
STM8SのボードでのI2C機能の確認も兼ねて、I2Cで行いました。
1.画素数 128x64ドットの有機LEDディスプレイ
2.発光色は青色(他の色の製品も有り)
3.インターフェイスはI2Cのものを利用、ただしOLEDからの表示状態の
情報は無し
0.96インチはI2C専用、
1.3インチはI2CとSPI(切り替えは裏面部品取り付け変更で対応)
(いずれも今回のもの、他の種類のものも有り)
4.ドライバIC
0.96インチは SSD1306
1.3インチはSSH1106
[動作状況]
動作状況は次のURLから確認できます。(最初は0.96インチで次が
1.3インチです。)
<関連資料>
0.96インチのドライバのチップ(SSD1306)のデータシートは次のURLから
入手可能です
URL : https://cdn-shop.adafruit.com/datasheets/SSD1306.pdf
1.3インチのドライバのチップ(SSH1106)のデータシートは次のURLから
入手可能です
URL : http://www.allshore.com/pdf/SH1106.pdf
<テスト内容>
OLEDのテストは次の様な内容で、STM8S103F3ボード用に、ライブラリを
改造してArduino用のライブラリに付属するサンプルプログラムの一部を
動作をさせる事にしました。ただし、グラフィック動作をさせる為には、
現在の描画状態のデータ用にメモリが必要な為、今回のボードチップの
メモリ容量の制限から、グラフィック動作は左右の半分づつで行う事に
しました。
[目的と結果]
テストの確認目標は次のものでした。
1.I2C動作に必要な設定を確認
2.I2Cの設定でArduinoのチップと同様な動作ができるかを確認
3.CPUのRAMの半分をグラフィック描画用に使った場合、CPUが
目的の動作をするかを確認
結果としては、次の様な状況で、グラフィックは左右どちらかの
半分づつしか行えませんが、動作させる事ができました。
1.CPUチップのI2Cの機能としては必要なものが揃っている
2.また、I2C動作の設定は、Arduinoのライブラリが使える様なものに
できる
3.RAMに関しては、グラフィック用の領域(512バイト)を
確保しても動作する事を確認
4.コードの移植に関しては、今回もCPUレジスタの設定関係以外の部分は
ほぼそのまま利用可能で、このレジスタ関連部分の作成が移植作業の
ほとんどであった
以上の様な状況で、コードの移植に関してはI/Oレジスタの設定部分等で
オリジナルのものと等価な動作をさせるものが用意できればArduinoの
ライブラリはそれ程難しくなく移植でき、また、RAMがグラフィック
メモリ用に取られて半分になっても、目的の動作をさせるものが
作るれる事が判りました。
[0.96"と1.3"の違い]
0.96インチと1.3インチではドライバーチップが異なります。その為、
0.96インチ用のものをそのまま利用すると、次の問題がでます。
1.1.3インチ用のドライバは132ドット用のもので、OLED自身は
128ドットなので、ドライバはその中心を合わせています。
その為、0.96インチ用のものをそのまま利用すると、左端の
2ドット分の表示が欠け、右端に2ドット分のアクセスされて無い
部分が画面上のノイズとなります。
2.0.96インチ用のドライバでは、表示データが右端に達すると
チップ側で表示位置の改行がされますが、1.3インチ用のドライバでは
表示データが右端に達した場合、改行されないで同じ行の先頭に
なります。その為、改行の管理をライブラリ側で行っていないものを
利用すると、最初の1行目しか表示されません。(ライブラリ側
もしくはアプリケーション側で改行の管理を行っているものでは、
この問題は起きません。)
その為、今回のプログラムでは、次の処理でこれらのチップ間の動作の違いに
対応しています。
1.1.3インチの場合は、横軸座標の指定値に2ドット分を足したものを
OLED側に送っています。(横軸座標2ドット分の加算の有無は
コンパイルオプションでの対応となっています。)
2.改行処理に関しては、表示位置の管理をライブラリ側で行い、改行が
発生した場合は、座標設定のコマンドをOLED側に出して
対応しています。(この部分は共有できる為、両方共通で利用
しています。)
[テストでの機器の接続]
[コード類]
今回も、コードの開発にはIARのシステムを利用しました。
(STM8S103F3P6ボードののコード開発に 関してはこちらの記事を
参照して下さい。)
Code download URL : https://www.dropbox.com/s/u136iee12yq4c6o/IAR_I2C_OLED_STM8S.zip?dl=0