桜のはなびらどっとねっとロゴ

桜のはなびらどっとねっと

Raspberry Pi 2でカラーグラフィック液晶の制御

この記事は1年以上前に投稿された記事です。 この警告表示について

IMG_4769_20150726

いよいよ表示器制御の本命である、カラー液晶の制御に挑戦したいと思います。
GPIOを用いて制御させる表示器はこれが最後となると思います。

なぜなら、IOポートしか持っていないPICやAVRならともかく、Raspberry Piは基本的にはPCであって、HDMIもあればアナログビデオ出力も備えているので、これ以上の表示器となると、既製品の外付けモニタを使った方あ楽で確実だからです。

個人的にはあとはカラー有機ELを扱ってみたいのですが、なかなかいいものがないので。

必要なもの

  • ST7735R搭載の128x160px SPI接続のカラーグラフィック液晶
    当方はアマゾンのマーケットプレイスから買えるサインスマート(SainSmart) 1.8″ TFT カラー LCD ディスプレイ モジュール SPI インタフェース & MicroSD 付き for Arduino UNO MEGA R3を使用。ただしこの液晶は少々チャイナクオリティすぎるので当サイトの画像ではエナメル線で縛っております。
    基本的にST7735R搭載の液晶であれば同じコードが使えるはずです。
    この液晶コントローラには無印、S、Rとあって、若干制御方法が違うようです。どう違うのかは知りませんが。このコントローラ搭載の液晶は1000~2000円程度で売られているようです。
  • 24ビット 128×160のBMPファイル
    今回の液晶は12・16・18bitカラー搭載で最大26万色の表示が可能なのと、コントローラの仕様上、Windows標準ソフトウェアでの作りやすさから、24bitBMPファイルを読み込ませることにします。ちなみに今回からきちんとファイル形式のチェックを行うようにしました。※Windows7(XPから?)のMSペイントでは、24bitのBMPファイルを指定していても何故か32ビットのBMPファイルを吐き出す時があるというお茶目な仕様があるみたいです。(元画像がPNGなどのαチャンネルがある画像だった場合にそうなる?)なので、作成した画像データがきちんと24bitかどうかを確認しておいてください。Photoshopなどのツールの場合はそういうことはないと思いますので問題無いですが…。

説明等(省略)

基本的には前回の白黒グラフィック液晶のコマンドコードと転送量が増えるだけですので結線は同じ。SPIの3線にRS信号とリセット信号。そしてGNDだけ。これは他のST7735R搭載の液晶でも同じはず。

接続

基本的にこの液晶コントローラは3.3V駆動であり、Raspberry Piに接続する場合は3.3V電源に接続しますが、上記のモジュールは元々5V系のArduino用のモジュールなので電源にレギュレーターが接続されており、そこから3.3Vが供給されています。そのため、このサイトの画像では5Vに接続していますが。実際に多くのデバイスでは3.3Vか、選択式になっていると思いますのでご注意ください。

IMG_4771_20150726
届いた液晶モジュール改(エナメル線で縛っただけ)

IMG_4772_20150726
裏面。サインスマートのURLの「sa」の付近にあるものがレギュレータでこれで5Vを3.3Vに変換している模様。なのでこのモジュールを買った場合(と言うかArduino向けSPI接続のモジュール全部?)は5V端子につなぎます。

ほかの配線は前回の液晶と同様、SCLがSCLK、SDAがMOSI、CSがCE.x RESがリセット、DCがRS信号となります。ただしココの表記は購入した液晶によって違うと思うので購入した液晶のデータシートで確認して下さい。

IMG_4773_20150726

接続したらこんな感じ。SPI接続なので5Vに接続されていることと、モジュールが違うこと以外は前回のものと変わりありません。

制御方法

この液晶コントローラは、初期化後、描画エリアを設定してデータを送ると設定された描画エリアに、設定した方向からデータを行方向に書き込んでいくという方法で、白黒液晶と違うところは、1ドットあたり2バイト以上のデータを必要とする所と、液晶のアドレスが横向きに1ドットずつ変化していくということです。

dataput

ざっくり言うと、そこら辺の画像データ形式と同じということですね。だからBMPデータもそのままのデータをそのまま転送できます。(ただし、色深度をあわせる必要はありますが。)

制御コマンドは前回までの上位ビットコマンド、その後設定値 というものではなく、8bit全コマンドの後に複数の設定値をデータとして流すというパターンになります。

画像データ本体の転送はRaspberry PiのSPI通信の場合転送バッファは4096バイト(4KiB)なので4KiBごとにデータを区切って転送する必要があります。例えば16bitカラーの場合は10回、18bit(24bit)の場合は15回転送することになります。

画像データの変換

この液晶のコントローラは12・16・18bitの色深度に対応しています。それぞれ4096色、65536色、262,143色の表示が可能です。

それぞれ、1.5バイト、2バイト、2.25バイトのデータ長ですので2バイトである16bitデータが使い勝手がいいように見えますが、16bitのBMPファイルは非公式で、Photoshopなどでは作れるようですがMSペイントでは作れません。なので24bitから変換するのが手っ取り早いと思います。

bit

  • 12bitの場合(一応)
    12bitカラーの場合は各色4bit 合計12bitで表示されます。
    この色の場合は1バイト目がRG・2バイト目がBと次のピクセルのR、次がGB…と関係が微妙なのと、流石に色数が少なすぎるのでこのモードは使いません。余程メモリが足りないマイコン以外は使う機会はないでしょう。
    しかし、僕らは8色や16色で頑張っていた頃や、256で何とかしていた頃もあるんだ。あの頃にくらべたら4096色なんてフルカラーみたいなもんだよな。
  • 16bit
    ちょっと昔のパソコンの標準的なカラーだった16bit。RとBが5bit、Gが6bitで表示され、最大65536色表示できるモード。ちなみに緑が1bit多いのは人間の目の特性によるもの。このモードだと1ドットあたり丁度2バイトで表現できるので扱いが簡単ですね。
    24bitを16bitに変換する必要がありますが、計算式でどうにかなるのでそこまで手間ではありません。ラズパイの場合は1GBもの広大なメモリがあるので気になりませんが、少ないメモリのマイコンでもメジャーなものはこのモードは最低表示できると思います。
  • 18bit
    携帯電話で使われていたことの多い26万色表示が可能なモードです。安い液晶の6bit+FRCのモニタも液晶パネル自体は18bitになっています。 このモードの場合は26万色表示できますので、8bitフルカラーの1600万色よりは劣りますが、比較的自然な表示が可能です。このモードの場合、一見一番中途半端なデータ長になると思われますが、このコントローラは18bitモードの場合、各色8bit転送の後、上位6bitのみ使用するという方法をとっているので、細かいことを気にしないのであれば24bitBMPファイルをそのまま転送すれば表示できるので実は一番楽な方法です。

というわけで今回は16bitと18bitを使う事を前提として話を進めていきます。

もしかしたら液晶モジュールによっては16bitのみの場合もあるとおもいますので、どちらが使えるかは液晶の仕様書を見て確認して下さい。流石に12bitモードのみというモジュールは現在新品で入手できるものは存在しないと思います。

コーディング

SPI接続の液晶なので、基本的なコードは白黒液晶のものをそのまま使えます。
というかほぼそのままで動くはずです。あとは初期化コードと転送作法をこの液晶に合わせてやればいいだけです。だけですが、せっかくなので液晶に合わせたコードにしたいと思います。

最初のライブラリインクルード~main変数までの部分は、以下のとおりに変更しました。

この液晶はSPIモード0、8bit、32MHzで初期化します。(転送速度は60MHzくらいまで対応しているみたい。ちなみに30fpsで15MHzくらい必要な模様。)

今回液晶のサイズの他に色深度と、コマンド転送関数のプロトタイプを宣言しています。

コマンド送信部の作成

前回のコマンドでは、データ送信とコマンド送信で分けましたが。今回の液晶は基本的にコマンド+設定値データ という仕様なので設定コマンド+データ送信関数、データ送信関数、コマンド送信関数。の3つに分けたいと思います。

まずコマンド・データ単体の送信関数を作成します。

といってもこれは変数名が変わっただけで前のものと同一です。
次に設定値のあるコマンドを送信するための関数を作成します。

これはコマンド1バイトと、設定値データのバイト数、可変引数にてその設定値を転送、
その受け取った設定値データを配列に突っ込んでそれをデータ転送コマンドに投げています。

その命令を用いて作成した液晶初期化関数がこちらになります。

設定値は液晶についてきたサンプルを参考にしました。

そしてこの後、main関数にてBMPを読み込んで…としますがもうすべてのプログラムを乗せますね。

BMPファイル読み込み→ヘッダを読み込み→ヘッダ情報からBMPファイルのフォーマットチェック。→その値にあわせて描画領域などを設定→液晶を初期化→必要なら16bitに変換→データ転送

という流れになっているはずです。

実行

コンパイル方法も以前の液晶と同じです。それをコンパイルしたものに以下の画像データを読み込ませた場合にトップ画像と同じ表示になると思います。

logoc

 

 

IMG_4769_20150726

 

少々駆け足で進めてきましたが、実際の扱いは結構簡単で特に書くことはないです。
注意しないといけないところは、液晶の仕様をよく理解してから使用するというところくらいで。
データも24bitBMPをそのまま転送することで表示ができますし。縦向きに8bitごとに区切られていることの多いモノクロ液晶と比べると多くの画像ファイルを展開後そのまま転送でき、エリア指定をすればそのままデータを流せばいいのでフォントデータの取り扱いも楽です。

だからもしかするとグラフィック液晶はモノクロ液晶を採用するより最初からカラーにしてしまったほうが楽かもしれません。Raspberry Piみたいなあまりメモリ容量の厳しくなく、演算能力も高いマイコンの場合は特に。

 

  • コンパイルなどでエラーが出ないのに当プログラムが動かない場合について
    このコードで最新のRaspberryPi用OSを利用すると日本語関係の処理で躓いてうまく動作しない場合があるようです。もしうまく動作しない場合はprintfで出力される文字をすべてアスキー文字(半角英数字)に変更してみてください。

“Raspberry Pi 2でカラーグラフィック液晶の制御” への10件のフィードバック

  1. 桐山建二 より:

    Sakura87 さま

     早速の御返答有難う御座います。更に、本編にも追加頂き有難う御座います。

    OSの日本語環境設定はPI2用OS(jessie 4.1.13)とPI2&3用(jessie 4.4.21)は同様な設定にしています。

    ロケール(言語と地域)の選択の①で「jp_JP.UTF-8 UTF-8」選択、更に
    ロケール(言語と地域)の選択の②で「jp_JP.UTF-8」を選択して決定しています。
    尚、Libre Office、Text Editor等は日本語環境で使用しています。

     当方では双方のOSで前の記事のようにLXterminal画面上での全角文字ので出来ませんでした。

    しかもPI2&3用(jessie 4.4.21)ではサインスマート!.8″LCDの表示の障害になっているようです。
    そのためにエラー発生の箇所が判読出来ず、其方にお訊ねする事になってしまい、ご迷惑をおかけしました。

      今後も宜しくお願い致します。         桐山建二

     

  2. 桐山建二 より:

    Sakura87 さま

     早速のアドバイス有難う御座いました。

     結論から申しますと、75行と77行と80行をコメントアウトしてコンパイルし直して正常に表示出来ました。
    しかし、新しいPI2&3用OS(jessi4.4.8又はjessie4.4.21)では全角でエラーになりPI2用OS(jessi4.1.13)
    ではエラーとならないのかは疑問がが残ります。

     PI2用OS(jessi4.1.13)で液晶への表示が上手く表示できても、モニターのLXterminalの全角表示(66行から72行)
    は全角文字は表示出来ません。勿論新しいPI2&3用OS(jessi4.4.8又はjessie4.4.21)でも同様です。

     今回は貴重なアドバイス有難う御座いました。

     今後も宜しくお願い致します。         桐山建二

    • Sakura87 より:

      桐山建二さま
      こん○○は

      表示できてよかったです。
      なるほど、日本語関係の処理で躓いていたのですね。
      ところで新しいOSの方は日本語環境の構築はお済でしょうか。
      もしまだでしたら日本語環境を構築することで改善がみられるかもしれません。

      一応このことは本編にも注釈として書き加えておきます。

      それでは。

  3. 桐山建二 より:

    Sakura87 さま

     早速の御返答有難う御座います。

    中国製の安価ななロジックアナザイラーが有りますが、殆ど使ったことがありません。
    倉庫から取り出してマニュアルを読んでいるところです。

    「http://tomosoft.jp/design/?p=7944」このサイトのサインスマート!.8″LCD
    表示は正常に表示できました。
    また、SPI接続のAD変換IC(MPC3204)を使った温度測定・表示もOKでした。

     WiringPiについてはPi3&3用(ファイル数274、サイズ1.3MB)とPi2用(ファイル数247、サイズ1.1MB)
    入れ替えてコンパイルしてみましたがNGでした。

     ロジックアナザイラーの勉強を兼ねて「正常動作」と「表示NG」を比較から始めてみようと思っています。

     もしお時間ありましたら引き続きアドバイスお願い致します。   桐山建二

    • Sakura87 より:

      桐山建二さま

      こん○○は。

      成功した例のプログラムと当方のプログラムを比較して関係のありそうな部分としては当方のプログラムの113行目にあります

      if(ret <0) exit(1);

      というところが関係してそうな感じです。

      これはエラーが出ていたらプログラムを終了するというコードなのですが。
      もしかするとSPIライブラリがエラーだった時の出力が変わっているのかもしれません。
      この行を削除もしくはこの前後に何らかのメッセージを表示する命令を追加して例えば以下のように変更してみてどうなるかを確認したほうがいいかもしれません。

      printf("TEST1");
      if(ret <0) exit(1);
      printf("TEST2");

      これでTEST1のみ出力されるのであればこの命令を削除してどうなるか、TEST2まで出力されるのであれば、恐らくBMPファイルの入出力がうまくいっていない可能性があります。
      このあたりも確認してみてください。

      それでは。

  4. 桐山建二 より:

    Sakura87 さま

     早速の御返答有難う御座います。

    使用している基板は「RaspberryPI2」で「OS(SDカード)」のみ差し替えて実行しています。
    尚、「RaspberryPI3」基板でも「OS、jessi4.4.21(Raspberry PI2&PI3用OS)」表示は出来ません。

    コンパイル「gcc -o SPI_Coloure SPI_Coloure.c -l wiringPi」は正常に終了しているようにみえます。
    実行「sudo ./SPI_Coloure ./logoc.bmp」の実行では液晶に全く何も変化が無く表示も無し。

    「WiringPi」が「Pi3」向けに変更された部分が良く分らないので「Gordon」さんのサイトから
    最新版ダウンロードしようと試みましたが、「’wiringPi’ already exists and is not a empty directory」
    と表示して入手出来ませんでした。

     更に続けてみる積もりですが、勝手なお願いですが、もしお時間ありましたら引き続きアドバイスお願い致します。

     桐山建二

    • Sakura87 より:

      お返事ありがとうございます。

      特に何のエラーもなく表示が行えない場合なのですが。そこまでの事態になるとそもそもSPIとdigitalWriteの命令で正常にI/Oが行われているかどうかというのをロジックアナライザなどで確認する必要があると思います。(ロジックアナライザがないのであればLEDが光るか・点滅するかどうかである程度代用ができると思います)

      それとWiringPiの入手ですが。gitコマンドで入手しているのであればこのあたりが参考になるかもしれません。

      http://blog.dksg.jp/2015/05/git-clone.html

      ただ、WiringPiはすでに1年近く更新されていないみたいなのであまり意味がない作業かと思われます。(そもそも入手の段階で失敗している可能性を考えるなら妥当ですが)

      ちなみにこのプログラム以外のSPIを制御するプログラム(できれば別の作者のもの)は正常に動作するのでしょうか?
      もし動作するのであれば当プログラムの問題、動作しないのであればOS側の問題となると思います。

  5. 桐山建二 より:

    この記事非常に参考になりました、有難うございました。

    「RaspberryPI2」上で「OS、jessi4.1.13(RaspberryPI2用OS)」でこのプログラム、
    「Raspberry Pi 2でカラーグラフィック液晶の制御」は綺麗に表示されます。

    「RaspberryPI2」上で「OS、jessi4.4.21(Raspberry PI2&PI3用OS)」でこのプログラム
    「Raspberry Pi 2でカラーグラフィック液晶の制御」表示できませんでした。

    何らかの対策ありましたら、お教え頂きたくメールいたしました。  桐山建二

    • Sakura87 より:

      コメントありがとうございます。

      新しいOSで等プログラムが動作しないとのことですが。

      どのあたりでエラーが出ているか、もしくはエラーが出ていないのか。コンパイルはできているのかなど、少々情報が少ないので断言できませんが。
      ラズペリーパイの開発元曰くPi2とPi3は互換性があるそうなので、動かないとすれば

       ・SPIのデバイス名が変わっていないか

      というのを一番に確認するべきだと思います。
      あとはSPIのI/O回りですが。こちらは微妙な仕様変更がなければOSのライブラリを直接叩いていますので問題があるとは考えられず。(ゼロとは言えないが高くはない)

      残る可能性としてはWiringPiがPi3向けに変更された部分が影響して対応しなくなったという可能性が考えられますので、digitalWriteなどのWiringPi固有の命令を標準I/Oに置き換えるなどしてみてどうなるかというところです。

      お役に立てれば幸いです。

コメントを残す

メールアドレスが公開されることはありません。