趣味のマイコンいじり

安価なマイコンを利用して作成したアプリの紹介です。

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

  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側に出して
               対応しています。(この部分は共有できる為、両方共通で利用
               しています。)     

 [テストでの機器の接続] 
    イメージ 3

     イメージ 2

 [コード類]
     今回も、コードの開発にはIARのシステムを利用しました。
  (STM8S103F3P6ボードののコード開発に 関してはこちらの記事
         参照して下さい。)

     Code download URL : https://www.dropbox.com/s/u136iee12yq4c6o/IAR_I2C_OLED_STM8S.zip?dl=0